16.02.2023

Elasticsearch для полнотекстового поиска и аналитики

Николай Курбатов, аналитик данных, Beltel Datanomics

 

Ранее в статье [1] мы упоминали о документно-ориентированном хранилище данных Elasticsearch. Этот продукт представляет собой гибкую и быструю поисковую систему. Но настройка Elasticsearch на получение релевантных результатов непростая задача. В данной статье команда Beltel Datanomics расскажет об основных настройках поиска Elasticsearch.

Что такое прямое и обратное индексирование документов?

Индексация – это процедура структурирования, запоминания информации (в нашем случае документов) в базе данных. Этот процесс необходим для оптимизации поисковых запросов.

В реляционных СУБД для этого создаются индексы, которые предоставляют собой путь для быстрого поиска данных на основе значений в этих столбцах. Структурой индексов в реляционных БД является сбалансированное дерево. И после индексации документа будет дерево, в котором листья – используемые в тексте слова. Однако, чтобы найти нужное слово потребуется обойти дерево. Это долгая операция для больших текстов или большой коллекции документов.

Вместо этого для поиска по документам лучше использовать обратную индексацию: составление списка слов с указанием в каких документах они встречаются. В отличие от прямой индексации в реляционных СУБД, процесс обратной индексации длиться дольше, зато время поиска намного меньше. Именно такой алгоритм реализован внутри Apache Lucene, на базе которого работает Elasticsearch.

Немного о движке Elasticsearch

Elasticsearch – open-source проект, предоставляющий широкий функционал для полнотекстового поиска и аналитики. Данный движок способен хранить, искать и анализировать большие коллекции документов, включая текстовые, численные и геоданные. За счет механизма обратной индексации, масштабируемости и поддержки многопоточности поиск происходит очень быстро. Настройка индексации и управление кластером происходит через REST API. Elasticsearch имеет широкую поддержку пользовательских библиотек, которые обеспечивают полную совместимость со многими языками программирования, такими как Python, Java, PHP и другими.

Аналогом таблицы в Elasticsearch является индекс, а процесс записи данных в БД – индексирование. Процесс создание таблицы, аналогом CREATE TABLE, является mapping. Каждая запись в базе данных является документом. Документ состоит из полей, которые имеют свои свойства: тип, анализатор и др.

Анализаторы текста в Elasticsearch

Главными функциональными блоками для индексации текстовых данных в Elasticsearch являются анализаторы. Анализаторы могут применяться не только к текстам во время записи в БД, но и к поисковым запросам. Анализаторы состоят из фильтров, токенизаторов, фильтров токенов (Рис.1).

Рисунок 1. Настройки индексирования текста

 

Фильтры нужны для нормализации поискового запроса. Ниже перечислены базовые фильтрации:

  • asciifolding – заменяет все Unicode символы, не входящие в Latin Unicode на их ASCII эквивалент;
  • html_strip – удаляет html-теги из текста.

Входной текст после фильтрации передается токенизатору. Токенизатор разделяет входной текст на отдельные токены (или термины). В Elasticsearch есть стандартный токенизатор standard, который токенизирует слова на основе грамматики соответствующего языка.

После разделения входного текста на токены они передаются на заключительный этап анализа – фильтрацию токенов. Цель этой фильтрации – приведение токенов к некоторой стандартной форме перед индексацией, поэтому данный этап значительно влияет на релевантность запросов. Фильтры могут изменять, исправлять ошибки, удалять, разделять токен на несколько других токенов. Далее перечислены несколько самых распространенных фильтров:

  • lowercase – преобразует все символы верхнего регистра в нижний;
  • stopwords – удаляет определенные токены (слова) перед индексированием;
  • snowball – приведение к стандартной форме слова (стемминг) с помощью алгоритма Snowball;
  • worddelimiter – разделяет токены, с нестандартными разделителями (например, когда предложения разделены не точкой и пробелом, а только точкой);
  • hunspell – стемминг токенов на основе словаря Hunspell (используется в Chrome, Firefox, требует подключение словаря);
  • synonym – проверяет является есть ли у этого слова синонимы, если да, то данные слова индексируются как синонимы.

Установка плагина для анализа морфологии русского языка

Помимо встроенного функционала индексирования текстов существуют готовые плагины. Например, существует open-source плагин анализатор морфологии русского языка [2]. Данный анализатор корректно выделяет начальную форму слова сразу из коробки. И вместе с другими фильтрами и анализаторами позволяет достичь хорошей релевантности запросов.

Чтобы установить этот плагин, нужно выбрать версию Elasticsearch (релиз 7.16.3 или 8.1.3), скачать архив elasticsearch-analysis-morphology-<version>.zip, перенести его в главную папку кластера Elasticsearch. После чего вызвать утилиту установки плагинов:

bash

Пример создания индекса

Ниже приведен пример задания настроек индекса для русскоязычных текстов:

Далее необходимо сделать mapping полей в индексе. Поля в индексе являются аналогом колонок в реляционных БД. Например, в документе поста содержатся следующие поля: дата и время публикации; заголовок; автор поста; контекст, текст поста.

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

При создании индекса для одного поля можно использовать несколько анализаторов, например, когда нужно искать и по подстроке, и по корням слов. Для этого нужно сделать два анализатора, проиндексировать токены каждым анализатором в отдельных полях multi-fields [3].

Заключение

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

Список литературы

[1]       https://datanomics.ru/artciles/open-source-tehnologii-dlya-razvitiya-meditsinskih-informatsionnyh-sistem/ 

[2]       https://github.com/nickyat/elasticsearch-analysis-morphology

[3]       https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

Оставьте заявку и получите бюджет и план внедрения наших решений в ваш бизнес

    Заполняя форму, Вы соглашаетесь с правилами обработки персональных данных.

    Мы используем файлы cookies, чтобы получать статистику и делать наш сайт и другие сервисы удобными для вас. Продолжая дальнейшее использование сайта и/или его сервисов, вы соглашаетесь с этим. Более подробную информацию можно прочитать в «Политика обработки персональных данных» и в «Политика Cookies»