【问题标题】:MongoDB $text search not returning expected resultsMongoDB $文本搜索未返回预期结果
【发布时间】:2020-05-04 07:41:22
【问题描述】:

我基于 Mongo Collection 中的 titlemain_body 字段创建了一个文本索引。例如,我有一篇标题为“Abby Bengtsson”和她的名字“Abby”的文章,出现在 main_body 的整个实际文章中。

进行文本搜索查询:{$text: {$search: 'abby bengtsson'}},返回所需的文章以及更多文章。

但只是查询她的名字:{$text: {$search: 'abby'}},不会返回任何内容。

我尝试过使用 Mongo Compass、Downloaded 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”时,文档将被返回。

我目前已通过将language_overwrite 设置为一个不存在的虚拟字段来解决我的生产问题。现在所有字段都按应有的方式返回。但是瑞典语字段的东西仍然让我感到困惑,因为只有当我将该字段设置为“sv”时 - 拥有多个语言文档以及应该返回和搜索的文本索引有什么意义语言环境,如果它不适用于一种特定的语言变量?

【问题讨论】:

  • 试试这个 { $text: {$search: 'abby', $caseSensitive: false}}
  • 你是如何创建文本索引的?你能显示添加脚本吗?一些 json 格式的示例文档也会很好。

标签: mongodb indexing full-text-search


【解决方案1】:

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

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

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

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

根据 20 年 1 月 18 日添加到原始问题的新信息进行更新

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

值得注意的是,文本搜索是为使用启发式语言进行词干提取而设计的。这对于像“Abby”这样的专有名词(以及多语言搜索)会产生意想不到的结果。

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

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

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

他们真正想要的是他们得到的解决方案:他们应该使用无语言进行索引,以进行简单的标记化,无需词干或停用词。

【讨论】:

  • 啊啊啊啊啊!!!!!!我读错了文档.. 非常感谢.. 太傻了...
猜你喜欢
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多