我有数以百万计的物品是通过预先计算的分数订购的。每个项目都有许多布尔属性。让我们说,总共有大约一万种可能的属性,每个项目都有十几个属性。
我希望能够在实时(几毫秒)中请求,这是给定属性组合的前n项。
你会推荐什么解决方案?我正在寻找一些非常可伸缩的东西。
--
发布于 2012-05-01 07:05:57
如果像这样存储对象,Mongodb可以处理您想要的东西
{ score:2131, attributes: ["attr1", "attr2", "attr3"], ... }然后,下面的查询将匹配所有具有att1和attr2的项
c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] } })但这不符合
c = db.mycol.find({ attributes: { $all: [ "attr1", "attr4" ] } })查询返回一个游标,如果希望对该游标进行排序,则只需将排序参数添加到查询中,如下所示
c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] }}).sort({score:1})看看高级查询,看看什么是可能的。
可以按以下方式设置适当的索引
db.mycol.ensureIndex({attributes:1, score:1})并且您可以使用
db.mycol.find({ attributes: { $all: [ "attr1" ] }}).explain()蒙戈解释了扫描了多少个物体,操作花费了多长时间,以及其他各种统计数据。
发布于 2012-05-01 03:53:55
这正是蒙戈所能应付的。您的属性是布尔类型这一事实在这里有所帮助。下面列出了一个可能的模式:
[
{
true_tags:[attr1, attr2, attr3, ...],
false_tags: [attr4, attr5, attr6, ...]
},
]然后我们可以在true_tags和false_tags上进行索引。使用$in,$all,.查询运算符。
发布于 2012-05-01 05:52:25
雷迪斯将是一个完美的候选人
Redis有一个内置的数据结构,您可以从它开始:Sorted Set,=>,排序集的每个成员都与得分相关联。例如,可以用兹朗贝斯克对其进行排序。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]我鼓励您查看排序集命令,并对Redis有一种感觉,因为您的问题(正如所述)所要求的那样。当然,您可以在一个集合元素中保留尽可能多的属性。
至于MongoDB,由于您提到了数百万,除非您可以将增量查询用于解决您的问题,否则我不会期望出现次级第二次响应。
正如@nickdos所提到的,Solr相关性是一个非常强大的特性,但是属性的数量将是一个问题,因为它需要将所有这些属性保存在每个项的内存中。虽然一打可能不是那么糟糕,但=>只是试着去看看。
https://stackoverflow.com/questions/10391083
复制相似问题