有没有办法在mongo中优化自动完成关键字查询

时间:2012-03-29 13:21:37

标签: mongodb

我正在为我的mongo db posts集创建一个自动完成服务,用户可以开始输入帖子的标题。它应返回标题中包含该关键字的所有帖子,并按名为“total”的字段排序。

我有一个名为“lower”的字段,它是我们要搜索的标题字段的小写版本,并且在其上设置了索引。由于我正在寻找任何关键字匹配,我正在对lowerCaseTitle进行正则表达式搜索,以查找出现在标题中任何位置的单词,而不仅仅是在开头。

我查看了执行计划,看起来像扫描每个项目(完整的帖子集合有10061项)。我试着暗示“lower_1”索引和“total_-1”索引并且它们看起来相似,但如果我为查询设置了限制数50,则总索引似乎更好,nscan编号更低。我可以做些什么来优化?对于这种全文搜索,我无法想到任何简单的问题。

"cursor" : "BtreeCursor lower_1",
    "nscanned" : 10061,
    "nscannedObjects" : 2,
    "n" : 2,
    "scanAndOrder" : true,
    "millis" : 154,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "lower" : [
            [
                "",
                {

                }
            ]
        ]
    }

1 个答案:

答案 0 :(得分:6)

  
    

我正在对lowerCaseTitle进行正则表达式搜索,以查找出现在标题中任何位置的单词,而不仅仅是在开头。

  

来自documentation

  
    

对于像/^prefix/,这样的简单前缀查询(也称为rooted regexps),数据库将在可用且适当时使用索引(非常类似于使用LIKE 'prefix%'表达式索引的大多数SQL数据库)。这仅在标志中没有i(不区分大小写)时才有效。

  

换句话说,不,MongoDB不支持快速搜索子字符串。

但是,您可以执行以下操作来支持以给定字符串开头的单词:

BlogPost { 
  Title : "This is furiously interesting post"
  TitleSearch : [ "this", "is", "furiously", "interesting", "post" ]
}

现在,在TitleSearch已建立索引并使用带有根的正则表达式的情况下,搜索'inter'将返回样本,同样针对'furious',但不针对'eresting'