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

时间:2015-12-28 02:24:16

标签: mongodb mongodb-query mongodb-indexes

我有一个包含以下架构的文档

{
  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
        },

1 个答案:

答案 0 :(得分:2)

这与字符串是数组的第一个元素或第二个元素无关。 “there”这个词出现在“英语”语言的停用词列表中,并没有添加到索引中。文本索引过程涉及在将术语添加到文本索引之前从文本中删除和删除停用词,这些过程与语言相关。

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

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

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