Налаштування Elasticsearch-аналізаторів для пошуку у 1С-Bitrix
Пошук «ноутбук» не знаходить товар з назвою «Ноутбуки ASUS». «Дизель» не знаходить «Дизель». Користувач вводить «телефон самсунг» — нульова видача, хоча каталог переповнений Samsung-смартфонами. Це проблема аналізаторів Elasticsearch: без правильної токенізації та нормалізації індекс та пошуковий запит розмовляють різними мовами.
Як Bitrix підключається до 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, стемінг, синоніми, транслітерація)
Для Bitrix-каталогу російською мовою потрібен як мінімум: стемінг російської мови (russian snowball), lowercase, ASCII-фолдинг (для транслітерації).
Створення індексу з правильними аналізаторами
Bitrix дозволяє перевизначити маппінг через налаштування модуля пошуку. Але надійніше створити індекс вручну з потрібними аналізаторами до переіндексування:
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"]
# Стемінг "ноутбуки" -> "ноутбук" дозволить знайти запит "ноутбук"
Переіндексування після змін аналізатора
Зміна аналізатора потребує повної переіндексування — існуючі документи індексовані старим аналізатором.
В адміністративній панелі Bitrix: «Пошук» → «Переіндексування». Для великих сайтів краще через CLI-агент або cron:
php -f /var/www/bitrix/bitrix/modules/search/tools/reindex.php
Або через API:
\Bitrix\Search\Elastic::reindexAll();
Повна переіндексування типового каталогу на 50 000 товарів займає 15–45 хвилин. На цей час старий індекс працює — Bitrix підтримує blue/green переіндексування через тимчасовий індекс з подальшим переключенням алеаса.







