13

У меня проблемы с индексами индекса приложений Google. При запуске моего приложения через приложение GoogleAppEngineLauncher приложение работает нормально. При развертывании приложения, я получаю следующее сообщение об ошибке:Ошибка Google App Engine: NeedIndexError: не найдено ни одного совпадающего индекса

NeedIndexError: no matching index found. 
The suggested index for this query is: 
- kind: Bar 
    ancestor: yes 
    properties: 
    - name: rating 
    direction: desc 

Ошибка генерируется после этой строки кода:

bars = bar_query.fetch(10) 

Перед выше строки кода, он читает:

bar_query = Bar.query(ancestor=guestbook_key(guestbook_name)).order(-Bar.rating) 

В файле index.yaml содержится точный «предложенный» индекс ниже # АВТОРИЗАЦИЯ:

- kind: Bar 
    ancestor: yes 
    properties: 
    - name: rating 
    direction: desc 

Возможно, мне что-то не хватает? Я удалил файл index.yaml и снова развернул приложение (через командную строку), и один файл был загружен, поэтому файл index.yaml существует.

Все работает нормально на месте. Я работаю над последним Mac OSx. Команда, используемая для развертывания был:

appcfg.py -A app-name --oauth2 update app 

хранилищу я реализовал свободно на основе приложения гостевой книги учебник.

Любая помощь была бы принята с благодарностью.

EDIT:

Мой ndb.Model определяются следующим образом:

class Bar(ndb.Model): 
    content = ndb.StringProperty(indexed=False) 
    lat = ndb.FloatProperty(indexed=False) 
    lon = ndb.FloatProperty(indexed=False) 
    rating = ndb.IntegerProperty(indexed=True) 
    url = ndb.TextProperty(indexed=False) 

ответ

9

https://appengine.google.com/datastore/indexes Проверьте, чтобы увидеть, если этот показатель присутствует и статус установлен в "обслуживании". Возможно, индекс все еще строится.

Среда разработки эмулирует производственную среду. На самом деле у него нет индексов в смысле Datastore.

+0

Hi @Andrei, спасибо, я был там. В нем говорится: «Вы не создали индексы для этого приложения. Некоторые типы запросов требуют создания индекса. Вы можете управлять своими индексами в файле index.yaml». На других форумах я читал, что при использовании index.yaml он никогда не говорит «обслуживать». – ISJ

+0

Я где-то читал: «Индекс, который вы указали в свой файл datastore-index.xml, является единственным индексом свойств. Это означает, что он автоматически создается Datastore и не будет отображаться в вашей консоли». – ISJ

+0

Вы правы - индексы единичного имущества не обязательно должны быть определены, и они не будут отображаться на индексной странице. Я забыл спросить очевидное: это свойство индексировано? –

3

Я исправил эту проблему, перемещая индекс, который, по словам ошибки, отсутствует над строкой автоматического генерации в файле index.yaml.

В вашем случае файл YAML будет выглядеть следующим образом:

indexes: 
- kind: Bar 
ancestor: yes 
properties: 
- name: rating 
    direction: desc 

# AUTOGENERATED 

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

appcfg.py [options] update_indexes <directory> 

С каталогом, являющейся каталогом относительно вашего файла index.yaml. Затем вы должны увидеть этот индекс на приборной панели: https://appengine.google.com/datastore/indexes

Обновление первоначально будет «ожидающим», но после того, как в индексе указывается «обслуживание», вы сможете сделать свой запрос.

+0

app.yaml должен находиться в той же папке, что и index.yaml для работы выше. И командной строке это не нравится, если index.yaml находится в корневой папке. И SDK не нравится, если app.yaml находится в папке маршрута. Решение. Мне пришлось временно разместить оба файла app.yaml и index.yaml в папке config. –

10

Вероятно, немного поздно, но запуск «gcloud app deploy index.yaml» помог с момента запуска развертывания сам проигнорировал файл index.yaml.

Как уже говорилось, приборная панель на https://appengine.google.com/datastore/indexes покажет «ожидающий» время.

+3

Если вы используете команды appcfg.py или appcfg.sh для развертывания приложения в App Engine, файл конфигурации индекса автоматически развертывается. Если вы используете команду развертывания приложения gcloud для развертывания вашего приложения, файл конфигурации индекса не будет автоматически развернут. Вы должны либо указать list index.yaml в качестве аргумента для развертывания приложения gcloud, либо запустить gcloud datastore create-indexes для развертывания файла конфигурации индекса. – afed

2

Я наткнулся на ту же проблему, и ваши комментарии помогли мне в правильном направлении. Вот что Google говорит, как справиться с этим:

Согласно документации Google истории является то, что с помощью

gcloud app deploy 

файла index.yaml не загружается (вопрос, почему нет?). В любом случае, нужно загрузить этот индексный файл вручную.

Для этого, документация дает следующую команду:

gcloud datastore create-indexes index.yaml 

(предположим, что вы выполняете это из той же директории файла index.yaml) После того, как вы сделали это, вы можете пойти в Datastore консоль, и вы увидите, что индекс был создан. Затем он начнет индексироваться (занял около 5 минут в моем случае), и как только индекс будет обслуживаться, вы можете запустить свое приложение.