В статье разбираемся, какие требования к фильтрам у современных пользователей и как технически их лучше реализовать
Умные фильтры для e-commerce
Сибирикс

Умные фильтры для e-commerce

Почему даже при разработке на Битрикс мы предпочитаем делать фильтры на ElasticSearch
Когда в интернет-магазине больше десятка товаров, уже хочется помочь пользователю с выбором. А если товаров больше сотни, а тем более несколько тысяч, — фильтр становится необходим. Маркетплейсы пользователей избаловали, так что в минимальной комплектации они ожидают от фильтра в любом интернет-магазине:

  • свой набор критериев фильтрации для каждой категории каталога, причем критериев релевантных;
  • возможность отфильтровать список товаров по наличию (как в целом в магазине, так и на определенном складе, откуда привезут быстрее);
  • возможность выбрать только акционные товары (все любят экономить);
  • фильтрацию по тегам. Когда можно посмотреть товары, заранее отмеченные продавцом, как носители определенного свойства. Например, видеть только веганские продукты в каталоге доставке;
  • возможность фильтровать товары не только в категориях каталога, но и на «сборных» страницах, где представлены товары сразу из многих категорий. Например, в результатах поиска, на странице бренда, в акционной подборке;
  • возможность фильтровать по цене уже с учетом скидок (правда с этим и не все маркетплейсы сейчас справляются).

Получается, фильтр при разработке надо сразу планировать умный и гибкий.

Умный фильтр на сайте: какие есть варианты?

В наших проектах мы используем два варианта реализации гибкого фильтра:

  1. Можно реализовать фильтр как микросервис, интегрировавшись с ElasticSearch — популярной готовой поисковой системой. Распространяется по лицензии SSPL, то есть покупать ее отдельно не нужно. Необходимо установить ее на ваш сервер и научить сайт с ней взаимодействовать. Подходит для любых проектов — хоть на фреймворках, хоть на Битриксе.
  2. Если же сайт на Битрикс, можно также использовать SMART-фильтр (умный фильтр) Битрикса — этот битриксовый компонент мы часто использовали, пока не перешли на ElasticSearch. Используем и сейчас на сайтах с небольшими каталогами, так как настроить его дешевле.
1С Битрикс — это CMS-система, то есть система управления сайтом. Его можно купить, скачать и с помощью программиста сделать интернет-магазин, где будут доставки, платежки, фильтр, и т. д. При этом все компоненты будут максимально универсальными, чтобы можно было использовать их для проектов с самыми различными требованиями.

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

В чем минус: большое количество лишних компонентов, лишних возможностей создают большую нагрузку на базу данных сайта (а значит повышают требования к хостингу и потенциально может снизить скорость работы сайта), и повышают уязвимость сайта к взлому.

Принцип работы фильтров: Битрикс против ElasticSearch

Начнем с фильтра Битрикса. При работе он делает большое количество запросов в Базу данных:

  • сначала запрос по одному товару, получает по нему все свойства;
  • затем запрос по следующему товару, снова получает по нему все свойства. и так далее.

Итог — если в интернет-магазине много товаров и для каждого товара есть несколько цен, то фильтр начинает тормозить, может даже выдать ошибку. Чем товаров больше, тем тормозить он будет сильнее: при больших объемах данных скорость работы уменьшается линейно относительно объема данных. Чем больше интернет-магазин, тем хуже для него работает фильтр Битрикса.
Причина в проблеме SQL N+1, которая возникает, когда получение данных из базы данных выполняется за N дополнительных SQL-запросов для извлечения тех же данных, которые могли быть получены при выполнении основного SQL-запроса.

Когда программисту надо построить какую-то выборку из элементов, бывает, что к этим элементам привязаны еще другие элементы. Чтобы добавить в выборку каждый следующий элемент и привязанные к нему элементы, придется делать для него столько запросов, сколько суммарно элементов.

Каждый следующий элемент добавляет множество выборок. Получается «тяжелый» и медленных код. При этом можно переделать код таким образом, чтобы любое количество выборок добавлялось за один подход, но не в рамках компонента умного фильтра 1С-Битрикс.
В случае с ElasticSearch работа происходит по-другому:
  • при выборе критериев фильтрации запрос уходит в ElasticSearch, который отдает список ID товаров, соответствующих критериям фильтрации;
  • далее по этим ID база данных Битрикса (MySQL) отдает конкретные товары.

Весь процесс происходит гораздо быстрее, поскольку Elastic создан и заточен под такую работу — быстро делать выборки из больших баз данных. Итого, в отличие от SMART-фильтра Битрикса фильтру Elastic нужно всего 2 запроса: первым — забрать все товары, вторым — все свойства.

Сравнение SMART-фильтра Битрикса и ElasticSearch

Так что же выбрать для фильтрации на сайте?

Рекомендации простые:

  • Если нужен максимально гибкий инструмент — берите ElasticSearch.
  • Если к фильтру нет специфических требований, сайт на Битриксе и важно сэкономить — используйте умный фильтр Битрикса.

Примечание: сначала сделать на сайте SMART-фильтр (так как он дешевле), а потом поменять его на ElasticSearch суммарно будет дороже, чем сразу использовать Elastic.