Индекс полнотекстового поиска MongoDB: ошибка: слишком много текстового индекса, почему?

У меня есть одна проблема, у меня есть коллекция, и я хочу установить индекс текстового поиска в 2 поля (описание и заголовок). Но когда я добавляю второй индекс, я получаю следующую ошибку, и текстовый поиск перестал работать.

{ "serverUsed" : "localhost/127.0.0.1:27017" , "ok" : 0.0 , "errmsg" : "too many text index for: testdb.users"}

когда я удаляю один индекс, поиск снова начинает работать. в чем проблема? Одни коллекции поддерживают индекс полнотекстового поиска только для одного поля????

Я использую текущую версию mongodb под Windows, и я использую API драйвера java mongodb.

Спасибо


person Armen Arzumanyan    schedule 22.12.2013    source источник
comment
У вас есть более одного текстового индекса, в настоящее время вы можете иметь только один, вам нужна эта ссылка: docs.mongodb.org/manual/tutorial/   -  person Sammaye    schedule 23.12.2013
comment
Проблема в том, что затем я добавляю второй текстовый индекс в ту же коллекцию, полнотекстовый поиск перестает работать, и я получаю эту ошибку. Кажется, для нескольких полей текстовый поиск не работает.   -  person Armen Arzumanyan    schedule 23.12.2013
comment
Можете ли вы показать нам пример, где несколько полей не работают? Вы должны иметь возможность обеспечить один индекс для нескольких полей.   -  person Sammaye    schedule 23.12.2013
comment
Может быть, это: stackoverflow.com/questions/18385853/ (в комментариях)   -  person WiredPrairie    schedule 23.12.2013


Ответы (2)


MongoDB допускает только один текстовый индекс для каждой коллекции.

Но вы можете использовать текстовый индекс, который охватывает несколько полей:

db.collection.ensureIndex( {
    description: "text",
    title: "text"
} );

Таким образом, вы получите результаты, когда искомая фраза будет найдена в любом из них. Когда это не то, что вам нужно, например, когда у вас есть два поисковых запроса, каждый из которых возвращает результат из одного поля, но не из другого, у вас есть два варианта.

  1. используйте текстовый индекс с несколькими полями, но отбрасывайте результаты, полученные из неправильного поля на прикладном уровне.
  2. извлечь одно из двух полей в другую коллекцию. Документы в этой коллекции могут содержать полные копии, отредактированные копии или только поле, которое вы индексируете, и _id исходного документа.
person Philipp    schedule 23.12.2013
comment
Спасибо, это работает! Де-факто один индекс для нескольких полей верен, я пытался добавить один индекс для одного поля, почему монго терпит неудачу. Спасибо. - person Armen Arzumanyan; 23.12.2013
comment
Привет, я новичок в узле и не знаю, куда поместить этот синтаксис. Откуда берется «дб»? - person ac360; 17.04.2014
comment
@ac360 ac360 Синтаксис, используемый в этом вопросе и ответе, относится к оболочке командной строки mongodb. - person Philipp; 15.07.2015
comment
Вы знаете, почему у них есть этот лимит? Я пытался поискать, но не нашел причины, только утверждения о том, что предел существует. - person Neal Gokli; 20.05.2017
comment
Это кажется довольно большим ограничением. Это нужно исправить, потому что мне, возможно, придется пересмотреть свой выбор БД в будущем. - person Michael; 27.06.2019

Чтобы создать текстовый индекс по ключу, используйте команду db.collectionName.ensureIndex({'textColumnName': 'text'}). После применения этого индекса используйте команды поиска для поиска слова, например db.collectionName.find({$text: {$search:'your text here'}}). Существует текстовая оценка, на основе которой ранжируются результаты, чтобы увидеть, как она проецируется в ключе оценки, например: db.collectionName.find({$text: {$search:'your text here'}}, {score: {$meta: 'textScore'}}).sort({score: {$meta: 'textScore'}}).

Если мы создадим текстовый индекс для поля title коллекции movies, а затем выполним текстовый поиск db.movies.find( { $text : { $search : "Big Lebowski" } } ). Следующие документы будут возвращены, при условии, что они находятся в коллекции фильмов:

  • { "title" : "The Big Lebowski" , star: "Jeff Bridges" }

  • { "title" : "Big" , star : "Tom Hanks" }

  • { "title" : "Big Fish" , star: "Ewan McGregor" }

Это потому, что на Big и Lebowski будет выполнено ***логическое ИЛИ***.

person Zameer Ansari    schedule 05.09.2016