Очень интересная и актуальная задача! Спасибо!
Про ограничения по памяти и серверов ничего не сказано, поэтому моё решение след:
- присвоить каждому объекту номер 1,2,3,4,5
- строим независимый индекс по каждому атрибуту (если значения атрибута совпадают, сортируем по номеру объекта)
запрос разбиваем на части и по каждому индексу можем за o(log(n)) = o(log(100M))=19 операций узнать сколько объектов будет в результате если будем фильтровать только по этому одному атрибуту.
дальше можно сделать выборку по одному атрибуту и проверять все остальные условия
или
мержить списки номеров объектов