【问题标题】:Is there a way to optimize an auto-complete keyword query in mongo有没有办法优化 mongo 中的自动完成关键字查询
【发布时间】:2012-03-29 22:30:22
【问题描述】:

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

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

我查看了执行计划,它看起来像是对每个项目进行了扫描(完整的帖子集合有 10061 个项目)。我尝试提示“lower_1”索引和“total_-1”索引,它们看起来很相似,但是如果我将查询的限制数设置为 50,则总索引看起来更好,并且 nscanned 数较低。有什么我可以做的优化吗?对于这种全文搜索,我想不出任何简单的东西。

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

                }
            ]
        ]
    }

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

    来自documentation

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

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

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

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

    现在,将TitleSearch 编入索引并使用有根正则表达式,搜索'inter' 将返回样本,同样是'furious',但不是'eresting'

    【讨论】:

    • 我想我会做一个 && 匹配以匹配多个单词搜索...有没有关于如何首先显示完全匹配的建议?所以“This is furiously”会先显示上面的例子,然后再说“furiously this is”和“is this furiously”?
    • 我不这么认为。如果您需要更高的保真度,我想最好使用搜索专用解决方案,例如 SolR,它还支持词干提取、分面搜索、结果排名和更多与搜索相关的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多