Redis
 sql >> Database >  >> NoSQL >> Redis

Trova fiammiferi multiparametro con Redis

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.