Пользователь вводит 'ноутбук', а в каталоге товары с 'лэптоп' и 'notebook'. Без синонимов поиск теряет до 30% релевантных результатов — пользователь уходит к конкурентам. Мы настраиваем поиск по синонимам под ключ: от анализа словаря до деплоя и создания админки для управления. За время работы реализовали 15+ проектов с каталогами до 100 000 товаров, конверсия увеличилась в среднем на 15%. Окупаемость — 2–3 месяца.
Как синонимы влияют на релевантность поиска?
Поиск с синонимами увеличивает конверсию за счёт того, что пользователь находит нужный товар при любом запросе. Например, в магазине электроники клиент вводит 'наушники', а система находит 'headphones' и 'гарнитура'. Мы гарантируем максимальное покрытие каталога. Кейс: магазин бытовой техники с 80 000 товаров после внедрения синонимов увеличил конверсию с 3.2% до 4.8% (рост 50%).
Настройка синонимов в PostgreSQL
PostgreSQL FTS поддерживает thesaurus dictionary — файл с правилами замены слов при индексировании. Создаём файл thesaurus_ru.ths:
ноутбук лэптоп notebook : ноутбук смартфон телефон мобильник : смартфон наушники headphones : наушники Затем настраиваем конфигурацию поиска:
CREATE TEXT SEARCH DICTIONARY thesaurus_ru (
TEMPLATE = thesaurus,
DictFile = thesaurus_ru,
Dictionary = russian_ispell
);
CREATE TEXT SEARCH CONFIGURATION search_ru (COPY = russian);
ALTER TEXT SEARCH CONFIGURATION search_ru
ALTER MAPPING FOR asciiword, word, numword
WITH thesaurus_ru, russian_stem;После этого to_tsvector('search_ru', 'лэптоп Dell') вернёт 'ноутбук':1 'dell':2. Важно: при добавлении нового синонима нужно переиндексировать данные — это единственный минус подхода. Для статичных каталогов (например, магазин автозапчастей на 50 000 товаров) переиндексация занимает около 10 минут.
Настройка синонимов в Elasticsearch
Elasticsearch обрабатывает синонимы на лету — как при индексации, так и при поиске. Используем synonym token filter:
PUT /products
{
"settings": {
"analysis": {
"filter": {
"synonym_ru": {
"type": "synonym",
"synonyms_path": "synonyms_ru.txt",
"updateable": true
},
"russian_stemmer": {
"type": "stemmer",
"language": "russian"
}
},
"analyzer": {
"ru_with_synonyms": {
"tokenizer": "standard",
"filter": ["lowercase", "russian_stemmer", "synonym_ru"]
}
}
}
}
}С "updateable": true синонимы можно обновить без переиндексации через API: POST /products/_reload_search_analyzers. Для многословных синонимов (например, 'стиральная машина' ↔ 'стиралка') используем synonym_graph — он сохраняет позиции токенов при фразовом поиске.
Meilisearch: простые синонимы
Meilisearch поддерживает синонимы из коробки — просто передайте словарь через API:
import meilisearch
client = meilisearch.Client('http://localhost:7700', 'masterKey')
index = client.index('products')
index.update_synonyms({
'ноутбук': ['лэптоп', 'notebook'],
'лэптоп': ['ноутбук', 'notebook'],
})Никакой переиндексации — изменения применяются мгновенно. Идеально для проектов, где словарь часто меняется.
Почему Elasticsearch лучше подходит для динамических словарей?
Elasticsearch позволяет обновлять синонимы без переиндексации, поддерживает многословные синонимы и обладает высокой производительностью при больших нагрузках. Для интернет-магазинов с частыми изменениями ассортимента это оптимальный выбор.
Сравнение движков
| Параметр | PostgreSQL | Elasticsearch | Meilisearch |
|---|---|---|---|
| Тип синонимов | Индексация (статичные) | Индексация и поиск (динамические) | Поиск (динамические) |
| Переиндексация при изменении | Требуется | Не требуется | Не требуется |
| Мультисловные синонимы | Нет | Да (через synonym_graph) | Да |
| Управление через API | Нет | Частично | Да |
| Производительность при 1000+ групп | Средняя | Высокая | Высокая |
Типичные ошибки при настройке синонимов
| Ошибка | Последствия | Решение |
|---|---|---|
| Отсутствие учёта словоформ | Частичные совпадения пропускаются | Использовать стеммер/лемматизатор |
| Слишком много синонимов | Деградация скорости | Ограничить 1000 групп |
| Не учтена многозначность | Ложные срабатывания | Использовать контекстные синонимы |
Что выбрать для вашего проекта
Выбор движка зависит от размера каталога, частоты обновления словаря и бюджета на инфраструктуру. Если каталог статичен и не превышает 50 000 товаров — PostgreSQL будет достаточным. Для крупных интернет-магазинов с частыми сменами ассортимента лучше подходит Elasticsearch или Meilisearch. Мы помогаем подобрать оптимальное решение: анализируем нагрузку, тестируем скорость поиска и рассчитываем стоимость владения.
Процесс работы
- Анализ поисковых запросов и каталога — выявление частых синонимов и семантических связей.
- Составление словаря синонимов с учётом бизнес-терминологии и типовых опечаток.
- Настройка выбранного поискового движка (PostgreSQL/Elasticsearch/Meilisearch).
- Разработка API для управления словарём (admin-панель с возможностью загрузки CSV).
- Тестирование на реальных запросах — проверка релевантности и времени ответа.
- Деплой и документация для контент-менеджеров.
Что входит в результат
- Анализ поисковых запросов и каталога
- Составление словаря синонимов (импорт/экспорт)
- Конфигурация поискового движка
- API для управления синонимами и admin-панель
- Тестирование на реальных запросах
- Документация и обучение контент-менеджеров
- Поддержка при запуске
Сроки и стоимость
PostgreSQL thesaurus — от 1 дня. Elasticsearch с synonym_graph и админкой — 1–2 дня. Meilisearch — полдня. Стоимость рассчитывается индивидуально в зависимости от объёма каталога и сложности словаря. Экономия времени на поиске и рост конверсии окупают настройку за 2–3 месяца.
Свяжитесь с нами для аудита вашего поиска — мы подберём оптимальное решение и настроим словарь синонимов за 1–2 дня. Закажите настройку поиска по синонимам и получите консультацию по оптимизации поиска. Узнайте, как синонимы повысят конверсию вашего магазина.







