我正在测试适用于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)。
关于正在发生的事情的任何想法?
这里有一些事情发生。 最重要的是,这将很快在文档中澄清,搜索 API 调用配额还考虑了添加/更新的文档数量。 因此,插入 10 个文档的单个"添加"调用会将每日搜索 API 调用配额减少 10。
是的,单个添加调用中可以编制索引的最大文档数为 200。 但是,在此阶段,还有一个短期突发配额,将您限制为每分钟大约 100 次 API 调用。
以上所有内容都意味着,至少就目前而言,每个 Add 请求添加的文档不超过 100 个是最安全的。 按照 Shay 的建议通过任务队列执行此操作也是一个非常好的主意。
(找不到验证)每分钟有配额限制,您应该使用队列索引文档以确保逐步索引它们。
文档还提到了每分钟配额,20k 仅为每分钟 13.9
。https://developers.google.com/appengine/docs/quotas