Alfa Brain

Введение в анализ и анализаторы в Elasticsearch

Алексей ВечкановАлексей Вечканов   
Изображение статьи

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

Что такое анализ в Elasticsearch?

Анализ — это процесс преобразования текста в токены (отдельные слова или термины), которые затем индексируются для быстрого поиска. Этот процесс включает несколько этапов:

1. Фильтры символов: предварительная обработка текста, например, удаление HTML-тегов или замена специальных символов.

2. Токенизация: разбиение текста на отдельные токены.

3. Фильтры токенов: дополнительная обработка токенов, такая как приведение к нижнему регистру, удаление стоп-слов или стемминг (приведение слов к их корневой форме).

Чтобы понять процесс анализа и необходимость в нем в Elasticsearch, нам нужно немного глубже изучить создание инвертированного индекса (inverted index).

Когда Elasticsearch индексирует документы, процесс выглядит следующим образом:

Изображение статьи

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

Анализатор — это комбинация фильтров символов, токенизатора и фильтров токенов. Elasticsearch предоставляет несколько встроенных анализаторов:

Standard Analyzer: по умолчанию используется для большинства языков, разбивает текст на слова, удаляет пунктуацию и приводит к нижнему регистру.

Simple Analyzer: разбивает текст по пробелам и удаляет небуквенные символы.

Whitespace Analyzer: разбивает текст только по пробелам, сохраняя регистр и пунктуацию.

Stop Analyzer: аналогичен Simple Analyzer, но дополнительно удаляет стоп-слова.

Keyword Analyzer: не выполняет разбиение; весь текст рассматривается как один токен.

Настройка анализаторов

В дополнение к встроенным анализаторам, Elasticsearch позволяет создавать пользовательские анализаторы, комбинируя различные фильтры символов, токенизаторы и фильтры токенов. Это особенно полезно для специфических требований к анализу текста, таких как обработка нестандартных форматов данных или поддержка нескольких языков.

Пример работы анализаторов

Рассмотрим, как разные анализаторы обрабатывают текст:

Текст:

Elasticsearch is a powerful search engine.

1. Standard Analyzer (по умолчанию):

Описание: Разбивает текст на слова, удаляет пунктуацию и приводит к нижнему регистру.

Результат:

["elasticsearch", "is", "a", "powerful", "search", "engine"]

2. Simple Analyzer:

Описание: Разбивает текст по пробелам и удаляет небуквенные символы.

Результат:

["elasticsearch", "is", "a", "powerful", "search", "engine"]

3. Whitespace Analyzer:

Описание: Разбивает текст только по пробелам, сохраняя регистр и пунктуацию.

Результат:

["Elasticsearch", "is", "a", "powerful", "search", "engine."]

4. Stop Analyzer:

Описание: Удаляет стоп-слова (например, “is”, “a”), остальное обрабатывается как Simple Analyzer.

Результат:

["elasticsearch", "powerful", "search", "engine"]

5. Keyword Analyzer:

Описание: Не разбивает текст на токены. Всё сохраняется как один токен.

Результат:

["Elasticsearch is a powerful search engine."]

6. Custom Analyzer:

Допустим, настроен пользовательский анализатор, который:

• Удаляет HTML-теги.

• Разбивает текст по пробелам.

• Приводит к нижнему регистру.

• Удаляет стоп-слова.

Текст:

<p>Elasticsearch is a powerful search engine.</p>

Результат:

["elasticsearch", "powerful", "search", "engine"]

Пример в Elasticsearch с использованием API

У есть Elasticsearch специальный API который позволяет увидеть результат анализа.

POST /_analyze
{
  "analyzer": "standard",
  "text": "Elasticsearch is a powerful search engine."
}

Ответ (Standard Analyzer):

{
  "tokens": [
    { "token": "elasticsearch", "start_offset": 0, "end_offset": 13, "type": "<ALPHANUM>", "position": 0 },
    { "token": "is", "start_offset": 14, "end_offset": 16, "type": "<ALPHANUM>", "position": 1 },
    { "token": "a", "start_offset": 17, "end_offset": 18, "type": "<ALPHANUM>", "position": 2 },
    { "token": "powerful", "start_offset": 19, "end_offset": 27, "type": "<ALPHANUM>", "position": 3 },
    { "token": "search", "start_offset": 28, "end_offset": 34, "type": "<ALPHANUM>", "position": 4 },
    { "token": "engine", "start_offset": 35, "end_offset": 41, "type": "<ALPHANUM>", "position": 5 }
  ]
}

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

Работа с Kibana

Когда текст (например, логи или сообщения) поступает в Elasticsearch, он проходит через процесс анализа:

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

2. Индексация: Токены сохраняются в структуре, оптимизированной для быстрого поиска. Это позволяет мгновенно находить документы, содержащие нужные токены.

Когда пользователь вводит поисковый запрос в Kibana:

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

2. Поиск совпадений: Elasticsearch ищет документы, содержащие один или несколько токенов из поискового запроса.

3. Сортировка: Найденные документы сортируются по заданным критериям, например, по времени, если речь идет о логах.

Этот подход делает Elasticsearch невероятно быстрым и эффективным инструментом для поиска. Пользователи Kibana могут находить нужные логи даже при частичных совпадениях слов, а сортировка по времени помогает быстро увидеть последние события.

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

Заключение

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



Поделиться: