Налаштування Elasticsearch-синонімів для пошуку у 1С-Bitrix
Користувач шукає «мобільний телефон» — нічого. Вводить «сотовий» — теж порожно. Каталог переповнений смартфонами, але в назвах товарів використовується тільки слово «телефон». Синоніми в Elasticsearch — це зв'язка між користувацьким словником та реальними термінами в індексі. Без них полнотекстовий пошук працює тільки для тих, хто вгадав точне слово.
Де синоніми у ланцюжку Elasticsearch
Синоніми додаються як token filter в аналізатор. Вони можуть працювати двома способами:
Expansion — «мобільник» перетворюється на «мобільник телефон смартфон». Усі три токени потрапляють у запит. Видача ширша, але релевантність розмивається.
Contraction — «мобільник», «сотовий», «телефон» → усі перетворюються на «телефон». В індексі та в пошуку — один термін. Видача точна, але потрібна однорідність при індексації.
Для Bitrix-каталогу краще contraction на етапі пошуку: індексуємо як є, при пошуку схлопуємо синоніми в базову форму.
Файл синонімів та його формат
Синоніми зберігаються у файлі на сервері Elasticsearch або передаються inline в налаштування індексу. Файловий підхід гнучкіше — можна оновлювати словник без пересоздання індексу.
Файл /etc/elasticsearch/analysis/synonyms_ru.txt:
# Мобільні телефони
мобільник, сотовий, смартфон => телефон
iPhone, айфон => телефон
Galaxy, галакси => телефон
# Ноутбуки
ноутбук, лептоп, laptop => ноутбук
MacBook, макбук => ноутбук
# Брендові синоніми
Samsung, самсунг, самsung => samsung
LG, елджи => lg
# Загальні терміни
ТВ, телик, теле => телевізор
холодильник, холодос => холодильник
# Абревіатури
ПК, персональний комп'ютер => комп'ютер
ОЗУ, оперативка, RAM => пам'ять
Формат файлу: term1, term2, term3 => canonical_form для contraction, або term1, term2, term3 для expansion.
Налаштування індексу з синонімами
curl -X PUT http://localhost:9200/bitrix_search_s1 \
-H "Content-Type: application/json" \
-d '{
"settings": {
"analysis": {
"filter": {
"russian_stemmer": {
"type": "stemmer",
"language": "russian"
},
"russian_synonyms": {
"type": "synonym",
"synonyms_path": "analysis/synonyms_ru.txt",
"updateable": true
}
},
"analyzer": {
"bitrix_search": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"russian_stemmer",
"russian_synonyms"
]
},
"bitrix_index": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"russian_stemmer"
]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "bitrix_index",
"search_analyzer": "bitrix_search"
},
"body": {
"type": "text",
"analyzer": "bitrix_index",
"search_analyzer": "bitrix_search"
}
}
}
}'
Ключове: analyzer (для індексації) та search_analyzer (для пошуку) різні. Синоніми тільки у search_analyzer — це правильна практика. При індексації зайві токени не потрібні, розширюємо видачу тільки при пошуку.
Оновлення синонімів без переіндексування
Параметр updateable: true у фільтрі синонімів (Elasticsearch 7.3+) дозволяє оновити словник без пересоздання індексу:
# Редагуємо файл синонімів
nano /etc/elasticsearch/analysis/synonyms_ru.txt
# Перезаважуємо аналізаторів без переіндексування
curl -X POST "http://localhost:9200/bitrix_search_s1/_reload_search_analyzers"
Це працює тільки для search_analyzer. Якщо синоніми в index analyzer — потрібна повна переіндексування.
Синоніми через API (без файлу)
Для невеликих словників — inline-синоніми прямо в маппінгу:
"russian_synonyms": {
"type": "synonym",
"synonyms": [
"мобільник, сотовий => телефон",
"ноутбук, лептоп => ноутбук",
"телик, ТВ => телевізор"
]
}
Мінус: для оновлення потрібно пересоздати індекс та переіндексувати дані.
Перевірка роботи синонімів
# Перевірити, як search_analyzer обробляє запит
curl -X POST "http://localhost:9200/bitrix_search_s1/_analyze" \
-H "Content-Type: application/json" \
-d '{
"analyzer": "bitrix_search",
"text": "мобільник самсунг"
}'
# Очікуваний ответ: токени "телефон", "samsung"
Якщо синоніми працюють правильно, пошуковий запит «мобільник» знайде документи з токеном «телефон» в індексі.
Управління синонімами з Bitrix
Файл синонімів зручно редагувати через адміністративний інтерфейс. Для цього створити просту сторінку в /bitrix/admin/ з формою, яка записує у файл та викликає API _reload_search_analyzers. Стандартних інструментів для цього в Bitrix немає — потрібна користувацька розробка або ручне редагування через SSH.







