Когда Elasticsearch не нужен: честный разбор для e-commerce на Bitrix
Я написал статью про то, почему Elasticsearch — это UX-инструмент, а не просто скорость. С тех пор три клиента спросили одно и то же.
Поиск по каталогу с точки зрения выручки: маппинг Elasticsearch, синонимы и русская морфология, опечатки, фасеты, автокомплит, переиндексация без простоя и логи запросов без результатов. И случаи, когда хватает SQL.
14 статей
Я написал статью про то, почему Elasticsearch — это UX-инструмент, а не просто скорость. С тех пор три клиента спросили одно и то же.
Нам предложили добавить vector search к каталогу. 40 000 SKU, Elasticsearch уже стоит. Fuzzy настроен. Синонимы работают. Function_score буст по марже и остаткам — тоже.
Когда мы решили добавить русскую морфологию в индекс с 80 000 товаров, я понял, что у нас нет плана.
Три недели мы не могли понять, почему фильтр по цене не работает. Elasticsearch был жив. Запросы приходили. Результаты возвращались. Но диапазон цен от 1000 до 5000 рублей игнорировался полностью: в выдаче появлялись товары за 12 000 и за 300 рублей одновременно.
Мы провели A/B-тест. Контроль — поиск сортировал по текстовой релевантности. Вариант — по функции, которая учитывала маржу, остаток и скорость оборота. Кликабельность — почти одинаковая. Выручка с поискового сеанса — на 12% выше в варианте с бизнес-ранжированием.
Клиент спросил: «Что ищут наши покупатели?» Я открыл Elasticsearch и вытащил топ-40 поисковых запросов с нулём результатов за прошлую неделю. Среди них — три точных названия товаров, которые были в наличии. Просто записаны иначе, чем в каталоге.
Мы три раза переделывали поиск на одном проекте.
Нулевые результаты — красный флаг в дашборде. Их сразу видят. О них сразу пишут задачи.
Покупатель ввёл запрос, нашёл нужный товар, кликнул — и увидел «нет в наличии». Ушёл. Написал в поддержку: «у вас сломан поиск». Я открыл логи — поиск работал правильно. Он показывал то, что было в индексе час назад. Проблема не в Elasticsearch. Проблема в том, что мы не подумали, как часто он должен узнавать о переменах.
После трёх недель настройки Elasticsearch — шарды, реплики, mapping, кастомный токенайзер — мы разобрались с нечёткостью: добавили fuzziness AUTO и zero-results упали с 22% до 11%. Хорошо. Но 11% покупателей по-прежнему уходили ни с чем. Я полез в логи и обнаружил: большинство из этих запросов не были опечатками. Это были синонимы.
Первый нетривиальный запрос после запуска нового поиска на каталоге в 28 000 SKU: «самсунк телефон».
Мы добавили Elasticsearch в каталог на 28 000 SKU и решили, что дело сделано. Поиск работает, товары находятся, скорость нормальная. Через месяц я открыл аналитику поиска — конкретно логи no-results запросов.
Фильтр по цвету был. Он стоял двадцать вторым в боковой панели.
Мы потратили три недели на Elasticsearch. Первые две — на инфраструктуру: mapping, шарды, репликация, анализаторы для русской морфологии. Технически всё работало.