我正在为我的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" : [
[
"",
{
}
]
]
}
答案 0 :(得分:6)
我正在对lowerCaseTitle进行正则表达式搜索,以查找出现在标题中任何位置的单词,而不仅仅是在开头。
对于像
/^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'
。