當我試圖在沒有指定某些字段的情況下更新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」)。
在我的情況下,我需要索引文件,如果不存在和更新,如果存在單個查詢 –
是的,這是一個普通的職位上會發生什麼特定的ID。但是,如果您打算進行部分更新或重新插入,則必須知道文檔是否存在,並且我認爲這不能在ElasticSearch的單個操作中完成。在ES中,您從不真正更新文檔,只能添加和刪除文檔,任何「更新」都會創建一個新條目並將舊條目標記爲刪除。在發佈創建或更新之前,您是否有理由不能檢查文檔是否存在? – Peter