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