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

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

Наконец, расстояние Левенштейна – это алгоритм, который вычисляет минимальное расстояние от одного слова до другого. Например, «нивлир» отличается от «нивелир» на один символ, значит, это слово надо учитывать в выдаче. Допустимые расстояния можно настроить.❜❜
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 секунды, теперь – в пределах секунды.
Запрос | Было в Sphinx | Стало в Elasticsearch |
«нивелир» | 2,24 с | 0,8 с |
«комплект с оптическим нивелиром ргк» | 4,49 с | 1,1 с |
«манометр цифровой ргк» | 2,21 с | 0,9 с |
«шааген» (с ошибкой) | 2,17 с | 0,6 с |
Тестирование выполнялось через Postman, оба движка работали в одинаковых условиях на тестовом стенде
Благодаря сохранению основных алгоритмов поиска релевантность выдачи осталась на прежнем уровне, а гибкая настройка помогла дополнительно исправить неточности. 80% элементов в результатах остались теми же, в оставшихся 20% произошли незначительные изменения позиций, не повлиявшие на качество поиска.
Собственная система индексирования, реализованная на PHP, позволила легко интегрироваться с Битриксом и сделать обновление индекса динамическим. Теперь при обновлении/добавлении раздела или товара он сразу автоматически индексируется. Это снизило периодическую нагрузку на сервер.

менеджер проектов в компании «Логема»
Остались вопросы?
ул. Грушевская 10, 3 этаж
ИНН: 3460081999
КПП: 346001001
ОГРН: 1223400001208