我已经通过预先计算得分订购了数百万件物品。每个项目都有许多布尔属性。 我们说完全有大约一万个可能的属性,每个项目都有十几个。
我希望能够实时实现(几毫秒)给出前n个项目〜任何属性组合。
您会推荐什么解决方案?我正在寻找极具可扩展性的东西。
-
- 我们目前正在查看 mongodb 和数组索引,你看到有什么限制吗?
- SolR 是一种可能的解决方案,但我们不需要文本搜索功能。
答案 0 :(得分:9)
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})
看看Advanced Queries,看看有什么可能。
可以按如下方式设置适当的索引
db.mycol.ensureIndex({attributes:1, score:1})
您可以使用
获取效果信息db.mycol.find({ attributes: { $all: [ "attr1" ] }}).explain()
Mongo解释了扫描了多少对象,操作花了多长时间 和其他各种统计数据。
答案 1 :(得分:2)
这正是Mongo可以处理的问题。您的属性是布尔类型的事实在这里有帮助。下面列出了可能的架构:
[
{
true_tags:[attr1, attr2, attr3, ...],
false_tags: [attr4, attr5, attr6, ...]
},
]
然后我们可以索引 true_tags 和 false_tags 。使用$ in,$ all,...查询运算符进行搜索应该是高效的。
答案 2 :(得分:2)
Redis将是
的完美候选人 Redis有一个内置的数据结构,您可以从以下开始:Sorted Set
=>排序集的每个成员都与分数相关联。例如,可以使用ZRANGEBYSCORE按分数排名:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
我鼓励您查看排序集commands并了解Redis,因为您的问题(如上所述)要求它。当然,您可以在单个Set元素中保留尽可能多的属性。
至于MongoDB,既然你提到了数百万,除非你可以弯曲增量查询来解决你的问题,否则我不期望得到次要的响应。
正如@nickdos所提到的,Solr Relevancy是一个非常强大的功能,但属性的数量将成为一个问题,因为它需要将所有这些属性保存在每个项目的内存中。虽然每个打十几个可能不那么糟糕=>试着看看。