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)

添加调用设置为 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 调用的配额是 20k/天(请参见此处:https ://developers.google.com/appengine/docs/java/search/overview#Quotas )。

关于发生了什么的任何想法?

4

3 回答 3

8

这里发生了一些事情。最重要的是,这将很快在文档中阐明,搜索 API 调用配额也考虑了添加/更新的文档数量。因此,插入 10 个文档的单个 Add 调用将使您的每日 Search API 调用配额减少 10。

是的,可以在单个添加调用中索引的最大文档数为 200。但是,在此阶段还有一个短期突发配额,将您限制为每分钟大约 100 个 API 调用。

以上所有意味着,至少目前,每个添加请求不添加超过 100 个文档是最安全的。按照 Shay 的建议通过任务队列这样做也是一个非常好的主意。

于 2012-05-14T02:10:02.703 回答
3

我认为(无法找到验证)存在每分钟配额限制,您应该使用队列为文档编制索引,以确保逐步编制索引。

于 2012-05-12T21:15:49.910 回答
1

文档还提到了每分钟配额,20k 也就是每分钟 13.9 个。

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

于 2012-05-13T00:56:50.560 回答