To, co próbujesz tutaj zrobić, to odwrócony indeks.
Dla każdej kolumny zmapuj ją na „zestaw”. Następnie możesz przecinać zbiory, aby uzyskać wynik.
A więc APPLE: RED ROUND FRUIT
odwzoruje następujące wstawki:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
Następnie powiedzmy, że chcę zapytać o * ROUND FRUIT
, zrobiłbym:
SINTER p2:ROUND p3:FRUIT
To polecenie pobiera przecięcie elementów w p2:ROUND
zestaw i p3:FRUIT
ustawić. Zwróci to wszystkie elementy, które są ROUND
i FRUIT
, nie dbając o to, co p1
jest.
Kilka innych przykładów:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
Moja powyższa odpowiedź będzie zużywać trochę mocy obliczeniowej, ponieważ operacja przecięcia to O(N*M)
. Oto sposób na zrobienie tego, który wymaga większej ilości pamięci, ale będzie miał szybsze pobieranie, ponieważ skutecznie wstępnie oblicza indeksy.
Dla każdej kombinacji właściwości utwórz klucz przechowujący zestaw:
A więc APPLE: RED ROUND FRUIT
odwzoruje następujące wstawki:
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
Następnie, aby wykonać zapytanie, wystarczy uzyskać dostęp do odpowiedniego klucza. Na przykład * ROUND FRUIT
byłoby po prostu
SMEMBERS :ROUND:FRUIT
Oczywiście w przypadku wielu wymiarów nie skaluje się to dobrze pod względem pamięci, ale pobieranie wyników będzie niezwykle szybkie.