您要在此处执行的操作是倒排索引。
对于每一列,将其映射到“集合”。然后,您可以将这些集合相交以获得结果。
因此,
APPLE: RED ROUND FRUIT将映射到以下插入:
SADD p1:RED APPLESADD p2:ROUND APPLESADD p3:FRUIT APPLE
然后,假设我要查询
* ROUND FRUIT,我会这样做:
SINTER p2:ROUND p3:FRUIT
此命令获取
p2:ROUND集合和
p3:FRUIT集合中项目的交集。这将返回所有的项目
ROUND和
FRUIT,不关心什么
p1是。
其他一些例子:
SMEMBERS p1:GREENSINTER p1:RED p2:ROUND p3:FRUITSUNIOn p1:RED p1:GREEN
我的上述答案将使用某种计算能力,因为相交操作为
O(N*M)。这是一种占用大量内存的方法,但由于它可以有效地预先计算索引,因此检索速度更快。
对于每种属性组合,创建一个存储一组的键:
因此,
APPLE: RED ROUND FRUIT将映射到以下插入:
SADD RED:ROUND:FRUIT APPLESADD :ROUND:FRUIT APPLESADD RED::FRUIT APPLESADD RED:ROUND: APPLESADD RED:: APPLESADD :ROUND: APPLESADD ::FRUIT APPLESADD ::: APPLE
然后,要查询,您只需访问相应的键。例如,
* ROUND FRUIT将仅仅是
SMEMBERS :ROUND:FRUIT
显然,当您有很多尺寸时,这在内存方面根本无法很好地扩展,但是检索结果将非常快捷。



