Умные фильтры для e-commerce
Почему даже при разработке на Битрикс мы предпочитаем делать фильтры на ElasticSearch
Когда в интернет-магазине больше десятка товаров, уже хочется помочь пользователю с выбором. А если товаров больше сотни, а тем более несколько тысяч, — фильтр становится необходим. Маркетплейсы пользователей избаловали, так что в минимальной комплектации они ожидают от фильтра в любом интернет-магазине:
Получается, фильтр при разработке надо сразу планировать умный и гибкий.
- свой набор критериев фильтрации для каждой категории каталога, причем критериев релевантных;
- возможность отфильтровать список товаров по наличию (как в целом в магазине, так и на определенном складе, откуда привезут быстрее);
- возможность выбрать только акционные товары (все любят экономить);
- фильтрацию по тегам. Когда можно посмотреть товары, заранее отмеченные продавцом, как носители определенного свойства. Например, видеть только веганские продукты в каталоге доставке;
- возможность фильтровать товары не только в категориях каталога, но и на «сборных» страницах, где представлены товары сразу из многих категорий. Например, в результатах поиска, на странице бренда, в акционной подборке;
- возможность фильтровать по цене уже с учетом скидок (правда с этим и не все маркетплейсы сейчас справляются).
Получается, фильтр при разработке надо сразу планировать умный и гибкий.
Умный фильтр на сайте: какие есть варианты?
В наших проектах мы используем два варианта реализации гибкого фильтра:
- Можно реализовать фильтр как микросервис, интегрировавшись с ElasticSearch — популярной готовой поисковой системой. Распространяется по лицензии SSPL, то есть покупать ее отдельно не нужно. Необходимо установить ее на ваш сервер и научить сайт с ней взаимодействовать. Подходит для любых проектов — хоть на фреймворках, хоть на Битриксе.
- Если же сайт на Битрикс, можно также использовать SMART-фильтр (умный фильтр) Битрикса — этот битриксовый компонент мы часто использовали, пока не перешли на ElasticSearch. Используем и сейчас на сайтах с небольшими каталогами, так как настроить его дешевле.
1С Битрикс — это CMS-система, то есть система управления сайтом. Его можно купить, скачать и с помощью программиста сделать интернет-магазин, где будут доставки, платежки, фильтр, и т. д. При этом все компоненты будут максимально универсальными, чтобы можно было использовать их для проектов с самыми различными требованиями.
Это означает, что каждый компонент позволяет сделать много вещей, которые на конкретном проекте могут не пригодиться. Битрикс так делает специально, чтобы подстроиться под большее количество разных проектов.
В чем минус: большое количество лишних компонентов, лишних возможностей создают большую нагрузку на базу данных сайта (а значит повышают требования к хостингу и потенциально может снизить скорость работы сайта), и повышают уязвимость сайта к взлому.
Это означает, что каждый компонент позволяет сделать много вещей, которые на конкретном проекте могут не пригодиться. Битрикс так делает специально, чтобы подстроиться под большее количество разных проектов.
В чем минус: большое количество лишних компонентов, лишних возможностей создают большую нагрузку на базу данных сайта (а значит повышают требования к хостингу и потенциально может снизить скорость работы сайта), и повышают уязвимость сайта к взлому.
Принцип работы фильтров: Битрикс против ElasticSearch
Начнем с фильтра Битрикса. При работе он делает большое количество запросов в Базу данных:
Итог — если в интернет-магазине много товаров и для каждого товара есть несколько цен, то фильтр начинает тормозить, может даже выдать ошибку. Чем товаров больше, тем тормозить он будет сильнее: при больших объемах данных скорость работы уменьшается линейно относительно объема данных. Чем больше интернет-магазин, тем хуже для него работает фильтр Битрикса.
- сначала запрос по одному товару, получает по нему все свойства;
- затем запрос по следующему товару, снова получает по нему все свойства. и так далее.
Итог — если в интернет-магазине много товаров и для каждого товара есть несколько цен, то фильтр начинает тормозить, может даже выдать ошибку. Чем товаров больше, тем тормозить он будет сильнее: при больших объемах данных скорость работы уменьшается линейно относительно объема данных. Чем больше интернет-магазин, тем хуже для него работает фильтр Битрикса.
Причина в проблеме SQL N+1, которая возникает, когда получение данных из базы данных выполняется за N дополнительных SQL-запросов для извлечения тех же данных, которые могли быть получены при выполнении основного SQL-запроса.
Когда программисту надо построить какую-то выборку из элементов, бывает, что к этим элементам привязаны еще другие элементы. Чтобы добавить в выборку каждый следующий элемент и привязанные к нему элементы, придется делать для него столько запросов, сколько суммарно элементов.
Каждый следующий элемент добавляет множество выборок. Получается «тяжелый» и медленных код. При этом можно переделать код таким образом, чтобы любое количество выборок добавлялось за один подход, но не в рамках компонента умного фильтра 1С-Битрикс.
Когда программисту надо построить какую-то выборку из элементов, бывает, что к этим элементам привязаны еще другие элементы. Чтобы добавить в выборку каждый следующий элемент и привязанные к нему элементы, придется делать для него столько запросов, сколько суммарно элементов.
Каждый следующий элемент добавляет множество выборок. Получается «тяжелый» и медленных код. При этом можно переделать код таким образом, чтобы любое количество выборок добавлялось за один подход, но не в рамках компонента умного фильтра 1С-Битрикс.
В случае с ElasticSearch работа происходит по-другому:
Весь процесс происходит гораздо быстрее, поскольку Elastic создан и заточен под такую работу — быстро делать выборки из больших баз данных. Итого, в отличие от SMART-фильтра Битрикса фильтру Elastic нужно всего 2 запроса: первым — забрать все товары, вторым — все свойства.
- при выборе критериев фильтрации запрос уходит в ElasticSearch, который отдает список ID товаров, соответствующих критериям фильтрации;
- далее по этим ID база данных Битрикса (MySQL) отдает конкретные товары.
Весь процесс происходит гораздо быстрее, поскольку Elastic создан и заточен под такую работу — быстро делать выборки из больших баз данных. Итого, в отличие от SMART-фильтра Битрикса фильтру Elastic нужно всего 2 запроса: первым — забрать все товары, вторым — все свойства.
Сравнение SMART-фильтра Битрикса и ElasticSearch
Так что же выбрать для фильтрации на сайте?
Рекомендации простые:
Примечание: сначала сделать на сайте SMART-фильтр (так как он дешевле), а потом поменять его на ElasticSearch суммарно будет дороже, чем сразу использовать Elastic.
- Если нужен максимально гибкий инструмент — берите ElasticSearch.
- Если к фильтру нет специфических требований, сайт на Битриксе и важно сэкономить — используйте умный фильтр Битрикса.
Примечание: сначала сделать на сайте SMART-фильтр (так как он дешевле), а потом поменять его на ElasticSearch суммарно будет дороже, чем сразу использовать Elastic.