Was Sie hier versuchen, ist ein invertierter Index.
Lassen Sie jede Spalte einem "Set" zuordnen. Dann können Sie die Mengen schneiden, um das Ergebnis zu erhalten.
Also APPLE: RED ROUND FRUIT
würde den folgenden Einfügungen zugeordnet werden:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
Nehmen wir dann an, ich möchte * ROUND FRUIT
abfragen , würde ich tun:
SINTER p2:ROUND p3:FRUIT
Dieser Befehl nimmt den Schnittpunkt der Elemente in p2:ROUND
set und p3:FRUIT
einstellen. Dadurch werden alle Elemente zurückgegeben, die ROUND
sind und FRUIT
, egal was p1
ist.
Einige andere Beispiele:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
Meine obige Antwort wird etwas Rechenleistung verbrauchen, da die Schnittoperation O(N*M)
ist . Hier ist eine Methode, die speicherintensiver ist, aber schneller abgerufen werden kann, da die Indizes effektiv vorberechnet werden.
Erstellen Sie für jede Kombination von Eigenschaften einen Schlüssel, der einen Satz speichert:
Also APPLE: RED ROUND FRUIT
würde den folgenden Einfügungen zugeordnet werden:
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
Dann greifen Sie zur Abfrage einfach auf den jeweiligen Schlüssel zu. Beispiel:* ROUND FRUIT
wäre einfach
SMEMBERS :ROUND:FRUIT
Offensichtlich skaliert dies überhaupt nicht gut in Bezug auf den Speicher, wenn Sie viele Dimensionen haben, aber es wird extrem schnell sein, Ergebnisse abzurufen.