Wat je hier probeert te doen is een omgekeerde index.
Laat deze voor elke kolom toewijzen aan een "set". Vervolgens kun je de sets kruisen om het resultaat te krijgen.
Dus APPLE: RED ROUND FRUIT
zou verwijzen naar de volgende invoegingen:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
Laten we zeggen dat ik een zoekopdracht wil uitvoeren voor * ROUND FRUIT
, ik zou doen:
SINTER p2:ROUND p3:FRUIT
Dit commando neemt het snijpunt van de items in de p2:ROUND
set en de p3:FRUIT
set. Hiermee worden alle items geretourneerd die ROUND
zijn en FRUIT
, niet schelen wat p1
is.
Enkele andere voorbeelden:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
Mijn bovenstaande antwoord gaat wat rekenkracht gebruiken omdat de bewerking van het snijpunt O(N*M)
is . Hier is een manier om dit te doen die meer geheugenintensief is, maar sneller kan worden opgehaald omdat het de indexen effectief vooraf berekent.
Maak voor elke combinatie van eigenschappen een sleutel die een set opslaat:
Dus APPLE: RED ROUND FRUIT
zou verwijzen naar de volgende invoegingen:
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
Om vervolgens te zoeken, opent u eenvoudig de respectieve sleutel. Bijvoorbeeld * ROUND FRUIT
zou gewoon zijn
SMEMBERS :ROUND:FRUIT
Uiteraard schaalt dit helemaal niet goed in termen van geheugen als je veel dimensies hebt, maar het zal buitengewoon pittig zijn om resultaten op te halen.