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.