Поиск по сайту не находит «ноутбук» по запросу «лэптоп»? Или слово «смартфон» не возвращает результаты с «телефон»? Это типичная проблема стандартного анализатора Elasticsearch: он не понимает синонимов и языковой морфологии. Чтобы поиск работал как надо, мы разрабатываем кастомные анализаторы под ключ. За 5 лет мы настроили поиск для 50+ проектов, включая интернет-магазины и новостные порталы. Кастомный анализатор состоит из tokenizer и token filters. Они преобразуют текст в набор токенов для индекса. В этой статье разберём, как собрать такой анализатор для русского языка, настроить синонимы и автодополнение, а также рассмотрим типичные ошибки и способы их избежать.
До 70% пользователей не находят нужный товар из-за неправильной конфигурации анализатора. Это снижает конверсию на 20–30%. Настройка кастомного анализатора решает проблему за счёт подбора фильтров под вашу предметную область.
| Фильтр | Назначение | Пример токена |
|---|---|---|
lowercase |
Приведение к нижнему регистру | Ноутбук → ноутбук |
stop |
Удаление стоп-слов | на, в, с |
stemmer |
Стемминг | ноутбуки → ноутбук |
synonym |
Синонимы | ноутбук ↔ лэптоп |
edge_ngram |
N-граммы для автодополнения | ноут → н, но, ноу, ноут |
Почему кастомный анализатор лучше встроенного?
Встроенный russian анализатор использует алгоритм Snowball для стемминга. Для большинства задач этого достаточно, но если нужна точная морфология или нестандартный набор стоп-слов, создаём кастомный анализатор. Он даёт полный контроль над цепочкой фильтров: вы сами решаете, какие стоп-слова удалять, как обрабатывать синонимы и нужен ли стемминг. Кроме того, кастомная конфигурация позволяет добавить транслитерацию для поиска по транслиту (например, «noutbuk» → «ноутбук»).
Как настроить языковой анализатор для русского языка?
Базовая настройка
Пример настройки с настраиваемыми стоп-словами и полем для точного совпадения:
{ "settings": { "analysis": { "filter": { "russian_stop": { "type": "stop", "stopwords": "_russian_" }, "russian_stemmer": { "type": "stemmer", "language": "russian" }, "custom_stopwords": { "type": "stop", "stopwords": ["это", "также", "при", "для", "что", "как"] } }, "analyzer": { "russian_custom": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase", "russian_stop", "custom_stopwords", "russian_stemmer"] }, "russian_exact": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase"] } } } } } Добавление транслитерации
Пользователи часто вводят транслит: «noutbuk» вместо «ноутбук». Транслитерация реализуется через char_filter типа mapping, где каждой кириллической букве сопоставляется латинский аналог. Полный список сопоставлений приведён в документации — мы подключаем его в анализатор. Для продвинутой транслитерации используем плагин analysis-icu с ICU transformers, который корректно обрабатывает Unicode normalization.
Как настроить синонимы без переиндексации?
Синонимы позволяют находить документы по разным формулировкам. Есть два подхода:
| Параметр | Синонимы при индексации | Синонимы при поиске |
|---|---|---|
| Обновление | Требуется переиндексация | Без переиндексации, через _reload_search_analyzers |
| Производительность поиска | Быстрее (меньше токенов в запросе) | Медленнее (дополнительная обработка) |
| Гибкость | Низкая | Высокая |
Рекомендуемый вариант — синонимы при поиске. Они позволяют менять правила без переиндексации, что критично для интернет-магазинов с быстро меняющимся ассортиментом. Например, файл синонимов config/synonyms/synonyms.txt:
ноутбук, лэптоп, laptop, notebook смартфон, телефон, мобильный телевизор, тв, tv Конфигурация анализатора с синонимами (только для поиска):
{ "settings": { "analysis": { "filter": { "synonym_filter": { "type": "synonym", "synonyms_path": "synonyms/synonyms.txt", "updateable": true } }, "analyzer": { "search_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase", "russian_stop", "synonym_filter"] }, "index_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase", "russian_stop", "russian_stemmer"] } } } } } Флаг "updateable": true — обязательное условие для синонимов, применяемых только при поиске. Он позволяет перезагружать синонимы через _reload_search_analyzers без переиндексации. Экономия бюджета: вам не нужно перестраивать индекс каждый раз при изменении словаря.
Настройка автодополнения с Edge N-gram
Для автодополнения при вводе необходим анализатор с edge_ngram:
"filter": { "edge_ngram_filter": { "type": "edge_ngram", "min_gram": 2, "max_gram": 15 } } При поиске используем анализатор без N-gram (например, только lowercase), иначе поиск фрагмента «ноут» совпадёт со всеми N-gram-токенами, вызывая ложные срабатывания.
Многоязычные индексы
Два подхода: один индекс с полями для каждого языка или отдельный индекс на язык. Для мультисайтов удобнее один индекс:
"properties": { "title_ru": { "type": "text", "analyzer": "russian_custom" }, "title_en": { "type": "text", "analyzer": "english" }, "title_de": { "type": "text", "analyzer": "german" } } Запрос по нескольким языкам:
{ "query": { "multi_match": { "query": "search term", "fields": ["title_ru^2", "title_en", "title_de"] } } } Буст ^2 для русского поля — если основная аудитория русскоязычная.
Что входит в разработку и сроки
Мы предоставляем полностью готовое решение под ключ. Разработка включает:
- Анализ ваших данных и требований к поиску
- Проектирование цепочки фильтров под ваши задачи
- Настройка синонимов с возможностью онлайн-обновления
- Интеграция с существующим индексом
- Тестирование на реальных запросах (не менее 100 тестовых сценариев)
- Документация по настройкам и поддержке
- Обучение вашей команды (до 2 часов онлайн)
Разработка и тестирование кастомного анализатора под один язык — от 1 рабочего дня. Настройка синонимов с файлом и механизмом обновления — ещё полдня. Многоязычная конфигурация с 3–5 языками — 2–3 дня, включая тесты поисковой релевантности. Стоимость рассчитывается индивидуально.
Закажите настройку анализатора для вашего проекта — мы подберём оптимальную конфигурацию.
Как мы подходим к настройке
- Аудит текущего поиска — собираем логи запросов, выявляем проблемные сценарии.
- Проектирование анализатора — определяем набор фильтров, синонимов, стоп-слов.
- Прототипирование — разворачиваем тестовый индекс и проверяем на реальных данных.
- Тестирование — используем API
_analyzeдля проверки каждого фильтра. Например:
POST /products/_analyze { "analyzer": "russian_custom", "text": "Ноутбуки и лэптопы для работы" } Ответ содержит список токенов — их количество и вид должны соответствовать ожиданиям (стемминг обрезает окончания, синонимы расширяют токены). 5. Оптимизация — корректируем настройки по результатам тестов. 6. Внедрение — обновляем боевой индекс без даунтайма. 7. Мониторинг — после запуска отслеживаем метрики поиска (CTR, пустые результаты).
Почему стоит доверить настройку профессионалам?
Неправильная конфигурация анализатора может снизить релевантность поиска в 2–3 раза. Наши сертифицированные инженеры гарантируют, что после настройки поиск станет точным и быстрым. Получите консультацию по разработке анализатора — мы оценим ваш проект и предложим оптимальное решение. Свяжитесь с нами, чтобы обсудить детали.
Подробнее о анализаторах Elasticsearch.







