Quello che stai cercando di fare qui è un indice invertito.
Per ogni colonna, falla mappare su un "set". Quindi, puoi intersecare i set per ottenere il risultato.
Quindi, APPLE: RED ROUND FRUIT
sarebbe mappato ai seguenti inserti:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
Quindi, diciamo che voglio eseguire una query per * ROUND FRUIT
, lo farei:
SINTER p2:ROUND p3:FRUIT
Questo comando prende l'intersezione degli elementi nel p2:ROUND
set e il p3:FRUIT
impostare. Questo restituirà tutti gli articoli che sono ROUND
e FRUIT
, non importa cosa p1
è.
Alcuni altri esempi:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
La mia risposta sopra utilizzerà un po' di potenza di calcolo perché l'operazione di incrocio è O(N*M)
. Ecco un modo per farlo che richiede più memoria, ma avrà un recupero più rapido perché precalcola efficacemente gli indici.
Per ogni combinazione di proprietà, crea una chiave che memorizza un set:
Quindi, APPLE: RED ROUND FRUIT
sarebbe mappato ai seguenti inserti:
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
Quindi, per interrogare, è sufficiente accedere alla rispettiva chiave. Ad esempio, * ROUND FRUIT
sarebbe semplicemente
SMEMBERS :ROUND:FRUIT
Ovviamente, questo non si adatta affatto bene in termini di memoria quando hai molte dimensioni, ma sarà estremamente veloce recuperare i risultati.