Elasticsearch - нечеткий поиск не дает предложений - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь реализовать нечеткий / автозаполненный поиск в Elasticsearch через NodeJS. Я проиндексировал данные по индексу "artist". Вот пример хранимых данных в ES.

{
  "hits": [{
    "_index": "artist",
    "_type": "_doc",
    "_id": "EyejqnAB2pHGVJHwV53Q",
    "_score": 1,
    "_source": {
      "kind": "song",
      "artistId": 111051,
      "artistName": "Eminem",
      "trackName": "Crack a Bottle (feat. Dr. Dre & 50 Cent)",
      "collectionName": "Relapse (Deluxe Version)",
      "collectionCensoredName": "Relapse (Deluxe Version)",
      "artistViewUrl": "https://music.apple.com/us/artist/eminem/111051?uo=4",
      "collectionViewUrl": "https://music.apple.com/us/album/crack-a-bottle-feat-dr-dre-50-cent-feat-dr-dre-50-cent/1440558626?i=1440558826&uo=4",
      "trackViewUrl": "https://music.apple.com/us/album/crack-a-bottle-feat-dr-dre-50-cent-feat-dr-dre-50-cent/1440558626?i=1440558826&uo=4",
      "previewUrl": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview128/v4/da/a5/c1/daa5c140-2c3d-1f74-40c3-b6e596e52b82/mzaf_7480202713407880256.plus.aac.p.m4a",
      "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Music128/v4/c5/f8/fd/c5f8fdf6-d4c9-85c9-d169-c5d349a44f1c/source/100x100bb.jpg",
      "collectionPrice": 12.99,
      "releaseDate": "2009-02-02T12:00:00Z",
      "collectionExplicitness": "explicit",
      "trackExplicitness": "explicit",
      "discCount": 1,
      "discNumber": 1,
      "trackCount": 24,
      "trackNumber": 18,
      "country": "USA",
      "currency": "USD"
    }
  }]
}

Выше artistName имеет значение Eminem, и проблема в том, что когда я печатаю 'e', он ничего не показывает, то же самое на 'em', emi, emin. Когда я набираю emine, он начинает выдавать результаты. Куда я иду не так?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Существует несколько способов реализовать функцию автозаполнения, и нечеткий поиск не является правильным (в основном он используется для поиска связанных документов по токенам (de-dupe), а в проверке орфографии см. this для приложений нечеткого поиска).

В вашем случае, я бы предложил , используя запрос префикса , если ваш размер индекса не велик и ограничьте минимальную длину символа до два , т. е. не ищет e и показывает результаты поиска только тогда, когда пользователь набрал два или более символов ie em или emi, emin et c.

Рабочий пример

Отображение индекса

{
    "mappings": {
        "properties": {
            "artistName": {
                "type": "text"
            }
        }
    }
}

Индекс до c

{
   "artistName" : "Eminem"
}

{
   "artistName" : "Emiten"
}

Поисковый запрос

{
    "query": {
        "prefix": {
            "artistName": {
                "value": "em"
            }
        }
    }
}

Результат поиска

{
            "_index": "so-60558525-auto",
            "_type": "_doc",
            "_id": "1",
            "_score": 1.0,
            "_source": {
               "artistName": "Eminem"
            }
         },
         {
            "_index": "so-60558525-auto",
            "_type": "_doc",
            "_id": "2",
            "_score": 1.0,
            "_source": {
               "artistName": "Emiten"
            }
         }

Важно прочитать

Существует в целом четыре подхода, которые вы можете выбрать для реализации автозаполнения , и у каждого из них есть свой компромисс, который Вы должны знать, как оправдать свои функциональные требования, а также нефункциональные (производительность, обслуживание, трудности с реализацией).

Учитывая важность и наличие функции Autocomplete в современных поисковых системах, существует подробный блог , подробно описывающий все подходы и их компромисс.

0 голосов
/ 06 марта 2020

Запрос на совпадение возвращает документы, которые соответствуют предоставленному тексту, номеру, дате или логическому значению. Предоставленный текст анализируется перед сопоставлением. ex text: «это тест» со стандартным анализатором сохраняется как [«this», «is», «a», «token»] Текст, по которому вы ведете поиск, также будет разбит на токены, и эти токены будут сопоставлены.

Нечеткость: принимает один термин и находит все термины в словаре, которые находятся в пределах указанной нечеткости. Нечеткость по умолчанию - AUTO.

Ниже приведены значения для auto AUTO - он генерирует расстояние редактирования на основе длины термина. Для длин: 0..2 - должно точно соответствовать 3..5 - разрешено одно редактирование

5 - разрешено два редактирования

Таким образом, вы можете ищите «emine», так как расстояние редактирования равно 1

. Для реализации автозаполнения вы можете использовать 1. EdgeNgrams 2. Предложение о завершении

Ссылки для ссылки выше 1. Автозаполнение 2. Нечеткость

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...