Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Localizador de correspondências multiparâmetros com Redis


O que você está tentando fazer aqui é um índice invertido.

Para cada coluna, mapeie para um "conjunto". Então, você pode cruzar os conjuntos para obter o resultado.

Então, APPLE: RED ROUND FRUIT mapearia para as seguintes inserções:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE

Então, digamos que eu queira consultar * ROUND FRUIT , Eu faria:
SINTER p2:ROUND p3:FRUIT

Este comando está pegando a interseção dos itens no p2:ROUND set e o p3:FRUIT definir. Isso retornará todos os itens que são ROUND e FRUIT , sem se importar com o que p1 é.

Alguns outros exemplos:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN

Minha resposta acima vai usar algum poder de computação porque a operação de interseção é O(N*M) . Aqui está uma maneira de fazer isso que consome mais memória, mas terá uma recuperação mais rápida porque pré-computa efetivamente os índices.

Para cada combinação de propriedades, faça uma chave que armazene um conjunto:

Então, APPLE: RED ROUND FRUIT mapearia para as seguintes inserções:
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

Então, para consultar, basta acessar a respectiva chave. Por exemplo, * ROUND FRUIT seria simplesmente
SMEMBERS :ROUND:FRUIT

Obviamente, isso não se adapta bem em termos de memória quando você tem muitas dimensões, mas será extremamente rápido recuperar os resultados.