Квоты на appengine поиск API для Java

Я тестирую новый поисковый API для движка приложений для Java, и у меня есть следующий код, который пытается добавить ~3000 документов в индекс:

List<Document> documents = new ArrayList<Document>();
    for (FacebookAlbum album: user.listAllAlbums()) {
        Document doc = Document.newBuilder()
                .setId(album.getId())
                .addField(Field.newBuilder().setName("name").setText(album.getFullName()))
                .addField(Field.newBuilder().setName("albumId").setText(album.getAlbumId()))
                .addField(Field.newBuilder().setName("createdTime").setDate(Field.date(album.getCreatedTime())))
                .addField(Field.newBuilder().setName("updatedTime").setDate(Field.date(album.getUpdatedTime())))
                .build();
        documents.add(doc);
    }     

    try {
        // Add all the documents.
        getIndex(facebookId).add(documents);
    } catch (AddException e) {
        if (StatusCode.TRANSIENT_ERROR.equals(e.getOperationResult().getCode())) {
            // retry adding document
        }
    }

Однако я получаю следующее исключение:

Uncaught exception from servlet
java.lang.IllegalArgumentException: number of documents, 3433, exceeds maximum 200
at com.google.appengine.api.search.IndexImpl.addAsync(IndexImpl.java:196)
at com.google.appengine.api.search.IndexImpl.add(IndexImpl.java:380)
at photomemories.buildIndexServlet.doGet(buildIndexServlet.java:47)

Есть ли квота на количество документов, которые я могу вставить с добавленным вызовом, установленным на 200?

Если я попытаюсь вставить один документ за раз в индекс с помощью следующего кода:

 for (FacebookAlbum album: user.listAllAlbums()) {
        Document doc = Document.newBuilder()
                .setId(album.getId())
                .addField(Field.newBuilder().setName("name").setText(album.getFullName()))
                .addField(Field.newBuilder().setName("albumId").setText(album.getAlbumId()))
                .addField(Field.newBuilder().setName("createdTime").setDate(Field.date(album.getCreatedTime())))
                .addField(Field.newBuilder().setName("updatedTime").setDate(Field.date(album.getUpdatedTime())))
                .build();

         try {
            // Add the document.
            getIndex(facebookId).add(doc);
        } catch (AddException e) {
            if (StatusCode.TRANSIENT_ERROR.equals(e.getOperationResult().getCode())) {
                // retry adding document
            }
        }

    }     

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

com.google.apphosting.api.ApiProxy$OverQuotaException: The API call search.IndexDocument() required more quota than is available.
at com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.success(ApiProxyImpl.java:479)
at com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.success(ApiProxyImpl.java:382)
at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher$1.runInContext(RpcStub.java:786)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)

Я думал, что квота на вызовы API составляет 20 КБ / день (см. Здесь: https://developers.google.com/appengine/docs/java/search/overview).

Есть идеи о том, что происходит?

3 ответа

Решение

Здесь происходит несколько вещей. Что наиболее важно, и это то, что очень скоро будет разъяснено в документации, квота Search API Call также учитывает количество документов, которые добавляются / обновляются. Таким образом, один вызов Add, который вставляет 10 документов, уменьшит вашу ежедневную квоту на вызов API поиска на 10.

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

Все вышеизложенное означает, что, по крайней мере, на данный момент безопаснее не добавлять более 100 документов на один запрос на добавление. Делать это через Task Queue, как рекомендует Shay, тоже очень хорошая идея.

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

В документах также указывается квота в минуту, 20 тыс. Это всего 13,9 в минуту.

https://developers.google.com/appengine/docs/quotas

Другие вопросы по тегам