Для каждого пункта из фильтра (страна-россия, например, или модель-а5, например) храните битмап длиной N бит, где N - кол-во товаров всего. В битмапе 1 на месте k означает принадлежность товара с id=k этому пункту фильтра. Вот и всё. Очевидно что id товаров должны начинаться с 1, ну или закрепите offset = MIN(id) для каждого индекса товара, чтобы сопоставлять его с битом в битмапе.
При таком подходе у вас нет никаких ограничений - на множественную принадлежность, на выборку с условиями И или ИЛИ (например цвет красный И страна Россия, или цвет красный ИЛИ цвет зелёный), которые решаются обычным перемножением или сложением битмапов.
Всё это хозяйство прекрасно хранится в Redis с его прекрасной поддержкой битмапов и полным набором операций по ним.