2012-03-29 42 views
3

我正在创建一个自动完成服务,针对我的mongo db文章集合,其中用户可以开始输入文章的标题。它应该在标题中返回所有包含该关键字的帖子,并按“总计”字段进行排序。有没有办法优化mongo中的自动完成关键字查询

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

我看着执行计划,它看起来像扫描每个项目(完整的文章集合有10061项)。我试图暗示“lower_1”索引和“total_-1”索引,它们看起来很相似,但如果我为查询设置了50个限制数,那么总体索引似乎更好,而且带有较低的已扫描数字。有什么我可以做的优化?对于这种全文搜索,我无法想到任何简单的事情。

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

       } 
      ] 
     ] 
    } 

回答

6

我做对lowerCaseTitle正则表达式搜索任何地方出现的称号,不只是在一开始的话。

documentation

对于简单的前缀查询(也称为扎根的正则表达式),如/^prefix/,数据库使用索引时可用的和适当的(就像使用大多数SQL数据库一个LIKE 'prefix%'表达式的索引)。这只有在标志中没有i(不区分大小写)的情况下才有效。

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

但是,你可以做以下的支持开始给定的字符串的话:现在

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

,与TitleSearch索引和使用扎根正则表达式,用于'inter'搜索将返回的样本,也为'furious' ,但不适用于'eresting'

+0

我想我会做一个&&匹配匹配多个单词搜索...有没有建​​议如何使精确匹配首先显示?因此,“这是疯狂的”在先说“这是疯狂的”和“这是疯狂的”之前会首先展示上面的例子吗? – MonkeyBonkey 2012-03-29 23:16:27

+0

我不这么认为。如果您需要更高的保真度,我认为最好使用搜索专用解决方案,例如SolR,该解决方案还支持词干,分面搜索,结果排名以及更多与搜索相关的功能。 – mnemosyn 2012-03-30 07:11:31

相关问题