使用Redis的多参数匹配查找器
我需要为某些数据集创建一个匹配查找系统,如下所示: 有一组对象,每个对象由字符串使用Redis的多参数匹配查找器,redis,Redis,我需要为某些数据集创建一个匹配查找系统,如下所示: 有一组对象,每个对象由字符串ObjectID标识 每个对象正好有N个属性Pi。每个属性值都是一个字符串 N=3的数据库示例(在现实生活中N=8) 所有这些都是用SQL完成的 问题是:有没有一种简洁的方法可以让Redis做到这一点 请注意,我对基于Redis的解决方案感兴趣,特别是出于自我教育的目的;对于这个特殊的问题,其他DBs是非主题的 更新:对于每个Pi和应用程序端筛选,使用显式的ObjectID列表的简单解决方案看起来不够整洁:-)您在这
ObjectID
标识
每个对象正好有N个属性Pi。每个属性值都是一个字符串
N=3的数据库示例(在现实生活中N=8)
所有这些都是用SQL完成的
问题是:有没有一种简洁的方法可以让Redis做到这一点
请注意,我对基于Redis的解决方案感兴趣,特别是出于自我教育的目的;对于这个特殊的问题,其他DBs是非主题的
更新:对于每个Pi和应用程序端筛选,使用显式的
ObjectID
列表的简单解决方案看起来不够整洁:-)您在这里尝试的是一个反向索引
对于每个列,将其映射到一个“集合”。然后,可以将这些集合相交以获得结果
因此,APPLE:RED-ROUND-FRUIT
将映射到以下插入:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
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
然后,假设我想查询*圆形水果
,我会:
SINTER p2:ROUND p3:FRUIT
此命令获取p2:ROUND
集合和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 p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
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
然后,要进行查询,只需访问相应的密钥。例如,*圆形水果
SMEMBERS :ROUND:FRUIT
显然,当您有许多维度时,这在内存方面根本无法很好地扩展,但检索结果将非常迅速。这是一个有趣的问题。我期待着看是否有人能想出更好的办法。我基本上做了“琐碎的显式列表”,但在Redis端做了过滤;)。我希望这足够整洁。