在使用ES进行更新时遇到的实时刷新文档问题,目前ES并未提供根据具体参数修改对应文档,几乎所有更新修改的方法都是通过获取想要修改对象的ID来更新对应文档。
网上也基本没有这方面的解决方法,话不多说,直接上代码……
@Override
public JSONObject XXX(String userName, String userId, String Status) throws Exception {
//username是用户名,这里拿来做修改操作记录,userId是用户的id,Status是要修改的字段
BoolQueryBuilder countryQuery = new BoolQueryBuilder();
countryQuery.must(QueryBuilders.termsQuery("userId", userId));
SearchResponse searchResponse = ESConfigUtil.client
.prepareSearch("demo")
.setTypes("demo")
.setQuery(countryQuery)//查询用户ID,获取到该用户的对应文档
.setSearchType(SearchType.QUERY_THEN_FETCH)
.addSort("Time", SortOrder.DESC)//排序
.setSize(10000)//es默认是只返回十条json格式的文档,设置返回的数量即可
.execute()
.actionGet();
SearchHits hits = searchResponse.getHits();
JSONObject jsonResult = new JSONObject();
for (SearchHit hit : hits) {
String indexId = hit.getId();//这里获取到对应的文档ID
JSONObject jsonObject = JSONObject.parseObject(hit.getSourceAsString());
//更新es
UpdateRequest updateRequest = new UpdateRequest("demo", "demo", indexId);
String dealTime = DateUtil.formatDate(new Date());
String dealTimeT = DateUtil.formatString(dealTime, "yyyy-MM-dd'T'HH:mm:ss");
updateRequest.doc(XContentFactory.jsonBuilder()
.startObject()
.field("Status",Status)
.field("dealUser",userName)
.field("dealTime",dealTime)
.endObject())
.refresh(true)//更新并不是实时的,如果前端使用更新修改操作时,
//api中不设置刷新文档,会导致更新后需要显示的实时会数据缺失
//所以需要刷新文档来保证更新修改数据后是实时刷新
.retryOnConflict(5);
ESConfigUtil.client.update(updateRequest).actionGet();
}
jsonResult.put("result", "成功");
return jsonResult;
}
这是的java api操作es时实时更新的解决方法,还有其他方法,就不写出来了,基本都是同一个思路,欢迎留言讨论,需要转载请注明出处CSDN,谢谢!
ps:2018年8月18日16:06:30 修改注释说明