2012-05-12 37 views
9

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?

Trả lời

8

Có một vài điều đang diễn ra tại đây. Quan trọng nhất, và đây là một cái gì đó sẽ được làm rõ trong tài liệu rất sớm, hạn ngạch gọi API tìm kiếm cũng chiếm số lượng tài liệu được thêm/cập nhật. Vì vậy, một cuộc gọi Thêm duy nhất chèn 10 tài liệu sẽ giảm hạn ngạch Gọi API Tìm kiếm hàng ngày của bạn xuống 10.

Có, số lượng tối đa tài liệu có thể được lập chỉ mục trong một cuộc gọi thêm là 200. Tuy nhiên, ở giai đoạn này có cũng là một hạn ngạch bùng nổ ngắn hạn tại chỗ giới hạn cho bạn khoảng 100 cuộc gọi API mỗi phút.

Tất cả những điều trên có nghĩa là, ít nhất là, an toàn nhất là không thêm hơn 100 tài liệu cho mỗi yêu cầu Thêm. Làm như vậy thông qua Task Queue theo khuyến nghị của Shay cũng là một ý tưởng rất hay.

+0

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. –

+0

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? –

+0

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. –

3

Tôi nghĩ (không thể tìm thấy xác thực cho nó) có giới hạn hạn ngạch cho mỗi phút, bạn nên lập chỉ mục tài liệu của mình bằng hàng đợi để đảm bảo bạn dần dần lập chỉ mục cho chúng.

+0

Làm cách nào để sử dụng hàng đợi trợ giúp? Giới hạn tốc độ cho mỗi công việc hay là gì? –

+0

Chính xác. Giới hạn hàng đợi để tránh đạt đến giới hạn hạn ngạch. Google có hạn ngạch cho mỗi phút (mỗi giây?) Trên toàn bộ địa điểm. –

Các vấn đề liên quan