sql >> Base de Datos >  >> NoSQL >> Redis

Buscador de coincidencias multiparámetro con Redis

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.