Хроники Битрикса: интеграция с Elasticsearch
Однажды, по велению заказчика или нежеланию очередной раз вставлять костыли в битриксовые алгоритмы работы фильтра, поиска или каталога (а то и всего вместе взятого), встаёт вопрос интеграции с Elasticsearch. Идея, в общем-то, не нова, ведь эластик является самым популярным поисковым движком аж с 2010 года, и это весьма оправдано. У него огромнейшие возможности, удобное API, скорость выборки, поражающая воображение, особенно после битриксовых запросов. Отдельно стоит упомянуть его работу с морфологией: устранение опечаток, транслитерация, разбиение на лексемы, нечёткий поиск по множеству параметров и всё то, что порядочный заказчик хочет от поиска на своём сайте. В теории звучит здорово, и мы решаем – интеграции быть.
С чего начать?
Во-первых, у эластика своя база данных, в которой должны храниться данные нашего каталога. То есть мы получаем две базы на один сайт. Две базы с идентичными данными, что подразумевает необходимость разработки и настройки периодического обмена с сайта в эластик. Что ж, это мы реализовывали не раз, и больших сложностей обычно не возникает, однако не стоит забывать, что такой обмен занимает время и синхронизация будет не сиюминутная. Поэтому, если на сайте происходит большое количество различных выгрузок за небольшие промежутки времени, то проблеме быть.
Во-вторых, быстро не будет. Это я о работе подрядчика, ведь время на поддержку стандартного функционала, связанного с функционалом каталога и поиска увеличится. Как минимум вдвое. Возможно, втрое… Нет, это не зависит от навыков разработки, просто теперь, кроме битрикса, у вас на поводке ещё один питомец и всё, что вы делаете, нужно делать с учетом его наличия и жизнедеятельности.
Обо всем этом перед разработкой необходимо оповестить заказчика, ибо не каждый понимает, что стоит за быстрым и шустрым поиском, и не каждый готов впоследствии за это платить. И поверьте, иногда это опасение оправдано. Но вот необходимость этой интеграции превысила все озвученные минусы, все стадии принятия пройдены, и разработка запущена, что дальше?
Через тернии к звездам
В первую очередь, дам вам совет, который очень помог мне: не нужно жалеть времени на проектирование! Грамотно составленный план разработки в дальнейшем сэкономит большое количество времени, тем более что сейчас есть очень большое количество онлайн-инструментов и плагинов для проектирования. Старайтесь не привязываться при реализации к одному проекту, поскольку, во-первых, данная реализация может пригодиться вам на других проектах, а во-вторых, масштабные реализации (а это, несомненно, она) стоит разрабатывать с позиции «от общего – к частному». Тем более, что многие IDE сейчас предоставляют функционал генерации шаблонов ваших классов по составленным вами диаграммам. Не разработка, а одно удовольствие.
Далее: битрикс предоставляет нам возможность реализовывать функционал с помощью модуля – не пренебрегайте этой возможностью. В будущем это облегчит вам жизнь и позволит предоставить пользователям гибкие настройки (а клиенты любят настройки).
Также стоит помнить, что эластик – движок иностранный. Изначально идеального результата при работе с русским языком не будет, но эту проблему давно уже решили за нас, поэтому просто ставим плагин с русским анализатором, настраиваем на него индекс и радуемся, что хоть здесь не придётся сильно химичить.
И последнее, морально готовьтесь, что вам никто не поможет, кроме документации эластика (и то даже она – не всегда). Причем, если вы когда-то ранее ее читали в качестве ознакомления, то это не считается, даже если дважды. В процессе реализации преобразования битриксового массива фильтра в запрос эластика вы полюбите битрикс. Вы даже найдёте его запросы логичными и понятными, но отступать уже поздно. К слову, любовь продлится до получения первых результатов по вашему фильтру, точнее до того, как вы оцените скорость получения. Разочарование вас также ждёт, когда вы будете корячить обратно ёмкую и удобную структуру, которую вам вернул эластик в битриксовую, но тут уже ничего не поделать (на самом деле поделать – vue.js и переработка шаблона нам в помощь, но это уже совсем другая история).
Если отбросить прозу, то алгоритм внедрения эластика в любую структуру сайта на битриксе будет содержать следующие основные шаги:
- Сбор информации для индекса
- Реализация API для формирования запросов (основные - отправка/просмотр/поиск/сортировка/удаление)
- Замена вывода данных
Но есть нюанс…
Всё это действительно здорово, эластик-мощный движок, покрывающий большинство наших запросов. По своему опыту интеграций могу отметить следующие преимущества:
- Снижение нагрузки на сайт
- Повышение скорости загрузки страниц
- Более точные результаты поиска, которые учитывают опечатки, ошибки и возможности языка
- Обмен данными происходит гораздо быстрее, чем создание фасетного индекса
- Данные хранятся в удобном для разработки формате
Выводы
Итак, хотя внедрение эластика – весьма непростой процесс, требующий серьёзной подготовки, чёткого планирования и проектирования, вы не пожалеете. Грамотное внедрение увеличит скорость, распределит нагрузку на проекте и позволит в дальнейшем работать с удобной структурой и адекватным api. Просто попробуйте, а дальше – всё в ваших руках.