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.