соответствующий индекс не найден - GAE - PullRequest
0 голосов
/ 13 июня 2018

Я развернул небольшой бэкэнд с некоторыми методами.Один из них делает простой запрос для получения списка объектов.Это метод:

@ApiMethod(path = "getMessagesByCity", name = "getMessagesByCity", httpMethod = ApiMethod.HttpMethod.POST)
    public MessageResponse getMessagesByCity(@Named("City_id") Long city) {
        MessageResponse response = new MessageResponse();
        List<Message> message = ofy().load().type(Message.class).filter("city", city).list();
        response.response = 200;
        return response;
    }

И это класс Message:

@Entity
public class Message {
    @Id 
    private Long id;
    private String name;
    @Index
    private Long city;
    ...
}

Я прочитал много постов, и все они упоминают, что, вероятно, это вызвано тем, что хранилище данных-indexes.xml не обновляется автоматически.Однако Google doc сообщает, что это (https://cloud.google.com/appengine/docs/standard/python/config/indexconfig):

Каждому запросу Cloud Datastore, сделанному приложением, требуется соответствующий индекс. Индексы для простых запросов, таких как запросы к одному свойству, создаются автоматически.

Итак, после этого я думаю, что связанные с индексом файлы мне не нужны.

Если я выполню метод "getMessagesByCity" с простым запросом:

List<Message> message = ofy().load().type(Message.class).filter("city", city).list();

Сервер возвращает мне ошибку 503 с этим сообщением журнала:

"com.google.appengine.api.datastore.DatastoreNeedIndexException: не найдено соответствующего индекса. Индекс отсутствует, но мы не можемчтобы сообщить вам, какой из-за ошибки в SDK App Engine. Если ваш запрос содержит только фильтры равенства, вам, скорее всего, нужен составной индекс для всех свойств, на которые ссылаются эти фильтры. "

Любая идея? Как я могу это решить?

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

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

В локальном dev, когда вы впервые нажмете на него, он должен работать, ОДНАКО при развертывании новых индексов, есть задержка, прежде чем он станет доступным в рабочей / appspotсервер.Мы много сталкивались с этим, и из консоли Google вы можете увидеть, выполняется ли она или нет, перейдя в Datastore> Indexes (https://console.cloud.google.com/datastore/indexes) для рассматриваемого проекта.

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

Если это ваша проблема, вы можете избежать ее в будущем, развернув index.yaml сначала через gcloud, а затем только развернув приложение.

альтернативно убедитесь, что вы выполнили новый метод / функцию на вашемлокальный, и убедитесь, что index.yaml действительно изменился, если вы используете Git или что-то такое, что файл должен был появиться как измененный после того, как локальный сервер запустил функцию / метод.

0 голосов
/ 13 июня 2018

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

gcloud app deploy index.yaml

См. https://cloud.google.com/datastore/docs/concepts/indexes для получения дополнительной информации об обработке запросов в Datastore ииндексы.

...