Faceted Search - аналитическая проблема, а это значит, что размерный дизайн - хорошая ставка. Ака, то, что вы ищете, должно быть в табличной форме.
Включите все интересующие вас столбцы в аналитическую таблицу.
Положите непрерывные значения в ведра.
Используйте логические столбцы для «многих» элементов, таких как категории или теги, например, если есть три тега «foo», «bar» и «baz», у вас будет три логических столбца.
Используйте материализованное представление для создания аналитической таблицы.
Индекс дерьма из этого. Некоторые базы данных поддерживают индексы для этого типа приложений.
Фильтровать только один раз.
Объедините ваши результаты.
Создание предварительно агрегированных материализованных представлений для общих запросов.
Эта статья также может вам помочь: https://blog.jooq.org/2017/04/20/how-to-calculate-multiple-aggregate-functions-in-a-single-query/
with filtered as (
select
*
from cars_analytic
where
[some search conditions]
)
--for each facet:
select
'brand' as facet,
brand as value,
count(*) as count
from
filtered
group by
brand
union
select
'cool-tag' as facet,
'cool-tag'as value,
count(*) as count
from
filtered
where
cool_tag
union
...
-- sort at the end
order by
facet,
count desc,
value
100 000 записей с 5 гранями за ~ 150 мс