Полнотекстовый поиск релевантных значений с помощью Elasticsearch

Полнотекстовый поиск релевантных значений с помощью Elasticsearch

Что такое Elasticsearch

Elasticsearch — это распределенная система поиска и аналитики данных, основанная на Apache Lucene. Она отличается высокой производительностью, масштабируемостью и гибкостью при работе с большими объемами данных.

Кому может быть полезна статья

1. Разработчикам, которые используют или планируют использовать Elasticsearch для полнотекстового поиска в своих проектах.

2. Исследователям, которым интересны методы и подходы к полнотекстовому поиску с использованием Elasticsearch.

3. Аналитикам, которые работают с большими объемами текстовых данных и хотят научиться эффективно искать релевантные значения.

4. Бизнес-аналитикам и владельцам предприятий, которые хотят улучшить поиск и навигацию по своим данным для лучшего понимания пользовательских потребностей и требований.

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

Автор статьи не претендует на безоговорочное экспертное мнение в области работы с Elasticsearch, всё написанное ниже является субъективным опытом.

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

Чем может быть полезен Elasticsearch

Elasticsearch может быть полезен для разных типов организаций и проектов. Вот некоторые примеры:

  • Поиск и индексация. Elasticsearch может использоваться для выполнения сложных поисковых запросов и быстрого доступа к структурированной, полнотекстовой и географической информации. Он может быть использован для создания поисковых движков для веб-сайтов, систем управления контентом, журналов и многого другого.
  • Журналирование и анализ логов. Elasticsearch позволяет собирать, хранить и анализировать большие объемы журналов и событий. Он может помочь отследить проблемы, мониторить производительность и обеспечивать безопасность в режиме реального времени.
  • Бизнес-аналитика. Elasticsearch поддерживает агрегирование и анализ данных, что делает его полезным для выполнения сложных запросов и создания динамических отчетов и графиков. Он может быть применен для решения таких задач, как мониторинг маркетинговых кампаний, анализ взаимодействия с пользователями и прогнозирование рынков.
  • Машинное обучение. Elasticsearch может быть интегрирован с другими инструментами машинного обучения, что позволяет проводить анализ данных в реальном времени и обучать модели.

Рабочая среда

Для начала представим, что в рабочей среде уже установлен и настроен Elasticsearch хотя бы от 7-й версии: — Почему от 7-й? — Потому что начиная с 7-й версии разработчики значительно улучшили оптимизацию, благодаря чему «Эластик» стал менее «прожорливым» до RAM.

Полнотекстовый поиск релевантных значений с помощью Elasticsearch

Контекст задачи

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

Обзор свойств и настроек индексатора

mappings — это процесс определения, как поля документа должны быть сохранены и индексированы в индексе Elasticsearch. Он описывает структуру данных, определяет типы полей (строковые, числовые, даты и т. д.) и их характеристики (анализаторы, индексирование и хранение данных) .

'mappings' => [ 'properties' => [ 'name' => [ 'type' => 'text', 'analyzer' => 'name_analyzer', 'fields' => [ 'keyword' => [ 'type' => 'keyword' ] ] ] ] ],

В этом коде определяется схема индекса (mappings) для поля name. Внутри схемы указано, что тип поля — text, это означает, что текст будет анализироваться перед индексированием.

Также указан анализатор name_analyzer, который будет применяться к тексту при индексировании и поиске данных. Анализатор определяет, как текст будет разбиваться на отдельные токены, какие фильтры будут применяться и так далее.

Дополнительно указано, что для поля «name» будет создано еще одно подполе keyword с типом keyword. Подполе keyword будет содержать неанализированную (оригинальную) версию значения поля name.

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

settings — это параметры конфигурации, которые определяют поведение и характеристики индекса или кластера. Настройки включают в себя параметры, такие как количество реплик, количество шардов, анализаторы, фильтры и другие опции, которые влияют на процесс индексирования и поиска данных.

'settings' => [ 'analysis' => [ 'analyzer' => [ 'name_analyzer' => [ 'type' => 'custom', 'tokenizer' => 'standard', 'filter' => ['lowercase', 'ngram'] ] ], 'filter' => [ 'ngram' => [ 'type' => 'ngram', 'min_gram' => 1, 'max_gram' => 20 ] ] ] ],

В этом участке кода определяется секция analysis в настройках Elasticsearch-индекса. Внутри секции analysis определены две подсекции: analyzer и filter.

В подсекции analyzer определен анализатор с именем name_analyzer. Анализатор имеет тип custom, это означает, что его параметры можно настроить самостоятельно. В данном случае анализатор использует токенизатор standard, который разбивает текст на токены на основе стандартных правил разбиения для английского языка. Далее применяются два фильтра: lowercase, который приводит все токены к нижнему регистру, и ngram, который разбивает токены на все возможные подстроки фиксированной длины (от одного до 20 символов) . Таким образом, анализатор разбивает текст на токены и создает n-граммы для каждого токена.

В подсекции filter определен фильтр с именем ngram'. Этот фильтр имеет тип ngram и настраивается с параметрами min_gram и max_gram. Параметр min_gram указывает минимальную длину n-граммы, а max_gram — максимальную. В данном случае установлены значения 1 и 20 соответственно, это означает, что будут создаваться n-граммы от одного символа до 20.

Таким образом, секция analysis определяет анализатор name_analyzer, который будет использоваться для разбиения текста на токены и создания n-грамм. Этот анализатор будет применяться при индексировании и поиске данных для поля name в Elasticsearch-индексе.

Обзор свойств запроса

'query' => [ 'bool' => [ 'should' => [ [ 'match_phrase_prefix' => [ 'name' => [ 'query' => $text, 'slop' => 2, ] ], ], [ 'match' => [ 'name' => [ 'query' => $text, ] ], ], ] ] ]

В этом коде определяется поиск в индексе по полю name. В секции query используется булев оператор should, который указывает, что результаты поиска могут соответствовать любому из указанных условий.

Первое условие использует match_phrase_prefix, что означает, что будет искаться точное соответствие запросу с возможностью префиксного совпадения. В данном случае поле name должно точно соответствовать запросу с возможностью префиксного совпадения с допустимым расстоянием slop, равным 2.

Второе условие использует match, и это означает, что будет искаться совпадение запроса с полем name без префиксного совпадения.

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

Результаты

После переиндексации данных поиск стал выдавать ожидаемые результаты, к примеру:

Список запросов для поиска пользователей с Ф. И. О. Ахеджакова Лия и Крамаров Савелий:

Для Лии:

Лия А* А* Лия Ахеджакова Лия Ахедж* Л*

и т. д. , в данном случае комбинаций будет большое количество

Для Савелия:

Савелий К К Савелий К* Са*

И т. п.

(— означает любое количество символов) *

33
Начать дискуссию