2017-08-22 303 views
2

當我試圖在沒有指定某些字段的情況下更新elasticsearch中的文檔時,它將該字段更新爲null。這是我使用的代碼。用於索引文檔如何在更新Elasticsearch文檔時忽略空值的字段?

public class DocumentModel { 
@Id 
private String id; 
private Integer name; 
private String gender; 
private String url; 
private String documentID; 
------------------ 
------------------ 
getters and setters 
} 

代碼是:

Gson gson = new GsonBuilder().serializeNulls().create(); 
String json = gson.toJson(documentModel); 
IndexRequest indexRequest = new IndexRequest(indexName, typeName, documentModel.getId()); 
indexRequest.source(json); 
UpdateRequest updateRequest = new UpdateRequest(indexName, typeName, documentModel.getId()); 
updateRequest.doc(json); 
updateRequest.upsert(indexRequest); 
updateRequest.fields("documentID"); 
UpdateResponse updateResponse = elasticsearchTemplate.getClient().update(updateRequest).actionGet(); 

假設輸入(文檔模型)的(索引文件第一次):

{"id":1,"name":"tom","gender":"male","url":"http://www.google.com","documentID":1} 

它將索引爲:

{ 
     "_index": "index", 
     "_type": "type", 
     "_id": "1", 
     "_score": 1, 
     "_source": { 
      "name":"tom", 
      "gender":"male", 
      "url":"http://www.google.com", 
      "documentID":1 
     } 
    } 

但是,當我trie d更新同一個文檔與輸入:

{"id":1,"name":"archana","gender":"female"} 

它將作爲更新:

{ 
      "_index": "index", 
      "_type": "type", 
      "_id": "1", 
      "_score": 1, 
      "_source": { 
       "name":"archana", 
       "gender":"female", 
       "url":null, 
       "documentID":null 
      } 
     } 

的問題是,不作爲輸入給定的字段(例如「URL」,「documentID」)被設置爲null,而更新document.but但我希望該字段仍然是舊值,除非值不爲空(例如,「url」:「http://www.google.com」)。

回答

0

做增量更新是通過彈性支持使用_Update REST API調用,所以我想,如果你做的

updateRequest.update(indexRequest) 

代替

updateRequest.upsert(indexRequest) 

注意了Java API應該做同樣的是如果文檔不存在,則顯式更新將失敗,因此您需要在發出更新命令之前檢查它。

提供彈性和Java API的版本將是有益的

+0

在我的情況下,我需要索引文件,如果不存在和更新,如果存在單個查詢 –

+0

是的,這是一個普通的職位上會發生什麼特定的ID。但是,如果您打算進行部分更新或重新插入,則必須知道文檔是否存在,並且我認爲這不能在ElasticSearch的單個操作中完成。在ES中,您從不真正更新文檔,只能添加和刪除文檔,任何「更新」都會創建一個新條目並將舊條目標記爲刪除。在發佈創建或更新之前,您是否有理由不能檢查文檔是否存在? – Peter

1

我覺得你的問題是serializeNullsThe docs say

配置Gson序列化空字段。默認情況下,Gson在序列化過程中省略所有空字段。

我認爲這意味着你發送到Elasticsearch的請求,看起來像:

POST /index/type/1/_update 
{ 
    "doc": { 
    "name":"archana", 
    "gender":"female", 
    "url":null, 
    "documentID":null 
    } 
} 

它告訴你要與null寫了這些值Elasticsearch。如果你不想寫他們,你需要完全擺脫他們的要求,我認爲你可以通過擺脫serializeNulls()電話完成。

這是你必須在你的代碼或腳本更新中處理的東西(雖然我想不出你會這麼做的原因,除非你不控制代碼發出請求),或者您可以編寫一個插件來添加此行爲。

+0

Thanks.But我想ES中的一個選項,避免更新空值 –

+0

我不認爲這是可能的,除了腳本更新(這對我來說沒有多大意義),或者如果您編寫並安裝插件來添加此行爲。也許你可以更新這個問題來解釋爲什麼你不能在你的代碼中處理這個問題,而有人更可能提出一個可以滿足你需求的替代解決方案? – dshockley

相關問題