To, co se zde pokoušíte udělat, je obrácený index.
Pro každý sloupec jej nechte namapovat na „množinu“. Potom můžete množiny protnout a získat výsledek.
Takže APPLE: RED ROUND FRUIT
by mapoval na následující vložky:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
Pak řekněme, že chci dotaz na * ROUND FRUIT
, udělal bych:
SINTER p2:ROUND p3:FRUIT
Tento příkaz je průsečíkem položek v p2:ROUND
set a p3:FRUIT
soubor. Tím se vrátí všechny položky, které jsou ROUND
a FRUIT
, bez ohledu na to, co p1
je.
Některé další příklady:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
Moje výše uvedená odpověď bude využívat určitý výpočetní výkon, protože operace křižovatky je O(N*M)
. Zde je způsob, jak toho dosáhnout, který je náročnější na paměť, ale bude mít rychlejší načítání, protože efektivně předpočítá indexy.
Pro každou kombinaci vlastností vytvořte klíč, který uloží sadu:
Takže APPLE: RED ROUND FRUIT
by mapoval na následující vložky:
SADD RED:ROUND:FRUIT APPLE
SADD :ROUND:FRUIT APPLE
SADD RED::FRUIT APPLE
SADD RED:ROUND: APPLE
SADD RED:: APPLE
SADD :ROUND: APPLE
SADD ::FRUIT APPLE
SADD ::: APPLE
Poté pro dotaz jednoduše přistoupíte k příslušnému klíči. Například * ROUND FRUIT
by prostě bylo
SMEMBERS :ROUND:FRUIT
Je zřejmé, že se to vůbec neškáluje dobře z hlediska paměti, když máte mnoho dimenzí, ale načítání výsledků bude extrémně rychlé.