Това, което се опитвате да направите тук, е обърнат индекс.
За всяка колона я накарайте да се съпостави с "набор". След това можете да пресечете множествата, за да получите резултата.
И така, APPLE: RED ROUND FRUIT
ще се съпостави със следните вложки:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
След това, да кажем, че искам да направя заявка за * ROUND FRUIT
, бих направил:
SINTER p2:ROUND p3:FRUIT
Тази команда заема пресечната точка на елементите в p2:ROUND
set и p3:FRUIT
комплект. Това ще върне всички елементи, които са ROUND
и FRUIT
, без да се интересува какво p1
е.
Някои други примери:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
Отговорът ми по-горе ще използва известна изчислителна мощност, защото операцията за пресичане е O(N*M)
. Ето начин да го направите, който е по-интензивен от паметта, но ще има по-бързо извличане, тъй като ефективно предварително изчислява индексите.
За всяка комбинация от свойства направете ключ, който съхранява набор:
И така, APPLE: RED ROUND FRUIT
ще се съпостави със следните вложки:
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
След това, за да направите заявка, просто имате достъп до съответния ключ. Например, * ROUND FRUIT
просто би било
SMEMBERS :ROUND:FRUIT
Очевидно това изобщо не се мащабира добре по отношение на паметта, когато имате много измерения, но ще бъде изключително бързо да извлечете резултатите.