Lo que intenta hacer aquí es un índice invertido.
Para cada columna, haga que se asigne a un "conjunto". Luego, puede intersectar los conjuntos para obtener el resultado.
Entonces, APPLE: RED ROUND FRUIT
se asignaría a las siguientes inserciones:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
Entonces, digamos que quiero consultar * ROUND FRUIT
, yo haría:
SINTER p2:ROUND p3:FRUIT
Este comando está tomando la intersección de los elementos en el p2:ROUND
conjunto y el p3:FRUIT
colocar. Esto devolverá todos los elementos que son ROUND
y FRUIT
, sin importar qué p1
es.
Algunos otros ejemplos:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
Mi respuesta anterior utilizará algo de poder de cálculo porque la operación de intersección es O(N*M)
. Aquí hay una forma de hacerlo que requiere más memoria, pero tendrá una recuperación más rápida porque precalcula efectivamente los índices.
Para cada combinación de propiedades, cree una clave que almacene un conjunto:
Entonces, APPLE: RED ROUND FRUIT
se asignaría a las siguientes inserciones:
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
Luego, para consultar, basta con acceder a la clave respectiva. Por ejemplo, * ROUND FRUIT
sería simplemente
SMEMBERS :ROUND:FRUIT
Obviamente, esto no escala bien en términos de memoria cuando tiene muchas dimensiones, pero será extremadamente rápido recuperar los resultados.