2017-08-30 28 views
1

我正在嘗試在我的ES系統上執行Upsert。當我運行下面這段代碼:彈性搜索,Java API:驗證失敗:1:腳本或文檔丟失;

 ObjectMapper objectMapper = new ObjectMapper(); 
     String json = objectMapper.writeValueAsString(m); 
     String id = m.getId(); 
     IndexRequest indexRequest = new IndexRequest("mediaitems", "mediaitem", m.getId()) 
       .source(json); 

     UpdateRequest updateRequest = 
       new UpdateRequest("mediaitems", "mediaitem", m.getId()).upsert(indexRequest); 
     client.update(updateRequest).get(); //Throws error here 

它拋出和錯誤的

"java.util.concurrent.ExecutionException: 
org.elasticsearch.action.ActionRequestValidationException: Validation 
Failed: 1: script or doc is missing;" 

當我註釋掉UpdateRequest代碼,並與一個普通的插去,它正確的行爲。

這是怎麼回事?我這樣做是因爲我想避免讀取ES上存在的所有可能爲的文檔,然後進行插入或更新循環。

對於這個問題可能會有什麼幫助,我們將不勝感激。

+1

我還沒有使用Java API與ES,但根據錯誤,它可能是你沒有設置:'updateRequest.doc()' – alfasin

+0

看起來像索引或類型可能是錯誤的 – Nandakumar

+0

什麼是真正的用途你想實施的情況? – Val

回答

0

這是正確的版本即不會引發錯誤,代碼:

ObjectMapper objectMapper = new ObjectMapper(); 
    String json = objectMapper.writeValueAsString(m); 
    String id = m.getId(); 
    IndexRequest indexRequest = new IndexRequest("mediaitems", "mediaitem", m.getId()) 
      .source(json); 

    UpdateRequest updateRequest = 
      new UpdateRequest("mediaitems", "mediaitem", m.getId()).upsert(indexRequest); 

    //Fix is the line below 
    updateRequest.doc(indexRequest); 



    client.update(updateRequest).get(); 

有一次,我從加建議@alfasin的「updateRequest.doc」行,它的工作就像一個魅力。