用于标记搜索的数据存储解决方案

时间:2012-04-30 21:52:49

标签: mongodb search solr nosql

我已经通过预先计算得分订购了数百万件物品。每个项目都有许多布尔属性。   我们说完全有大约一万个可能的属性,每个项目都有十几个。

我希望能够实时实现(几毫秒)给出前n个项目〜任何属性组合。

您会推荐什么解决方案?我正在寻找极具可扩展性的东西。

-
- 我们目前正在查看 mongodb 和数组索引,你看到有什么限制吗? - SolR 是一种可能的解决方案,但我们不需要文本搜索功能。

3 个答案:

答案 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将是

的完美候选人
  • “按分数排序的数百万项”的“前n项”

Redis有一个内置的数据结构,您可以从以下开始:Sorted Set =>排序集的每个成员都与分数相关联。例如,可以使用ZRANGEBYSCORE按分数排名:

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

我鼓励您查看排序集commands并了解Redis,因为您的问题(如上所述)要求它。当然,您可以在单个Set元素中保留尽可能多的属性。


至于MongoDB,既然你提到了数百万,除非你可以弯曲增量查询来解决你的问题,否则我期望得到次要的响应。

正如@nickdos所提到的,Solr Relevancy是一个非常强大的功能,但属性的数量将成为一个问题,因为它需要将所有这些属性保存在每个项目的内存中。虽然每个打十几个可能不那么糟糕=>试着看看。