Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Неправильно работает поиск в Elasticsearch

#elasticsearch


Установил elastic. Настроил индексацию. Но в запросах какая-то странность выходит.
Никак не пойму почему поиск некорректно работает

Я делал запросы с помощью либы в ruby, и пенял на нее, однако когда отснифал запрос
понял что тут проблема в самом elastic. Да это даже не проблема, скорее фича. 

prod = Post.search "ра", fields: [:title] // На выходе n-элементов
prod = Post.search "разд", fields: [:title] // На выходе 0-элементов
prod = Post.search "раздел", fields: [:title] // На выходе n-элементов


Скорее всего где то надо найти настройку, которая позволит улучшить поиск. 
    


Ответы

Ответ 1



Скорее всего, это поведение анализатора. ES использует немного более сложную схему поиска, нежели привычное точное совпадение: При загрузке документа все текстовые поля пропускаются через анализатор, состоящий из токенайзера и фильтров Токенайзер бьет ввод на отдельные токены (как правило, это слова) Фильтры изменяют, добавляют и удаляют токены Токены записываются в конечный индекс При поиске запрос снова пропускается через анализатор, бьется на токены, и ES ищет совпадения между токенами запроса и токенами документа Я подозреваю, что проблема именно в этом - в ES существуют токены "ра" и "раздел", но не существует токена "разд". Скорее всего, дело именно в том, на какие токены разбивается запрос при поиске текущим анализатором. Чтобы проверить это, необходимо просмотреть токены совпадающих документов и токены запроса: curl -XGET :9200//_analyze -d '{ "text": "разд" }' curl -XGET :9200//_analyze -d '{ "text": "раздел" }' curl -XGET :9200//_analyze -d '{ "text": "<текст документа>" }' * В случае, если при поиске используется анализатор, отличный от анализатора индекса по умолчанию - скорее всего, вопрос это не подразумевает - его можно указать в поле "analyzer" * Токены документов можно получить напрямую из elasticsearch, но это немного сложнее Если вы использовали все настройки по умолчанию, то у вас стоит стандартный анализатор, который (во всяком случае, у меня) даст следующие результаты: Ра Разд Раздел (причем я смог добиться поиска по последним двум запросам, но даже при ненормально больших fuzziness ES отказася находить мне что-либо по "ра", что подталкивает к тому, что либо у вас все-таки нестандартный анализатор, либо я полностью забыл эластик) После этого вы можете посмотреть, как именно совпадает или не совпадает документ, с помощью explain API: curl -XGET :9200////_explain -d '{ "query": { "query_string" : { "query": "ра" } } }' * непосредственно запрос может отличаться и зависит от вашей библиотеки Таким образом вы сможете найти причину этого поведения самостоятельно - со стороны коммьюнити это почти невозможно, пока вы не привели mapping соответствующего индекса в ES, документы, которые совпадает по двум из трех запросов, непосредственно сам запрос, который передает библиотека и версию ES. Однако, насколько я понимаю, конкретно за этим вопросом стоит необходимость сделать автокомплит - в этом случае вам нужен не поиск внутри ES, а suggester completion - это немного другой функционал ES, который создан именно для реализации автокомплита.

Комментариев нет:

Отправить комментарий