2015-07-01 2 views
0

Вот модель «Класс», для которой я создал «текстовый» индекс для «ключевых слов», «lifeArea», «type».

Структура модели:

{ 
    "_id" : ObjectId("558cf6e3387419850d892712"), 
    "keywords" : "rama,seetha", 
    "lifeArea" : [ 
     "Emotional Wellness" 
    ], 
    "type" : "Pre Recorded Class", 
    "description" : "ram description", 
    "synopsis" : "ram syn", 
    "name" : "ram demo", 
    "__v" : 0 
} 

db.Class.getIndexes() 
// displaying index 
{ 
     "v" : 1, 
     "key" : { 
      "_fts" : "text", 
      "_ftsx" : 1 
     }, 
     "name" : "classIndex", 
     "ns" : "innrme.classes", 
     "weights" : { 
      "keywords" : 1, 
      "lifeArea" : 1, 
      "type" : 1 
     }, 
     "default_language" : "english", 
     "language_override" : "language", 
     "textIndexVersion" : 2 
} 

Я хочу, чтобы сделать поиск текста на полях, указанных выше. Я попробовал следующий запрос.

db.classes.find({$or:[{keywords: { $text: { $search: "rama abc" } } }, {type: {$text: { $search: "class" }}}],score: {$meta: 'textScore'}}); 

Но это не сработало, и я получил ошибку follwing

Error: error: { 
    "$err" : "Can't canonicalize query: BadValue unknown operator: $text", 
    "code" : 17287 
} 

Пожалуйста, помогите мне, чтобы получить правильный запрос. Пожалуйста, исправьте/просветите меня, если я ошибаюсь, задавая вопрос или объясняя проблему.

ответ

1

Эта фактическая ошибка говорит о том, что ваш mongodb является версией менее 2.6 (так что текстовый поиск таким образом). Но вы не можете этого сделать по двум причинам.

  1. Выражение $or может иметь только один специального выражения индекса, либо как «текст» или «геопространственный» в аргументах.

  2. Вы ожидаете текстового поиска на «двух» разных полях, и у вас может быть только один текстовый индекс на коллекцию. Однако этот единственный индекс может быть распространен по нескольким полям документа. Но вы не можете задавать разные условия поиска для разных полей.

Документация quote:

Вы не можете комбинировать текст выражения $, что требует специального текстового индекса, с оператором запроса, который требует другого типа специального индекса. Например, вы не можете комбинировать $ text выражение с оператором $ near.

И он должен также сказать «Вы не можете использовать $or с $text выражения или $near оператора, где либо используются более чем в одном состоянии.» Но эта небольшая часть информации отсутствует, но вы все еще не можете этого сделать.

Ваш синтаксис, как правило, не правильно, но даже с правильным синтаксисом в поддерживаемой версии MongoDB вы получите бы ошибка при попытке использовать $or вроде этого:

Error: error: { 
    "$err" : "Can't canonicalize query: BadValue Too many text expressions", 
    "code" : 17287 
} 

Итак, чтобы решить эту вам нужно:

  1. Чтобы иметь версию сервера MongoDB 2,6 или выше, поддерживающий синтаксис $text (или жить с командными формами)

  2. Чтобы жить с индексированием по нескольким полям и с использованием одного индекса.

  3. Выполнять «отдельные запросы» вместо ваших «или» условий и «комбинировать» результаты в интерфейсе API вашего клиента.

Это единственный способ получить «или» условия, подобные этому, с помощью текстового поиска MongoDB.

1

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

Пожалуйста, проверьте здесь: http://docs.mongodb.org/manual/administration/indexes-text/