Что такое фасетный поиск
Каталог из 50 000 товаров бесполезен без навигации. Пользователь не будет листать страницы — он уйдёт. Фасетный поиск решает эту задачу: позволяет быстро сузить выборку через несколько фильтров одновременно.
Фасет — это один атрибут (бренд, цвет, размер, цена). Их комбинация уточняет выдачу: «кроссовки + Nike + синий + 42 размер + до 10 000 ₽». Каждый шаг фильтрации обновляет список доступных значений других фасетов — показывает только те опции, которые дают непустой результат.
Архитектурные подходы к реализации
| Подход | Как работает | Производительность |
|---|---|---|
| Поиск в базе данных (SQL) | Запросы с WHERE + COUNT для каждой комбинации | Медленно при большом каталоге |
| Elasticsearch / Solr | Инвертированный индекс + aggregations | Быстро, масштабируется |
| Фасетирование в памяти | Предвычисленные индексы в Redis / in-memory | Очень быстро, требует больше памяти |
Для каталогов от 100K+ товаров поисковые движки (Elasticsearch, Typesense, Algolia) — стандарт.
Фасетный поиск и SEO
Каждая комбинация фасетов потенциально создаёт отдельный URL. Каталог с 10 брендами × 8 цветами × 5 ценовых диапазонов = 400 URL только для трёх фасетов. С реальным числом атрибутов — десятки тысяч.
Стратегия управления:
Высоконагруженные (индексировать):
/catalog/shoes/brand/nike/ — значимый трафик
Комбинации (canonical):
/catalog/shoes?brand=nike&color=blue → canonical на /catalog/shoes/
Технические (noindex/robots.txt):
?sort=price_asc, ?page=2, редкие комбинации
Совет: используйте канонические URL для ключевых фасетов (бренд, категория) и noindex для комбинаций. Это защищает краулинговый бюджет и исключает дублирование контента.
Персонализация фасетов
Стандартный фасетный поиск одинаков для всех. Персонализированный адаптируется под пользователя:
- Предвыбор значений — пользователь всегда выбирает размер M → система предвыбирает его при входе в категорию
- Сортировка опций — бренды, которые пользователь покупал, стоят вверху списка
- Скрытие нерелевантных фасетов — покупателю детской одежды не показывать «мужской / женский» фасет