Analyzers

Тема дорожной карты · Elasticsearch

Анализатор в Elasticsearch — это конвейер обработки текста, преобразующий строку в токены, которые сохраняются в инвертированном индексе во время индексирования и применяются к строкам запросов во время поиска. Каждый анализатор состоит из трёх компонентов: символьного фильтра, предобрабатывающего исходный текст, токенизатора, разбивающего текст на отдельные термины, и нуля или нескольких фильтров токенов, нормализующих или дополняющих эти термины (например, приведение к нижнему регистру, стемминг или удаление стоп-слов). Elasticsearch поставляется со встроенными анализаторами: standard, english, whitespace и другими, а также позволяет определять пользовательские анализаторы в elasticsearch.yml или в настройках индекса в блоке analysis. Выбор правильного анализатора для поля типа text в маппинге критически важен для релевантности результатов полнотекстового поиска в Elasticsearch. Поведение анализатора можно проверить в любой момент с помощью API-эндпоинта GET /_analyze, не внося изменений в индекс.

Как это работает

Analyzers определяют типы полей + как они индексируются/анализируются. Dynamic mapping auto-detect-ит типы из первого документа — удобно, но опасно (строка "12345" становится long, потом ломается при реальной строке). Explicit mapping — то что вам нужно в prod. Типы полей: text (analysed, searchable, не aggregatable), keyword (exact, aggregatable, sortable), long/double, date, boolean, nested, geo_point. Analyzers обрабатывают текст: tokenize → filter (lowercase, stop words, stemming). Распространённые: standard, english, custom analyzers per язык.

Когда применять

Всегда explicit mapping в production — dynamic mapping делает один плохой doc отравлением индекса. Subfields: text поле с .keyword для search + aggregation. Analyzers per язык (russian analyzer для русского). Отключайте _source только с большой осторожностью — теряете возможность reindex.

Типичные ошибки

Ловушки Analyzers: dynamic mapping (первый weird doc ломает schema); только text — нельзя aggregate, нельзя сортировать; неправильный analyzer (English на русском → нет stemming, плохие результаты); слишком много полей ("field explosion" — > 1000 полей упирается в лимиты).

Связанные понятия

Полезные ресурсы