9

Java 用の新しいアプリ エンジン検索 API をテストしており、インデックスに ~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)

add 呼び出しを 200 に設定して挿入できるドキュメントの数に制限はありますか?

次のコードを使用して、一度に 1 つのドキュメントをインデックスに挿入しようとすると:

 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 呼び出しの割り当ては 1 日あたり 20,000 だと思いました (こちらを参照してください: https://developers.google.com/appengine/docs/java/search/overview#Quotas )。

何が起こっているかについてのアイデアはありますか?

4

3 に答える 3

8

ここでいくつかのことが起こっています。最も重要なことは、これはすぐにドキュメントで明確化されることです。検索 API 呼び出しのクォータは、追加/更新されるドキュメントの数も考慮します。したがって、10 個のドキュメントを挿入する Add 呼び出しを 1 回行うと、毎日の Search API 呼び出し割り当てが 10 減少します。

はい。1 回の追加呼び出しでインデックスを作成できるドキュメントの最大数は 200 です。ただし、この段階では、1 分あたり約 100 の API 呼び出しに制限する短期間のバースト クォータも設定されています。

上記のすべては、少なくとも現時点では、Add リクエストごとに 100 を超えるドキュメントを追加しないことが最も安全であることを意味します。Shay が推奨するように、Task Queue を介してこれを行うことも非常に良い考えです。

于 2012-05-14T02:10:02.703 に答える
3

1分あたりのクォータ制限があると思います(検証が見つかりません)。キューを使用してドキュメントにインデックスを付け、徐々にインデックスを作成するようにする必要があります。

于 2012-05-12T21:15:49.910 に答える
1

ドキュメントには 1 分あたりのクォータも記載されていますが、20k は 1 分あたりわずか 13.9 です。

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

于 2012-05-13T00:56:50.560 に答える