Настройка Elasticsearch-анализаторов для поиска 1С-Битрикс
Поиск «ноутбук» не находит товар с названием «Ноутбуки ASUS». «Dizel» не находит «Дизель». Пользователь вводит «телефон самсунг» — нулевая выдача, хотя каталог полон Samsung-смартфонов. Это проблема анализаторов Elasticsearch: без правильной токенизации и нормализации индекс и поисковый запрос разговаривают на разных языках.
Как Битрикс подключается к Elasticsearch
Модуль search (класс Bitrix\Search\Elastic) использует клиент elasticsearch-php. Настройки подключения — в таблице b_option, группа search, ключ elastic_*. Индекс для поиска называется bitrix_search_[id_сайта] по умолчанию. Маппинг и настройки анализаторов передаются при создании индекса через API Elasticsearch.
Текущие настройки анализатора можно посмотреть:
curl -s http://localhost:9200/bitrix_search_s1/_settings | python3 -m json.tool
curl -s http://localhost:9200/bitrix_search_s1/_mappings | python3 -m json.tool
Анатомия анализатора
Анализатор в Elasticsearch — цепочка из трёх компонентов:
- Character filter — предобработка текста (удаление HTML, замена символов)
- Tokenizer — разбивка на токены (по пробелам, n-граммы, edge n-граммы)
- Token filters — трансформация токенов (lowercase, стемминг, синонимы, транслитерация)
Для Битрикс-каталога на русском нужен как минимум: стемминг русского языка (russian snowball), lowercase, ASCII-фолдинг (для транслитерации).
Создание индекса с правильными анализаторами
Битрикс позволяет переопределить маппинг через настройки модуля поиска. Но надёжнее создать индекс вручную с нужными анализаторами до переиндексации:
curl -X DELETE http://localhost:9200/bitrix_search_s1
curl -X PUT http://localhost:9200/bitrix_search_s1 \
-H "Content-Type: application/json" \
-d '{
"settings": {
"analysis": {
"filter": {
"russian_stop": {
"type": "stop",
"stopwords": "_russian_"
},
"russian_stemmer": {
"type": "stemmer",
"language": "russian"
},
"edge_ngram_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 20
}
},
"analyzer": {
"bitrix_russian": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"russian_stop",
"russian_stemmer",
"asciifolding"
]
},
"bitrix_autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"edge_ngram_filter"
]
}
}
}
},
"mappings": {
"properties": {
"body": {
"type": "text",
"analyzer": "bitrix_russian",
"search_analyzer": "bitrix_russian"
},
"title": {
"type": "text",
"analyzer": "bitrix_russian",
"fields": {
"autocomplete": {
"type": "text",
"analyzer": "bitrix_autocomplete",
"search_analyzer": "bitrix_russian"
}
}
}
}
}
}'
ASCII-фолдинг и транслитерация
Параметр asciifolding в цепочке фильтров решает часть проблем с кириллицей при смешанном вводе. Он преобразует é → e, ü → u. Но для полноценной транслитерации «Samsung» → «Самсунг» нужен кастомный char_filter с маппингом:
"char_filter": {
"translit_filter": {
"type": "mapping",
"mappings": [
"Samsung => Самсунг",
"Apple => Эппл",
"Asus => Асус"
]
}
}
Список маппингов для популярных брендов нужно формировать вручную под конкретный каталог — автоматического решения нет.
Тестирование анализатора
После создания индекса проверить, как анализатор токенизирует реальные запросы:
# Как индексируется слово
curl -X POST "http://localhost:9200/bitrix_search_s1/_analyze" \
-H "Content-Type: application/json" \
-d '{"analyzer": "bitrix_russian", "text": "Ноутбуки ASUS i5"}'
# Ожидаемые токены: ["ноутбук", "asus", "i5"]
# Стемминг "ноутбуки" -> "ноутбук" позволит найти запрос "ноутбук"
Переиндексация после смены анализатора
Смена анализатора требует полной переиндексации — существующие документы проиндексированы старым анализатором.
В административной панели Битрикс: «Поиск» → «Переиндексация». Для больших сайтов лучше через CLI-агент или cron:
php -f /var/www/bitrix/bitrix/modules/search/tools/reindex.php
Либо через API:
\Bitrix\Search\Elastic::reindexAll();
Полная переиндексация типового каталога на 50 000 товаров занимает 15–45 минут. В это время старый индекс работает — Битрикс поддерживает blue/green переиндексацию через временный индекс с последующим переключением алиаса.







