我已经得到了数百万预先计算的分值排序项。 每个项目都有很多布尔属性。 让我们说,有大约一万个可能的属性完全,让他们的打的每个项目。
我希望能在实时 (几毫秒)要求前n项给出〜属性的任意组合。
你会推荐什么样的解决方案呢? 我在寻找的东西非常可扩展性。
-
-目前,我们正在寻找的MongoDB和数组索引,你看到了什么限制?
- SOLR是一个可能的解决方案,但我们不需要文本搜索功能。
我已经得到了数百万预先计算的分值排序项。 每个项目都有很多布尔属性。 让我们说,有大约一万个可能的属性完全,让他们的打的每个项目。
我希望能在实时 (几毫秒)要求前n项给出〜属性的任意组合。
你会推荐什么样的解决方案呢? 我在寻找的东西非常可扩展性。
-
-目前,我们正在寻找的MongoDB和数组索引,你看到了什么限制?
- SOLR是一个可能的解决方案,但我们不需要文本搜索功能。
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()
蒙戈解释了许多对象是如何被扫描,操作了多长时间以及其他各种统计数据。
这正是蒙戈可以对付。 你的属性是布尔类型,这有助于在这里。 一种可能的模式是列举如下:
[
{
true_tags:[attr1, attr2, attr3, ...],
false_tags: [attr4, attr5, attr6, ...]
},
]
然后,我们可以对true_tags和false_tags指数。 它应该是有效的在$搜索,$所有,...查询操作。
Redis的将是一个完美的候选人
Redis的有一个内置的数据结构,可以从开始: Sorted Set
=>每一个有序集合的成员与相关的得分。 这对于例如可以通过分数与排名ZRANGEBYSCORE :
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
我鼓励你看看有序集合的命令 ,并获得Redis的感觉,因为你的问题(因为它是规定)要求它。 你当然可以保留尽可能多的属性,如你一组元素中一样。
至于MongoDB的,因为你提到的数以百万计,除非你能弯曲增量查询你的问题的工作,我不希望子秒响应。
作为@nickdos提到Solr的相关性是一个非常强大的功能,但属性的数量将是一个问题,因为它需要保持一切属性在内存中的每个项目。 虽然每个十几未必是坏=>只是尝试看看。