MongoDB $text 搜索未返回预期结果
MongoDB $text search not returning expected results
我根据 Mongo Collection 中的 title
和 main_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 的语言进行索引,以便在没有词干或停用词的情况下进行简单的标记化。
我根据 Mongo Collection 中的 title
和 main_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".
我目前已经解决了生产中的问题,方法是将 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 的语言进行索引,以便在没有词干或停用词的情况下进行简单的标记化。