使用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端做了过滤;)。我希望这足够整洁。