Внедрили Elasticsearch для интернет-магазина «Русгеоком» и ускорили поиск на сайте в 3 раза

Заказчик
Компания «РУСГЕОКОМ»
Задача
Переход с поиска Sphinx на Elasticsearch. Ускорение обработки поисковых запросов на сайте до 1 сек.

Мы уже рассказывали, как бесшовно перенесли фронтенд с Битрикса на Nuxt для интернет-магазина компании «Русгеоком» – российского производителя и ведущего поставщика геодезического оборудования и контрольно-измерительных приборов. После переработки фронтенда мы также внедрили поиск Sphinx, но уже тогда предположили, что рано или поздно, с ростом ассортимента магазина, придется перейти на Elasticsearch. И вот этот момент настал.

ЗАДАЧА

С поиском Sphinx сайт «Русгеоком» успешно работал с 2020-го года. Sphinx – легковесный поисковый движок с простой архитектурой, использующий SQL-базы и хорошо подходящий для форумов и небольших интернет-магазинов. А еще он интегрирован в «Битрикс», что позволило оперативно его развернуть. Однако к лету 2024 года все чаще стал подниматься вопрос о новом поисковом движке: ассортимент магазина вырос до 30000 позиций, а клиенту хотелось внедрить специфические бизнес-правила для поиска (например, поиск на основании позиции искомого слова в названии товара или раздела). На Sphinx такие гибкие настройки невозможно было реализовать, кроме того, упала скорость работы модуля поиска  —  движок перестал справляться с количеством товаров на сайте. Это было связано с тем, что расчет релевантности выполнялся на PHP, также у самого Sphinx была медленная индексация. Специалисты «Логемы» предложили заменить движок на Elasticsearch.

Ассортимент интернет-магазина растет: например, в разделе «Радиоизмерительные приборы» уже более 2300 позиций товаров

ПОЧЕМУ ELASTICSEARCH?

Главная причина перехода со Sphinx на Elasticsearch  —  необходимость ускорить поиск, отказавшись от расчета релевантности в PHP. Но у этого поискового движка есть и другие важные преимущества:

  • Удобство настройки и поддержки. Хорошо документированное API и простая интеграция через JSON-запросы облегчают работу для разработчиков и тех, кто будет поддерживать систему. Второе было особенно важно, поскольку с системой работают сотрудники клиента;
  • Расширяемость. Возможность добавления плагинов и новых правил без остановки работы поиска. Такие расширения помогают реализовать появляющиеся «хотелки» на лету: изменить конфигурацию, добавить поля и отправить на бой. Переиндексация производится вручную, либо агентом в Битрикс;
  • Настройка релевантности. Система позволяет тонко настраивать веса и правила. Например, сделать так, чтобы совпадение по модели товара повышало его позицию в выдаче. Мы добавили флаги для дополнительной настройки: «аксессуар», «в наличии», «архивный» и т.д.;
  • Улучшенные алгоритмы поиска. Есть фонетический поиск, исправляющий опечатки и ошибки транслитерации. Применение расстояния Левенштейна повышает полноту поиска за счет расчета минимального количества изменений между словами. Для лемматизации можно использовать внешние словари (в нашем случает это Hunspell), при необходимости синонимы добавляются вручную.

“Лемматизация – это приведение слова к его нормальной форме (лемме). Она помогает поиску понять, что, например, слова «лазерный» и «лазер» имеют общее семантическое значение, что делает механизм поиска чуть более восприимчивым. С похожей целью применяем фонетический поиск: каждое слово дополнительно преобразуется в фонему, которая одинаково работает и с кириллицей, и с латиницей. В нашем случае это касалось в основном названий брендов, правильного написания которых пользователи могут не знать: например, есть компания RGK, которую пишут и как RJK, и как РЖК. Кроме того, это также позволяет дополнительно увеличить полноту поиска и исправить мелкие опечатки в запросах, так слова «нивелир», «невелир», «невилир» преобразуются в одну и ту же фонему, что упрощает поиск. Наконец, расстояние Левенштейна – это алгоритм, который вычисляет минимальное расстояние от одного слова до другого. Например, «нивлир» отличается от «нивелир» на один символ, значит, это слово надо учитывать в выдаче. Допустимые расстояния можно настроить.“

Александр Песковацков,
backend-разработчик в компании «Логема»


РЕШЕНИЕ

В процессе внедрения Elasticsearch сфокусировались на двух основных моментах.

