Назад в блог

Мы три раза переделывали поиск. Автокомплит дал больше, чем первые два вместе

Мы три раза переделывали поиск на одном проекте.

Первый раз — ранжирование. Сделали field boost по названию, артикулу, категории. Стало лучше.

Второй раз — морфология и синонимы. Добавили 180 пар, подключили Russian analyzer от ICU. Конверсия из поиска выросла ещё.

Потом я открыл аналитику и увидел кое-что, о чём мы не думали: 43% конверсий из строки поиска происходили без нажатия Enter. Пользователи кликали на подсказку в выпадающем списке. И уходили на страницу товара напрямую.

Третий раз мы переделывали автокомплит.

Сколько конверсий происходит до Enter

В русскоязычном e-commerce об этом почти не говорят — тема выглядит как «фича», а не как «метрика». Но когда вы смотрите на путь пользователя от строки поиска до покупки, автокомплит — это отдельный воронки со своим conversion rate.

На нашем проекте с 28k SKU мы разделили события: search_submit (пользователь нажал Enter или кнопку «Найти») и suggestion_click (пользователь кликнул на подсказку). Три месяца наблюдений показали: 41–45% сессий, которые начинались с поиска и заканчивались покупкой, проходили через suggestion_click. Enter эти пользователи не нажимали вообще.

Это значит: почти половина поисковых конверсий шла через интерфейс, который мы не оптимизировали два года.

Промышленные данные подтверждают похожие цифры — Elasticsearch и Algolia публикуют данные о 35–45% сессий с выбором из саджеста. Но это средние по больнице. Конкретный проект может давать и 60%, если ассортимент узкий и предсказуемый.

Что обычно делают с автокомплитом

Большинство Bitrix-магазинов идут одним из двух путей.

Первый — встроенный поиск Bitrix с AJAX-саджестом на основе SQL LIKE. Работает плохо: нет морфологии, нет ранжирования, нет учёта остатков. Пользователь видит случайные подсказки, часто нерелевантные.

Второй — Elasticsearch с базовым match_phrase_prefix. Технически лучше, но по умолчанию ранжирование там алфавитное или по _score без бизнес-контекста. В итоге в топе саджестов оказываются товары с «правильным» текстом, а не те, что хорошо продаются.

Оба варианта смотрят на автокомплит как на «помощь с вводом текста», а не как на конверсионный инструмент.

Completion Suggester против Phrase Suggester

Elasticsearch предлагает несколько механик для автокомплита. Два самых распространённых — Completion Suggester и Phrase Suggester.

Completion Suggester работает по prefix: пользователь пишет «карт» — саджест предлагает все варианты, которые начинаются с «карт». Самый быстрый вариант. Работает из отдельной структуры данных в памяти, latency около 5–15ms. Не умеет в морфологию и опечатки. «Карточ» вместо «карточка» — ноль результатов.

Phrase Suggester работает по похожим фразам с учётом статистики совместной встречаемости термина в индексе. Медленнее, но умеет предлагать исправления опечаток. Хорошо работает для «исправить ошибку», плохо — для «угадать что хочет пользователь по первым буквам».

На практике мы пришли к гибридному подходу: Completion Suggester для prefix-suggestions (быстро, из памяти), а multi_match с fuzziness: AUTO для фолбека, когда prefix не дал результатов. Пользователь в большинстве случаев видит мгновенные подсказки, и только при нетипичном вводе — чуть более медленный fuzzy-поиск.

Ещё одно наблюдение: русская морфология в саджесте требует отдельного подхода. Нормальный текстовый analyzer работает с полными словами, но Completion Suggester принимает данные как есть. Мы добавляли несколько форм слова в поле suggest при индексации — и по именительному, и по родительному падежу для ключевых слов.

Как приоритизировать подсказки

Самая интересная часть — не технология, а то, что попадает в топ саджеста.

По умолчанию Elasticsearch ранжирует Completion Suggester по полю weight. Мы сделали это поле составным: считали его при индексации как функцию от трёх параметров.

Первый — популярность запроса: сколько раз за последние 30 дней пользователи кликали на эту подсказку. Это самый сильный сигнал.

Второй — наличие на складе: если товара нет, его вес в саджесте снижался вдвое. Нет смысла вести пользователя на страницу с «нет в наличии».

Третий — маржа: категории с высокой маржой получали небольшой буст. Небольшой — потому что агрессивный буст по марже разрушает релевантность, и пользователи это чувствуют.

Пересчёт весов — раз в сутки через cron, параллельно с основным переиндексированием. Дополнительные 8 минут к job, но зато саджест всегда актуален.

Что изменили и что получили

До изменений саджест работал на Completion Suggester с весами по популярности запроса — без учёта остатков и маржи. Подсказки технически правильные, но коммерчески нейтральные.

После: добавили три компонента в weight-расчёт, переиндексировали саджест-поле с несколькими формами слова, ввели мониторинг suggestion_click как отдельного события.

Результаты за первые шесть недель:

  • suggestion_click как доля от всех поисковых сессий: с 38% до 52%
  • Конверсия из suggestion_click: +11% относительно базы (пользователи, кликавшие на саджест, раньше покупали немного реже, чем те, кто печатал запрос полностью — после изменений разрыв исчез)
  • Доля показов товаров «нет в наличии» в топ-5 подсказок: с 22% до 4%

Самый неожиданный эффект: снизилось количество «пустых» сессий поиска. Это когда пользователь набирал запрос, не находил нужное и уходил. Хороший саджест помогает сформулировать запрос точнее до отправки — пользователь видит рабочие варианты ещё в процессе ввода.

Одна вещь, которую точно не стоит делать

ML-саджест без данных хуже, чем никакого.

Несколько раз слышал от команд: «Давайте обучим модель на поведении пользователей и будем предсказывать намерение». Звучит красиво. Но если у вас меньше нескольких миллионов поисковых событий в месяц, ML-модель будет переобучена на редких паттернах и сломает ожидаемое поведение.

Правило, которое работает: сначала собирайте данные (события кликов, конверсий из поиска, zero-results). Через три месяца будет видно, что реально важно для вашего каталога. После этого можно думать о более сложных механиках.

До тех пор — Completion Suggester с разумными весами и хорошим индексированием. Это решает 80% проблем.

Итог

Автокомплит — не «удобная фича». Это отдельный конверсионный путь, который работает параллельно с основным поиском.

Если вы используете Elasticsearch и никогда не смотрели на suggestion_click как на отдельную метрику — добавьте это событие в аналитику прямо сейчас. Через месяц будет понятно, насколько большой этот канал у вас.

Про то, как мы вообще пришли к Elasticsearch на e-commerce проекте — в статье Elasticsearch — это не «база со скоростью». Это UX-инструмент. А про работу с нулевыми результатами поиска как с продуктовым сигналом — здесь.