Нечеткий поиск в Elasticsearch

Задумывались ли вы когда-нибудь над тем, как поисковые системы, такие как Google, могут точно предсказывать ваши поисковые запросы по мере их ввода? Или исправлять опечатки в поисковых запросах? Нет, это не человеческое мышление.

Elasticsearch

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

Что такое нечеткость?

Нечеткость или нечеткая логика - это математическая логика, которая описывает, что истинность значения может находиться в диапазоне чисел от 0 до 1, где 1 означает абсолютную истину, а 0 - абсолютную ложь.

В отличие от булевой логики с двумя однозначными значениями: 0 и 1, нечеткая логика допускает переменный диапазон истинности и ложности.

Проще говоря, нечеткость описывает, насколько четким может быть значение. Возьмем, к примеру, опечатку. Как вы узнаете, что это опечатка? Вы оцениваете имеющиеся буквы и определяете, что пытались описать этим словом.

В нечеткой логике мы можем выразить это в диапазоне от 0 до 1. Если опечатка - helli, то она скорее описывает hello или hell, чем "human" или "tomato".

Нечеткий поиск в Elasticsearch

Нечеткий поиск на основе исходного запроса находит совпадающие значения по определенным критериям.

Elasticsearch реализует нечеткий поиск с помощью алгоритма расстояния редактирования Левенштейна.

Расстояние редактирования - это общее количество вариантов слов, таких как редактирование, удаление, замена или перенос исходного слова для достижения целевого слова.

Принцип работы нечеткого поиска в Elasticsearch

Алгоритм прост для понимания. Вначале вы берете два слова и сравниваете их последовательно, символ за символом.

Если символ отличается, то расстояние между словами увеличивается на единицу. Затем определяется конечное значение расстояния между буквами.

Нечеткий запрос Elasticsearch

Нечеткий запрос мало чем отличается от обычного запроса Elasticsearch. Чтобы использовать его, добавьте к поисковому запросу параметр fuzziness.

Также можно добавить максимальное расстояние Левенштейна для использования в запросе.

В приведенном выше примере мы запускаем нечеткий запрос для соответствия термину "Men's" и задаем пользовательское значение нечеткости.

Ниже приведен пример ответа:

Нечеткий запрос Elasticsearch

Если уменьшить расстояние редактирования, Elasticsearch ограничит расстояние поиска, что приведет к пропуску некоторых значений.

Например, следующий запрос с расстоянием редактирования 0,2 не даст никаких результатов.

Ответ на запрос выглядит следующим образом:

Нечеткий запрос Elasticsearch

Параметр Fuzziness в Elasticsearch

Как уже говорилось, параметр fuzziness в запросе задает максимальное расстояние редактирования по Левенштейну или количество правок.

Мы можем задать значения параметра fuzziness как: 0, 1, 2 или AUTO.

Если вручную задавать расстояние редактирования для нечетких запросов, можно пропустить некоторые результаты. Elasticsearch предоставляет значение auto, которое позволяет Elasticsearch определять расстояние редактирования.

Например:

Если установлено значение AUTO, Elasticsearch будет редактировать расстояние в зависимости от длины поискового запроса. Можно также указать низкое и высокое значения для auto в виде:

AUTO:[low] или AUTO:[high].

Чтобы понять, как работает нечеткость в Elasticsearch, ознакомьтесь с документацией.

Нечеткий мультизапрос

Вы можете использовать мультизапросы Elasticsearch с нечеткостью, как показано в примере запроса ниже:

Ответ на него следующий:

Нечеткий запрос Elasticsearch

Параметры нечеткого поиска в Elasticsearch

Параметры field и value являются обязательными при использовании нечеткого запроса в Elasticsearch. Другие параметры, такие как нечеткость, являются необязательными, но могут играть существенную роль в запросе.

Другие параметры включают:

max_expansions - контролирует количество создаваемых вариаций. По умолчанию он равен 60. Elasticsearch не рекомендует задавать большое значение max_expansions, так как это может привести к снижению производительности.

Transpositions - Определяет, будет ли расстояние редактирования включать транспозиции двух соседних символов. По умолчанию это значение равно true.

prefix_length - Задает количество начальных символов, которые необходимо оставить неизменными при расширении. По умолчанию это значение равно 0.

Rewrite - Устанавливает метод перезаписи запроса. По умолчанию установлено значение constant_core. Другие методы включают:

  • constant_core_boolean
  • scoring_boolean
  • top_terms_boost_N
  • top_terms_N
  • top_terms_blended_freqs_N

Не следует изменять метод переписывания, если вы не уверены в том, что делаете.

Заключение

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

Следует отметить, что нечеткие запросы в Elasticsearch - это нечто большее, чем рассмотрено в данном руководстве. Чтобы узнать больше, обратитесь к документации.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий