MongoDB $text 搜索未返回预期结果

MongoDB $text search not returning expected results

我根据 Mongo Collection 中的 titlemain_body 字段创建了一个文本索引。例如,我有一篇标题为 "Abby Bengtsson" 和她的名字 "Abby" 的文章,出现在 main_body.

中的整个实际文章中

进行文本搜索查询:{$text: {$search: 'abby bengtsson'}},return找到所需的文章,以及其他几篇文章。

但只是查询她的名字:{$text: {$search: 'abby'}},return没什么。

我试过使用 Mongo Compass、下载的 Studio 3T,并直接在服务器上使用 ssh 和终端命令。

但是我不明白为什么会这样..其他文章中的其他关键字也是如此。

JSON 文档示例

{
"_id" : ObjectId("5e0f4ded35fbd16f21bf3655"), 
    "category" : {
        "category_id" : "5010", 
        "slug" : {
            "0010" : "profiler", 
            "0020" : "profiler", 
            "0030" : "profiler"
        }, 
        "label" : {
            "0010" : "Profiler", 
            "0020" : "Profiler", 
            "0030" : "Profiler"
        }, 
        "bg_color" : "#B12CA6", 
        "txt_color" : "#ffffff", 
        "main_category_id" : "5000"
    }, 
    "featured_image" : {
        "main" : "https://img.norrbom.com/article/5e0f4d5e35fbd16f21bf3653/78805a221a988e79ef3f42d7c5bfd418-1578061277668/abby.jpg", 
        "mobile" : "https://img.norrbom.com/article/5e0f4d5e35fbd16f21bf3653/78805a221a988e79ef3f42d7c5bfd418-1578061277668/abby.jpg", 
        "square" : "https://img.norrbom.com/article/5e0f4d5e35fbd16f21bf3653/78805a221a988e79ef3f42d7c5bfd418-1578061277668/abby.jpg"
    }, 
    "metadata" : {
        "title" : "Abby Bengtsson", 
        "description" : "Hon sprudlar av energi och glädje, vilket smittar av sig på hela redaktionen när hon kliver in hos En Sueco. Med sig har hon sin ursöta följeslagare pomeranianen Melwin", 
        "og" : {
            "title" : "Abby Bengtsson", 
            "description" : "Hon sprudlar av energi och glädje, vilket smittar av sig på hela redaktionen när hon kliver in hos En Sueco. Med sig har hon sin ursöta följeslagare pomeranianen Melwin", 
            "image" : "https://img.norrbom.com/article/5e0f4d5e35fbd16f21bf3653/78805a221a988e79ef3f42d7c5bfd418-1578061277668/abby.jpg", 
            "type" : "article", 
            "site_name" : "En Sueco", 
            "url" : "https://www.ensueco.com/profil-abby-bengtsson"
        }, 
        "twitter" : {
            "title" : "Abby Bengtsson", 
            "description" : "Hon sprudlar av energi och glädje, vilket smittar av sig på hela redaktionen när hon kliver in hos En Sueco. Med sig har hon sin ursöta följeslagare pomeranianen Melwin", 
            "card" : "summary", 
            "image" : "https://img.norrbom.com/article/5e0f4d5e35fbd16f21bf3653/78805a221a988e79ef3f42d7c5bfd418-1578061277668/abby.jpg"
        }
    }, 
    "tags" : [

    ], 
    "title" : "Abby Bengtsson", 
    "state" : NumberInt(1), 
    "created" : ISODate("2020-01-01T04:17:00.000+0000"), 
    "modified" : ISODate("2020-01-01T08:27:54.000+0000"), 
    "version" : NumberInt(19), 
    "featured" : false, 
    "language" : "sv", 
    "magazines" : [

    ], 
    "slug" : "profil-abby-bengtsson", 
    "published" : ISODate("2020-01-02T10:14:00.000+0000"), 
    "published_until" : null, 
    "author_alias" : "Text: Sara Laine, sara@norrbom.com Foto: Mugge Fischer, mugge@norrbom.com", 
    "main_body" : "... stringified JSON object with article ...", 
    "article_id" : ObjectId("5e0f4d5e35fbd16f21bf3653"), 
    "origin" : "cms", 
    "site" : "0020", 
    "__v" : NumberInt(0)
}

编辑 18-01-2020

我刚刚测试了一些东西。看来,此问题仅发生在 language 属性 设置为 sv 的文档中(瑞典语根据 MongoDB Language Documentation)。如果我将值更改为 da(丹麦语),当我搜索 "Abby".

时,文档正在 returned

我目前已经解决了生产中的问题,方法是将 language_overwrite 设置为一个不存在的虚拟字段。现在所有字段都按应有的方式 return 编辑。但是瑞典语言字段的问题仍然让我感到困惑,因为只有当我将该字段设置为 "sv" 时才会出现这种情况 - 拥有多种语言文档和文本索引应该 [=51 有什么意义=] 并根据语言环境进行搜索,如果它不适用于一种特定的语言变量?

您使用的 MongoDB 是什么版本?该功能已将位版本更改为版本。有关详细信息,请参阅 https://docs.mongodb.com/manual/core/index-text/#versions

我在 4.2 中对此进行了测试并得到了您期望的结果。

为了对此进行测试,我在 Atlas (cloud.mongodb.com) 中创建了一个免费集群并加载了示例数据。然后我导航到 Collections 选项卡。示例数据包含一个名为 "sample_mflix" 的数据库和一个名为 "movies" 的 collection。我的 collection 有一个默认文本索引,涵盖以下字段:cast_text_fullplot_text_genres_text_title_text。

然后我导航到“查找”选项卡。当我 运行 您描述的搜索时,我得到了您期望的结果。 {$text: {$search: 'abby bengtsson'}} 和 {$text: {$search: 'abby'}} return 很多结果

根据 18-01-20 添加到原始问题的新信息更新

我与一位同事交谈,他向我解释了发生了什么事:

值得注意的是,文本搜索是为使用语言启发式进行词干设计的。对于像 "Abby" 这样的专有名词(以及 multi-language 搜索),这将产生意想不到的结果。

使用查询解释输出进行洞察,这就是正在发生的事情: - Abby 在瑞典语中源于 abby,而在英语中源于 abbi,因此根据文档中 sv 的语言值,该术语被索引为 abby。 - 没有任何语言的搜索将默认为英语(而不是尝试以所有可能的语言进行搜索),因此默认搜索将与索引词不匹配。

要搜索匹配索引语言,他们必须提供语言值,例如:db.articles.find({$text: {$search: 'abby', $language: 'sv' }}).

这按设计工作,但不符合用户的期望,即查询将被阻止以匹配所有可能的语言(就相关性而言,这可能是无益的结果)。

他们真正想要的是他们得出的解决方案:他们应该使用 none 的语言进行索引,以便在没有词干或停用词的情况下进行简单的标记化。