Введение в анализ и анализаторы в 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 позволяют эффективно индексировать и искать текстовые данные. Используя встроенные или создавая пользовательские анализаторы, можно адаптировать процесс обработки текста под конкретные задачи и улучшить качество поиска.