这一篇我们说一下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();
}
}
一般来说这些 也就够了,如果数据量 很大,则注意分段!