這一篇我們說一下Java 操作ES 如何進行數據doc更新,同樣可分爲 單個更新 與 批量更新,和刪除的 步驟一樣 你首先要進行定位操作 即 獲取 docID,然後 再進行操作
定位:indexName+typeName+docId
單個更新:
1通過增加進行覆蓋
/**
* 更新 單條 -數據 通過id
* @param obj
*/
public void updateInfo(OwnUsedAsset obj){
if(obj == null) return;
boolean exist = EsClientUtil.isExistIndex(name);
if(exist){
ESClient client = EsClientUtil.getDefaultDelegateClient();
QueryBuilder qb = QueryBuilders.termQuery("id", obj.getId());
SearchResponse respose = client.prepareSearch(name)
.setQuery(qb)
.setSize(1)
.execute().actionGet();
SearchHit[] hits = respose.getHits().getHits();
if(hits.length > 0){
// 先獲取文檔ID
String docId = hits[0].getId();
// 對數據進行更新
if(obj.getState()!= 2){
obj.setState(1);
}
obj.setUpdateTime(System.currentTimeMillis());
String data = JsonUtil.toJson(obj);
// 進行操作
client.prepareIndex(name, name)
.setId(docId)
.setSource(data)
.execute()
.actionGet();
}
}
}
這種方式 是 對整個文檔進行覆蓋更新,那麼 如果只改某個字段 該如何操作呢?
2. 更新 文檔中 某字段
/**
* HashMap<String, Object> editMap = new HashMap<>();
editMap.put("state", 3);
editMap.put("actionTime", 666666);
* setDoc("actionTime", 10000)
* 每次只能改一個,後面的會覆蓋前面的
* @param docId
*/
public void updateDataInField(String docId ,Map editMap){
boolean flag = EsClientUtil.isExistIndex(name);
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
client.prepareUpdate(name, name, docId)
.setDoc(editMap)
.execute().actionGet();
}
}
批量 更新:
/**
* 批量更新 信息
* @param downLineID
*/
public void bulkUpdateState(Set<String> downLineID ,Map editMap){
if(downLineID.size() == 0) return;
boolean flag = EsClientUtil.isExistIndex(name);
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
BulkRequestBuilder prepareBulk = client.prepareBulk();
for (String docId : downLineID) {
prepareBulk.add(client.prepareUpdate(name, name, docId).setDoc(editMap));
}
prepareBulk.execute().actionGet();
}
}
/**
* 批量更新 信息
* @param downLineID
*/
public void bulkUpdateState(Map<String,String> downLineID ,Map editMap){
if(downLineID.size() == 0) return;
boolean flag = EsClientUtil.isExistIndex(name);
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
BulkRequestBuilder prepareBulk = client.prepareBulk();
Set<String> entrySet = downLineID.keySet();
for (String docId : entrySet) {
editMap.put("remark", downLineID.get(docId));
prepareBulk.add(client.prepareUpdate(name, name, docId).setDoc(editMap));
}
prepareBulk.execute().actionGet();
}
}
一般來說這些 也就夠了,如果數據量 很大,則注意分段!