MongoDB:带有数组的文本索引,只有第一个词被索引

Posted

技术标签:

【中文标题】MongoDB:带有数组的文本索引,只有第一个词被索引【英文标题】:MongoDB : text index with arrays, only first term is indexed 【发布时间】:2016-04-01 21:59:40 【问题描述】:

我有一个具有以下架构的文档


  description : String,
  tags : [String]

我已将这两个字段都编入了文本索引,但问题是每当我搜索 数组中的特定字符串,仅当字符串是数组的第一个元素时才会返回文档。因此,似乎 $text 索引仅适用于第一个元素,这是 mongo 固有的工作方式还是必须将选项传递给索引?

示例文档


   description : 'random description',
   tags : ["hello", "there"]

创建索引的对象

description : 'text', tags : 'text'

查询

db.myCollection.find($text : $search : 'hello');

返回一个文档但是

db.myCollection.find($text : $search : 'there');

不返回任何东西。

使用版本2.6.11

我还有其他索引,但这些是唯一的文本索引。这里是db.myCollection.getIndexes()的对应输出


                "v" : 1,
                "key" : 
                        "_fts" : "text",
                        "_ftsx" : 1
                ,
                "name" : "description_text_tags_text",
                "ns" : "myDB.myCollection",
                "weights" : 
                        "description" : 1,
                        "tags" : 1
                ,
                "default_language" : "english",
                "language_override" : "language",
                "textIndexVersion" : 2
        ,

【问题讨论】:

您有文档和查询的示例吗?什么版本的 MongoDB? 添加了更多详细信息。 【参考方案1】:

这与字符串是数组的第一个元素还是第二个元素无关。单词“there”在“english”语言的停用词列表中,根本没有添加到索引中。文本索引过程涉及在将术语添加到文本索引之前从文本中提取和删除停用词,这些过程取决于语言。

您可能希望将文本索引创建为:

db.myCollection.ensureIndex(description : 'text', tags : 'text',  default_language: "none" ) 

如果使用“无”作为默认语言,那么文本索引过程将进行简单的标记化,并且不会使用任何停用词列表。 默认情况下,“english”用作文本索引的“default_language”。

【讨论】:

请注意,您必须先删除索引,然后再重新创建它。您还可以将查询的语言指定为 $text$language 属性 很好,我使用这些术语作为占位符,我怀疑最终应用程序中的内容是否会这样做,但我确实学到了一些东西......谢谢

以上是关于MongoDB:带有数组的文本索引,只有第一个词被索引的主要内容,如果未能解决你的问题,请参考以下文章

更新 mongodb 中的嵌套数组

带有索引字段的 MongoDB 正则表达式

MongoDB:数组元素属性的唯一索引

Ruby操作MongoDB(进阶十)--文本搜索text search

如何在Vue中将格式化的输入文本存储到带有索引的数组中?

带有嵌套对象的 MongoDB 上的 2d 索引