对于标签搜索数据存储解决方案(Datastore solution for tag search)

2019-07-29 05:32发布

我已经得到了数百万预先计算的分值排序项。 每个项目都有很多布尔属性。 让我们说,有大约一万个可能的属性完全,让他们的打的每个项目。

我希望能在实时 (几毫秒)要求前n项给出〜属性的任意组合。

你会推荐什么样的解决方案呢? 我在寻找的东西非常可扩展性。

-
-目前,我们正在寻找的MongoDB和数组索引,你看到了什么限制?
- SOLR是一个可能的解决方案,但我们不需要文本搜索功能。

Answer 1:

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()

蒙戈解释了许多对象是如何被扫描,操作了多长时间以及其他各种统计数据。



Answer 2:

这正是蒙戈可以对付。 你的属性是布尔类型,这有助于在这里。 一种可能的模式是列举如下:

[
    {
        true_tags:[attr1, attr2, attr3, ...],
        false_tags: [attr4, attr5, attr6, ...]
    },
]

然后,我们可以对true_tagsfalse_tags指数。 它应该是有效的在$搜索,$所有,...查询操作。



Answer 3:

Redis的将是一个完美的候选人

  • “前n项”为“数以百万计的项目按分数排序”

Redis的有一个内置的数据结构,可以从开始: Sorted Set =>每一个有序集合的成员与相关的得分。 这对于例如可以通过分数与排名ZRANGEBYSCORE :

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

我鼓励你看看有序集合的命令 ,并获得Redis的感觉,因为你的问题(因为它是规定)要求它。 你当然可以保留尽可能多的属性,如你一组元素中一样。


至于MongoDB的,因为你提到的数以百万计,除非你能弯曲增量查询你的问题的工作,我希望子秒响应。

作为@nickdos提到Solr的相关性是一个非常强大的功能,但属性的数量是一个问题,因为它需要保持一切属性在内存中的每个项目。 虽然每个十几未必是坏=>只是尝试看看。



文章来源: Datastore solution for tag search