Во-первых, все сложные ресурсоемкие обработки должны происходить только в процессе индексации и переиндексации, а не во время поиска, как было раньше. Это избавляет систему от лишней нагрузки при пользовательских запросах. Соответственно, поля в индексах были настроены так, чтобы минимизировать манипуляции с входящей поисковой строкой и ускорить получение результата.

Во-вторых, за релевантность должен отвечать только поисковый движок. В коде не должно быть дополнительных вычислений – раньше мы здесь дополнительно рассчитывали веса. Для этого потребовалось реализовать объектно-ориентированный построитель запросов, передающий их в Elasticsearch в виде JSON-объектов, что позволяет работать с поисковой системой как с базой данных. В такую архитектуру легче вносить изменения и поддерживать её.

Структура построителя запросов

Процесс переезда с Sphinx на Elasticsearch проходил поэтапно.

1. Анализ существующего модуля поиска Sphinx.

За 5 лет работы поиска Sphinx на сайте в него вносились изменения на базе реального пользовательского опыта, важно было сохранить эти настройки. Специалисты «Логемы» провели анализ существующих правил работы поиска и задокументировали их, чтобы в точности перенести в новую систему Elasticsearch. 

2. Адаптация алгоритмов и правил под Elasticsearch.

Главной проблемой старого модуля, ведущей к замедлению работы и высоким нагрузкам на сервер, было вычисление релевантности при каждом поисковом запросе – не на стороне движка, а в PHP-коде. Сложность состояла в том, что у существующего модуля Sphinx и нового Elasticsearch отличаются методики расчета. Мы объединили в Elasticsearch имеющийся код на PHP и алгоритмы, реализованные на стороне Sphinx.

3. Развертывание и настройка Elasticsearch.

Благодаря контейнеризации (в Docker), Elasticsearch легко встроился в структуру проекта. Мы подобрали и установили плагины, настроили движок и прописали логины-пароли.

4. Написание модуля для Битрикс.

Задача включала как разработку и настройку поисковой системы, так и реализацию своей системы индексирования, поскольку мы не стали использовать Logstash. Система индексирования нужна для того, чтобы отлавливать изменения в товарных позициях и сразу передавать их в Elasticsearch без полной переиндексации. Кроме того, такое решение дало нам возможность написать собственные отдельные обработчики полей перед их загрузкой в Elasticsearch, что важно для будущей поддержки нашего решения. Специалистам на стороне клиента не потребуется изучать другие инструменты, достаточно будет разобраться с документацией Elasticsearch и нашим кодом на PHP. Это обеспечивает контроль над качеством кода.

РЕЗУЛЬТАТ

На переезд с Sphinx на Elasticsearch ушло четыре месяца (с сентября по декабрь 2024 года). В результате поиск по 30 000 товаров в 2 000 разделов ускорился в среднем в 3 раза. Раньше на обработку поискового запроса уходило 2-4 секунды, теперь – в пределах секунды.

Тестирование выполнялось через Postman, оба движка работали в одинаковых условиях на тестовом стенде

Благодаря сохранению основных алгоритмов поиска релевантность выдачи осталась на прежнем уровне, а гибкая настройка помогла дополнительно исправить неточности. 80% элементов в результатах остались теми же, в оставшихся 20% произошли незначительные изменения позиций, не повлиявшие на качество поиска.

Собственная система индексирования, реализованная на PHP, позволила легко интегрироваться с Битриксом и сделать обновление индекса динамическим. Теперь при обновлении/добавлении раздела или товара он сразу автоматически индексируется. Это снизило периодическую нагрузку на сервер.

“Поиск — одно из главных преимуществ интернет-магазина, особенно в высококонкурентной технологической B2B-нише. Современные поисковые движки выполняют функцию «умного поиска», остается только подобрать решение, которое обеспечит быструю выдачу результата, а его внедрение не растянется на полгода-год. В случае с интернет-магазином «Русгеоком» Elasticsearch стал удачной заменой классическому Sphinx. Новый поисковый движок в разы быстрее обрабатывает десятки тысяч товаров. Как результат, клиенты мгновенно находят нужный товар и экономят время, а интернет-магазин – увеличивает продажи и количество довольных покупателей.“

Олеся Кутузова,
менеджер проектов в компании «Логема»

Перейти на сайт

В карточку агентства

Письмо автору кейса

Пользуйтесь реальным опытом в IT и следите за успехами потенциальных подрядчиков и конкурентов
Подпишитесь на рассылку
Читайте также
Кейсы по теме#Авто, мото, спецтехника
Проекты компании Proactivity Group