【问题标题】:MongoDB - Tag based search with autocompleteMongoDB - 基于标签的自动完成搜索
【发布时间】:2016-05-27 06:25:34
【问题描述】:

我正在寻找实现标签搜索功能并在效率方面寻求一些建议。我是 MongoDB 新手,所以我不确定性能方面的最佳实践。

好的,所以我想创建一个链接共享应用程序,用户根据其内容标记链接。例如,有趣的狗图像将被标记为“有趣”和“狗”。一个链接会有一个:

 title, 
 url, 
 user_id, 
 tags: array of tags

现在,为了让用户能够搜索链接,我需要一个所有使用标签的列表。为了可用性,这需要具有自动完成功能。因此,我进行了一些研究并使用一组标签进行了测试,我在其中索引了标签值,例如“有趣”,然后使用正则表达式。

 db.tags.find({value:/^search/})

它收集了 600,000 个文档,在 63 毫秒内搜索了所有以“s”开头的文档。随着搜索词的长度增加,执行时间会减少。

现在是我不确定的部分。比如说我想找到所有带有“有趣”和“狗”标签的链接(需要使用相交)。我应该如何存储标签?我应该存储每个标签的对象 ID 吗?我可以索引这些对象 ID 吗?有没有其他方法来构建整个数据库?

我还希望能够根据他们已经输入的标签推荐标签。例如,我正在考虑在标签文档中添加一个相关字段:

tag
----
id
value
related: [{
   tag_id
   count
}]

(再次不确定,因为它会建议可能与已输入标签之一相关而不与另一个相关的标签。相交这将不返回任何结果。)

任何建议将不胜感激。

编辑:错误

【问题讨论】:

  • 使用您当前的数据模型并可能存储标签和相关标签的 ID...您是否考虑过“$setIntersection”聚合查询?或者这就是您所说的“使用相交”。我认为通过将标签存储在一个单独的集合中,每个集合都有一个相关标签列表,您走在了正确的轨道上。
  • 是的,对不起,这就是我的意思。我想我可以设置所有相关标签的交集。

标签: mongodb performance


【解决方案1】:

在标签数组上创建一个文本索引。这将使您能够快速搜索funny、dog 和funny or dog。

https://docs.mongodb.com/manual/core/index-text/

db.tags.createIndex( { tags: "text" },  {background:true}  )

至于相关标签,我认为您不想引用 _id 值。您可能可以嵌入一系列相关标签,例如:

relatedTags: [{tag1}, {tag2}]

【讨论】:

  • 鉴于有 600k 个文档,您可能希望在创建索引时做背景设置。 db.tags.createIndex( { tags: "text" }, {background:true} )
  • 谢谢。我会调查的。我不知道在构建索引时无法执行读写操作。
  • 是的!我过去做过的最令人沮丧的事情之一。锁定一个需要一个小时才能构建的索引的读取是可怕的。
  • 很对,在后台创建索引。我更新了答案。
猜你喜欢
  • 2015-07-20
  • 2018-09-18
  • 2022-10-24
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多