Tôi đang thử nghiệm các api công cụ tìm kiếm ứng dụng mới cho java và tôi đã đoạn mã sau mà cố gắng để thêm ~ 3000 tài liệu về một chỉ số:hạn ngạch trên api tìm kiếm appengine cho java
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
}
}
Tuy nhiên, tôi nhận được ngoại lệ sau:
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)
Có hạn ngạch về số lượng tài liệu tôi có thể chèn với cuộc gọi thêm được đặt thành 200 không?
Nếu tôi cố gắng để chèn một tài liệu tại một thời điểm chỉ số với đoạn mã sau:
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
}
}
}
Tôi nhận được ngoại lệ sau đây:
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)
Tôi nghĩ hạn ngạch trên api cuộc gọi là 20k/ngày (xem tại đây: https://developers.google.com/appengine/docs/java/search/overview#Quotas).
Mọi ý tưởng về những gì đang diễn ra?
Cảm ơn Peter! Thêm ~ 3k tài liệu đã đạt được bằng cách gọi thêm cùng một tài liệu tại một thời điểm và có hàng đợi nhiệm vụ với giới hạn tốc độ là 2/s - tỷ lệ hàng đợi mặc định (5/s) đã đạt đến giới hạn bùng nổ. Vì vậy, hiệu quả giới hạn tốc độ burst là> = 120 cuộc gọi API mỗi phút. –
Câu hỏi: Sau đó, có một lợi ích (nhanh hơn?) Khi gọi thêm nhiều tài liệu và nhiều cuộc gọi để thêm cùng một tài liệu tại một thời điểm? –
Việc kết hợp nhiều tài liệu vào một cuộc gọi thêm đơn giản hơn một chút. –