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

log*_*og0 5 search solr mongodb nosql

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

我希望能够实时(几毫秒)请求给出的前n项〜任何属性组合.

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

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

Ivo*_*cky 9

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

{ score:2131, attributes: ["attr1", "attr2", "attr3"], ... }
Run Code Online (Sandbox Code Playgroud)

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

c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] } })
Run Code Online (Sandbox Code Playgroud)

但这不符合它

c = db.mycol.find({ attributes: { $all: [ "attr1", "attr4" ] } })
Run Code Online (Sandbox Code Playgroud)

如果要对此游标进行排序,查询将返回一个游标,然后只需将排序参数添加到查询中

c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] }}).sort({score:1})
Run Code Online (Sandbox Code Playgroud)

查看高级查询以查看可能的内容.

可以如下设置适当的索引

db.mycol.ensureIndex({attributes:1, score:1})
Run Code Online (Sandbox Code Playgroud)

您可以使用获取性能信息

db.mycol.find({ attributes: { $all: [ "attr1" ] }}).explain()
Run Code Online (Sandbox Code Playgroud)

Mongo解释了扫描了多少对象,操作需要多长时间以及各种其他统计信息.