Включить автозаполнение запросов в ElasticSearch - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь создать индекс ElasticSearch, который будет содержать документы с названиями продуктов, например ноутбуков -

{ "name" : "Laptop Blue I7"}

Тогда я хочу использовать его для предложения автозаполнения, запрашивая индекс ES. У меня есть 2 основных ограничения:

  1. Синонимы названия могут быть -

Я хочу определить синонимы для таких терминов, как «Блокнот» для «Ноутбук» Загруженные документы могут быть следующего вида -

"Laptop Blue I7"
"Laptop Blue I7"
"Laptop Blue I7"
"Laptop Blue I7"
"Laptop Red I7"
"Laptop Red I7"
"Notebook Blue I7"

Теперь я добавляю следующие параметры и файл сопоставления при создании индекса -

{
  "settings": {
    "index": {
      "analysis": {
        "filter" : {
                    "synonym" : {
                        "type" : "synonym",
                        "synonyms" : ["Laptop,Notebook"]
                    }
                },
        "analyzer": {
        "synonym" : {
                        "tokenizer" : "keyword",
                        "filter" : ["synonym"]
                    }
}}}}, 
"mappings": {
    "catalog": {
      "properties": {
        "name": {
          "type": "text",
          "analyzer": "synonym"
        }
      }
    }
  }
}

  1. Запрос -

Когда я запрашиваю данные с помощью «Записной книжки», предпочтительный ответ должен быть упорядочен по частоте и синониму. Однако, когда я запрашиваю, ответ обычно не зависит от синонима и частоты. Я использую следующий запрос -

/_search
{"query": {
        "query_string" : {"default_field" : "name", "query" : "Notebook"}
            } }

Ответ, который я получаю, -

"Notebook Blue I7"

Хотелось бы, чтобы ответом было одно из следующих:

"Laptop Blue I7"
"Laptop Red I7"

или

"Notebook Blue I7"
"Laptop Blue I7"
"Laptop Red I7"

Любое понимание в решении этого было бы полезно. Спасибо

======== Изменить 1:

Когда я использую \_analyze на «Записной книжке», ответ будет

{'tokens': [{'end_offset': 3,
             'position': 0,
             'start_offset': 0,
             'token': 'Notebook',
             'type': '<ALPHANUM>'},
            {'end_offset': 3,
             'position': 0,
             'start_offset': 0,
             'token': 'Laptop',
             'type': 'SYNONYM'}]}

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Проблема с вашим keyword токенизатором, который вы использовали в своем synonym анализаторе. Пожалуйста, сделайте следующее для устранения проблемы.

  1. Проверьте токены, сгенерированные для совпавших и несопоставленных документов, используя анализ API.

  2. Используйте объяснение API, чтобы понять, как его сгенерированные токены и как он сопоставляется с вашим инвертированным индексом.

Если токены, сгенерированные для ваших документов в инвертированном индексе, совпадают с токенами, сгенерированными по вашему поисковому запросу, тоasticsearch покажет, что оно соответствует, и запрос объяснения даст много другой информации, например, сколько документов в сегменте соответствует поисковому запросу и его запросу. оценка и т. д.

Выше приведены лишь самые основные шаги для устранения проблемы, но вы не внедрили правильный поиск автозаполнения, который, в свою очередь, должен возвращать результаты для note и lapt в вашем случае. Для этого вам нужно использовать edge n gram анализатор и этот официальный пост ES может помочь вам реализовать это.

Дайте мне знать, если у вас возникли какие-либо другие проблемы или вам нужны какие-либо разъяснения.


1 голос
/ 28 мая 2019

Как уже упоминал Амит, для реализации автозаполнения edge n gram стоит подумать. Я хотел бы объяснить, почему настройка, которую вы использовали, не работала для полного слова Notebook, которое при запросе не давало ожидаемого результата. Для этого давайте разберемся, как работает анализатор выше.

Анализатор synonym, определенный в настройках, состоит из двух компонентов: tokenizer и токена filter. Сначала для входной строки будет применен токенизатор. Выходные данные токенизатора будут токенами. Затем они будут действовать как ввод токена filter и приведут к окончательному набору токенов.

Подробнее о работе анализатора можно прочитать здесь .

Теперь давайте рассмотрим первый, например. Laptop Blue I7

Для этой входной строки сначала будет применен токенизатор keyword, и, как вы, возможно, знаете, ключевое слово токенайзер берет входную строку и генерирует один токен, который является той же самой входной строкой, без каких-либо изменений. Таким образом, вывод токенизатора будет Laptop Blue I7 в виде одного токена. Теперь этот токен будет действовать как вход для фильтра synonym. Согласно определению, Laptop и Notebook являются синонимами, но ни один из них не соответствует токену Laptop Blue I7, поэтому в конечном итоге этот фильтр ничего не будет делать и будет передавать токен как есть. Таким образом, окончательный сгенерированный токен будет Laptop Blue I7.

Таким образом, при поиске Notebook он не будет соответствовать документу со значением name, как указано выше.

Обратите внимание, что если строка ввода просто Laptop или Notebook, вы получите ожидаемые токены, потому что ключевое слово tokenizer будет генерировать токен из одного слова для ввода. Вот почему _analyze в «Блокноте» дает ожидаемый результат.

Итак, вывод состоит в том, что keyword является виновником здесь. Чтобы решить эту проблему, нам нужен токенизатор, который будет генерировать отдельные токены как laptop, blue, i7. Самый простой способ решить эту проблему - использовать standard вместо keyword.

Работа с синонимом из нескольких слов

Этот ответ может помочь вам.

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