Redis
 sql >> Base de données >  >> NoSQL >> Redis

Chercheur de correspondance multi-paramètres avec Redis

Ce que vous essayez de faire ici est un index inversé.

Pour chaque colonne, faites-la correspondre à un "ensemble". Ensuite, vous pouvez croiser les ensembles pour obtenir le résultat.

Alors, APPLE: RED ROUND FRUIT correspondrait aux insertions suivantes :

SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE

Ensuite, disons que je veux interroger * ROUND FRUIT , je ferais :

SINTER p2:ROUND p3:FRUIT

Cette commande prend l'intersection des éléments dans le p2:ROUND ensemble et le p3:FRUIT Positionner. Cela renverra tous les éléments qui sont ROUND et FRUIT , sans se soucier de quoi p1 est.

Quelques autres exemples :

SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN

Ma réponse ci-dessus va utiliser une certaine puissance de calcul car l'opération d'intersection est O(N*M) . Voici une façon de le faire qui utilise plus de mémoire, mais qui aura une récupération plus rapide car elle précalcule efficacement les index.

Pour chaque combinaison de propriétés, créez une clé qui stocke un ensemble :

Alors, APPLE: RED ROUND FRUIT correspondrait aux insertions suivantes :

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

Ensuite, pour interroger, il vous suffit d'accéder à la clé correspondante. Par exemple, * ROUND FRUIT serait simplement

SMEMBERS :ROUND:FRUIT

Évidemment, cela ne s'adapte pas du tout en termes de mémoire lorsque vous avez de nombreuses dimensions, mais il sera extrêmement rapide de récupérer les résultats.