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

时间:2020-01-17 12:03:06

标签: mongodb indexing full-text-search

我在Mongo集合中的index.tstitle字段的基础上创建了文本索引。例如,我有一篇标题为“ Abby Bengtsson”和她的名字“ Abby”的文章,出现在main_body的实际文章中。

进行文本搜索查询:main_body,返回所需的文章以及更多文章。 enter image description here

但是只需查询她的名字{$text: {$search: 'abby bengtsson'}},就不会返回任何内容。 enter image description here

我尝试使用Mongo Compass,Downloaded Studio 3T,并直接在服务器上使用ssh和terminal命令。 enter image description here

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

JSON文档示例

{$text: {$search: 'abby'}}

编辑18-01-2020

我刚刚测试了一些东西。看来,仅将{ "_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) } 属性设置为language(根据MongoDB Language Documentation的瑞典语)的文档会出现此问题。如果我将值更改为sv(丹麦语),则当我搜索“ Abby”时将返回文档。

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

1 个答案:

答案 0 :(得分: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'}}都返回许多结果

更新基于18-01-20原始问题中添加的新信息

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

值得注意的是,文本搜索是为阻止语言启发式而设计的。使用专有名词(例如“ Abby”)(以及多语言搜索)会产生意想不到的结果。

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

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

这是按设计要求工作的,但与用户期望查询将被阻止以匹配所有可能的语言(从相关性上来说这可能是无益的结果)的期望不符。

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