Det du försöker göra här är ett inverterat index.
För varje kolumn, låt den mappas till en "uppsättning". Sedan kan du skära uppsättningarna för att få resultatet.
Så, APPLE: RED ROUND FRUIT
skulle mappa till följande inlägg:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
Låt oss sedan säga att jag vill fråga efter * ROUND FRUIT
, jag skulle göra:
SINTER p2:ROUND p3:FRUIT
Detta kommando tar skärningspunkten mellan objekten i p2:ROUND
set och p3:FRUIT
uppsättning. Detta kommer att returnera alla objekt som är ROUND
och FRUIT
, bryr sig inte om vad p1
är.
Några andra exempel:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
Mitt svar ovan kommer att använda lite beräkningskraft eftersom skärningsoperationen är O(N*M)
. Här är ett sätt att göra det som är mer minneskrävande, men som har snabbare hämtning eftersom det effektivt förberäknar indexen.
För varje kombination av egenskaper, skapa en nyckel som lagrar en uppsättning:
Så, APPLE: RED ROUND FRUIT
skulle mappa till följande inlägg:
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
Sedan, för att fråga, kommer du helt enkelt åt respektive nyckel. Till exempel * ROUND FRUIT
skulle helt enkelt vara
SMEMBERS :ROUND:FRUIT
Uppenbarligen skalar detta inte bra alls när det gäller minne när du har många dimensioner, men det kommer att vara extremt snabbt att hämta resultat.