"Неизвестная ошибка: mango_idx:: {no_usable_index,missing_sort_index}"}

У меня есть следующий запрос:

{'type': 'text', 
 'name': 'album-rating-text', 
 'index': {'fields': [
                      {'type': 'string', 'name': 'user_id'}, 
                      {'type': 'string', 'name': 'album_id'}, 
                      {'type': 'number', 'name': 'timestamp'}
]}}

Вот запрос:

{'sort': [
           {'user_id': 'desc'}, 
           {'album_id': 'desc'}, 
           {'timestamp': 'desc'}
         ], 
 'limit': 1, 
 'fields': ['user_id', 'album_id', 'timestamp'], 
 'selector': {
              '$and': [
                        {'user_id': {'$eq': 'a@a.com'}},         
                        {'album_id': {'$in': ['bf129f0d', '380e3a05'
                      ]
}}]}}

Ошибка:

{ 
 "error":"unknown_error",
 "reason":"Unknown Error: mango_idx :: {no_usable_index,missing_sort_index}"
}

Однако я видел похожий вопрос, все поля, по которым я индексирую, находятся в моем списке сортировки.


Обновление:

В качестве обходного пути я попытался упростить, удалив поле метки времени:

{"type": "text", 
 "name": "album-rating-text", 
 "index": {"fields": [
               {"type": "string", "name": "user_id"}, 
               {"type": "string", "name": "album_id"}
 ]}}

И запрос как так...

{"selector": {"$and": [
                   {"user_id": {"$eq": "a@a.com"}}, 
                   {"album_id": {"$in": ["bf129f0d", "380e3a05"]}
              }]}, 
 "fields": ["user_id", "album_id"]}

Я получаю следующую ошибку:

 {"warning":"no matching index found, create an index to optimize query time",
"docs":[
]}

3 ответа

Решение

Если я правильно помню, требования к моему запросу изменились, и я решил использовать стандартный индекс поиска Cloudant вместо индекса Mango.

Чтобы использовать функцию сортировки для настраиваемого поля, это поле необходимо вручную зарегистрировать в "Query-index".

Cloudant не делает этого, потому что это потребляет ресурсы:

"Пример в редакторе показывает, как индексировать поле" foo ", используя индекс типа json. Вы можете автоматически индексировать все поля во всех ваших документах, используя индекс текстового типа с синтаксисом" { "index": {}, "type": "text" }', обратите внимание, что индексирование всех полей может потреблять много ресурсов для больших наборов данных. "

Вы можете сделать это с помощью панели управления Cloudant. Перейдите в свою базу данных и найдите "Запрашиваемые индексы". Нажмите Изменить.

Добавьте свое поле в шаблон по умолчанию:

{
  "index": {
    "fields": [
      "user_id"
    ]
  },
  "type": "json"
}

Нажмите "Создать индекс"

Поле user_id теперь доступно для запроса, и теперь вы можете использовать функцию сортировки для него. Все поля необходимо добавить вручную, или вы можете зарегистрировать все поля как Query-index с помощью: { "index": {}, "type": "text" }

Видеоинструкция по созданию Query-индекса: https://www.youtube.com/watch?v=B3ZkxSFau8U

Попробуйте использовать индекс JSON вместо текстового индекса:

{
    "type": "json", 
    "name": "album-rating-text", 
    "index": {
        "fields": ["user_id", "album_id", "timestamp"]
    }
}
Другие вопросы по тегам