首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标签搜索的数据存储解决方案

标签搜索的数据存储解决方案
EN

Stack Overflow用户
提问于 2012-04-30 21:52:49
回答 3查看 3.9K关注 0票数 5

我有数以百万计的物品是通过预先计算的分数订购的。每个项目都有许多布尔属性。让我们说,总共有大约一万种可能的属性,每个项目都有十几个属性。

我希望能够在实时(几毫秒)中请求,这是给定属性组合的前n项。

你会推荐什么解决方案?我正在寻找一些非常可伸缩的东西。

--

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-01 07:05:57

如果像这样存储对象,Mongodb可以处理您想要的东西

代码语言:javascript
复制
{ score:2131, attributes: ["attr1", "attr2", "attr3"], ... }

然后,下面的查询将匹配所有具有att1和attr2的项

代码语言:javascript
复制
c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] } })

但这不符合

代码语言:javascript
复制
c = db.mycol.find({ attributes: { $all: [ "attr1", "attr4" ] } })

查询返回一个游标,如果希望对该游标进行排序,则只需将排序参数添加到查询中,如下所示

代码语言:javascript
复制
c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] }}).sort({score:1})

看看高级查询,看看什么是可能的。

可以按以下方式设置适当的索引

代码语言:javascript
复制
db.mycol.ensureIndex({attributes:1, score:1})

并且您可以使用

代码语言:javascript
复制
db.mycol.find({ attributes: { $all: [ "attr1" ] }}).explain()

蒙戈解释了扫描了多少个物体,操作花费了多长时间,以及其他各种统计数据。

票数 9
EN

Stack Overflow用户

发布于 2012-05-01 03:53:55

这正是蒙戈所能应付的。您的属性是布尔类型这一事实在这里有所帮助。下面列出了一个可能的模式:

代码语言:javascript
复制
[
    {
        true_tags:[attr1, attr2, attr3, ...],
        false_tags: [attr4, attr5, attr6, ...]
    },
]

然后我们可以在true_tagsfalse_tags上进行索引。使用$in,$all,.查询运算符。

票数 2
EN

Stack Overflow用户

发布于 2012-05-01 05:52:25

雷迪斯将是一个完美的候选人

  • “按分数排序的数百万项”的“前n项”

Redis有一个内置的数据结构,您可以从它开始:Sorted Set,=>,排序集的每个成员都与得分相关联。例如,可以用兹朗贝斯克对其进行排序。

代码语言:javascript
复制
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

我鼓励您查看排序集命令,并对Redis有一种感觉,因为您的问题(正如所述)所要求的那样。当然,您可以在一个集合元素中保留尽可能多的属性。

至于MongoDB,由于您提到了数百万,除非您可以将增量查询用于解决您的问题,否则我不会期望出现次级第二次响应。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10391083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档