MongoDB: текстовый индекс с массивами, индексируется только первый термин

У меня есть документ со следующей схемой

{
  description : String,
  tags : [String]
}

Я проиндексировал оба поля как текст, но проблема в том, что всякий раз, когда я ищу определенную строку в массиве, он возвращает документ, только если строка является первым элементом массива. Поэтому кажется, что индекс $text работает только для первого элемента, это то, как работает монго по своей сути, или есть опция, которую нужно передать в индекс?

Пример документа

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

person naughty boy    schedule 28.12.2015    source источник
comment
У вас есть пример документа и запроса? Какая версия MongoDB?   -  person Explosion Pills    schedule 28.12.2015
comment
Добавлены дополнительные детали.   -  person naughty boy    schedule 28.12.2015


Ответы (1)


Это не имеет ничего общего с тем, что строка является первым или вторым элементом массива. Слово «там» находится в списке стоп-слов «английского» языка и вообще не добавляется в указатель. Процесс индексации текста включает выделение и удаление стоп-слов из текста до того, как термины будут добавлены в текстовый указатель, и эти процессы зависят от языка.

Вы можете создать текстовый индекс как:

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

Если в качестве языка по умолчанию используется «нет», то процесс индексации текста будет выполнять простую токенизацию и не будет использовать список стоп-слов. По умолчанию «английский» используется как «язык_по умолчанию» для текстового указателя.

person Nipun Talukdar    schedule 28.12.2015
comment
Обратите внимание, что вы должны удалить индекс перед его воссозданием. Вы также можете указать язык запроса как $language свойство $text - person Explosion Pills; 28.12.2015
comment
Отличный улов, я использовал эти термины в качестве заполнителей, и я сомневаюсь, что контент в финальном приложении когда-либо будет таким, но я определенно кое-чему научился. Спасибо. - person naughty boy; 28.12.2015