03.11.2023
Полнотекстовый поиск релевантных значений с помощью Elasticsearch
Что такое Elasticsearch
Elasticsearch — это распределенная система поиска и аналитики данных, основанная на Apache Lucene. Она отличается высокой производительностью, масштабируемостью и гибкостью при работе с большими объемами данных.
Кому может быть полезна статья
-
Разработчикам, которые используют или планируют использовать Elasticsearch для полнотекстового поиска в своих проектах.
-
Исследователям, которым интересны методы и подходы к полнотекстовому поиску с использованием Elasticsearch.
-
Аналитикам, которые работают с большими объемами текстовых данных и хотят научиться эффективно искать релевантные значения.
-
Бизнес-аналитикам и владельцам предприятий, которые хотят улучшить поиск и навигацию по своим данным для лучшего понимания пользовательских потребностей и требований.
-
Студентам и академическим работникам, которые изучают информационный поиск и хотят познакомиться с применением Elasticsearch для решения задач полнотекстового поиска.
Автор статьи не претендует на безоговорочное экспертное мнение в области работы с Elasticsearch, всё написанное ниже является субъективным опытом.
Рассматриваемый способ не привязан к какому-то конкретному языку программирования, но примеры в статье будут рассмотрены в контексте работы с PHP.
Чем может быть полезен Elasticsearch
Elasticsearch может быть полезен для разных типов организаций и проектов. Вот некоторые примеры:
-
Поиск и индексация. Elasticsearch может использоваться для выполнения сложных поисковых запросов и быстрого доступа к структурированной, полнотекстовой и географической информации. Он может быть использован для создания поисковых движков для веб-сайтов, систем управления контентом, журналов и многого другого.
-
Журналирование и анализ логов. Elasticsearch позволяет собирать, хранить и анализировать большие объемы журналов и событий. Он может помочь отследить проблемы, мониторить производительность и обеспечивать безопасность в режиме реального времени.
-
Бизнес-аналитика. Elasticsearch поддерживает агрегирование и анализ данных, что делает его полезным для выполнения сложных запросов и создания динамических отчетов и графиков. Он может быть применен для решения таких задач, как мониторинг маркетинговых кампаний, анализ взаимодействия с пользователями и прогнозирование рынков.
-
Машинное обучение. Elasticsearch может быть интегрирован с другими инструментами машинного обучения, что позволяет проводить анализ данных в реальном времени и обучать модели.
Рабочая среда
Для начала представим, что в рабочей среде уже установлен и настроен Elasticsearch хотя бы от 7-й версии:
- Почему от 7-й?
- Потому что начиная с 7-й версии разработчики значительно улучшили оптимизацию, благодаря чему «Эластик» стал менее «прожорливым» до RAM.
Контекст задачи
Реализация полнотекстового поиска по пользователям и проектам с выдачей релевантных результатов.
Обзор свойств и настроек индексатора
mappings — это процесс определения, как поля документа должны быть сохранены и индексированы в индексе Elasticsearch. Он описывает структуру данных, определяет типы полей (строковые, числовые, даты и т. д.) и их характеристики (анализаторы, индексирование и хранение данных).
В этом коде определяется схема индекса (mappings) для поля name. Внутри схемы указано, что тип поля — text, это означает, что текст будет анализироваться перед индексированием.
Также указан анализатор name_analyzer, который будет применяться к тексту при индексировании и поиске данных. Анализатор определяет, как текст будет разбиваться на отдельные токены, какие фильтры будут применяться и так далее.
Дополнительно указано, что для поля 'name' будет создано еще одно подполе keyword с типом keyword. Подполе keyword будет содержать неанализированную (оригинальную) версию значения поля name.
Такая структура mappings позволяет выполнять различные операции с текстовыми данными, в том числе полнотекстовый поиск и поиск по ключевым словам.
settings — это параметры конфигурации, которые определяют поведение и характеристики индекса или кластера. Настройки включают в себя параметры, такие как количество реплик, количество шардов, анализаторы, фильтры и другие опции, которые влияют на процесс индексирования и поиска данных.
В этом участке кода определяется секция 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-индексе.
Обзор свойств запроса
В этом коде определяется поиск в индексе по полю name. В секции query используется булев оператор should, который указывает, что результаты поиска могут соответствовать любому из указанных условий.
Первое условие использует match_phrase_prefix, что означает, что будет искаться точное соответствие запросу с возможностью префиксного совпадения. В данном случае поле name должно точно соответствовать запросу с возможностью префиксного совпадения с допустимым расстоянием slop, равным 2.
Второе условие использует match, и это означает, что будет искаться совпадение запроса с полем name без префиксного совпадения.
Таким образом, код определяет, что в индексе проводится поиск по полю name с использованием двух условий: точного соответствия с возможностью префиксного совпадения и совпадения без префикса.
Результаты
После переиндексации данных поиск стал выдавать ожидаемые результаты, к примеру:
Список запросов для поиска пользователей с Ф. И. О. Ахеджакова Лия и Крамаров Савелий:
Для Лии:
Лия А*
А* Лия
Ахеджакова Лия
Ахедж* Л*
в данном случае комбинаций будет большое количество
Для Савелия:
Савелий К
К Савелий
К* Са*
* - означает любое количество символов