elasticsearch RestHighLevelClient 关于document的常用操作 ---------- 编辑篇
es中的编辑分为:基于id的单条件编辑、自定义条件的编辑
基于id的单条件编辑:UpdateRequest
基于自定义条件的编辑:需借助底层脚本语言来实现有高低版本区分(见文章尾部)更新于2021-09-01
//es单条操作--修改文档(记录)
public String editEsDocument(){ //开始设置属性 Elasticsearch elasticsearch = new Elasticsearch(); elasticsearch.setUserName("张三"); elasticsearch.setAge(190); elasticsearch.setSex("男"); //创建修改文档的请求对象 UpdateRequest updateRequest = new UpdateRequest(); //指定要操作哪个索引下的那个id的值 updateRequest.index("user").id("sAMC7XgBrgVVHTXvmYL_"); //以json格式添加文档信息 updateRequest.doc(XContentType.JSON , "userName" , elasticsearch.getUserName(), "age" , elasticsearch.getAge(), "sex" , elasticsearch.getSex()); //像es服务器发送请求 UpdateResponse update = null; try { update = this.client.update(updateRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println("update es index _index is : " + update.getIndex()); System.out.println("update es index _id is : " + update.getId()); System.out.println("update es index _result is : " + update.getResult()); return "edit es index complete"; }
特殊情况:
基于ID的map数据类型修改操作
针对map数据类型的修改操作,可以依托实体类或自定义条件时设置的数据结构来进行,无须特殊处理。
public void mapTestUpdate(){ //通过实体类做修改属性 Map map = new HashMap(); map.put("数学" , "99"); // Person person = new Person(); // person.setAge(66); // person.setScoure(map); //通过自己拼装数据来修改属性 Map attrMap = new HashMap(); attrMap.put("age" , 25); attrMap.put("scoure" , map); //指定要操作哪个索引下的那个id的值 UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index("map_test"); updateRequest.id("9Pztx3kB0gyd9uM48juS"); // updateRequest.doc(com.alibaba.fastjson.JSON.toJSONString(person) , XContentType.JSON); updateRequest.doc(com.alibaba.fastjson.JSON.toJSONString(attrMap) , XContentType.JSON); //像es服务器发送请求 UpdateResponse update = null; try { update = this.client.update(updateRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println("update es index _index is : " + update.getIndex()); System.out.println("update es index _id is : " + update.getId()); System.out.println("update es index _result is : " + update.getResult()); }
自定义条件更新:
适用于低版本es例如6.6.2版本
调用的地方:
借助bool查询来确认修改数据的范围,must相当于and should相当于or。支持多条件检索
借助ctx._source来指定要修改哪些数据,须将被修改的数据拼接成字符串。支持多字段修改
BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); queryBuilder.must(QueryBuilders.termQuery("type", 1)); queryBuilder.must(QueryBuilders.termQuery("enpProjectCode.keyword", k));//相当于mysql中update的where部分,用于指定要修改哪些数据。字符串类型记得加keyword enpProjectDiagramInitDao.updateByQuery(queryBuilder, "ctx._source.enpProjectCode='" + v + "'");//相当于mysql中update的set部分,用于指定将数据修改成啥样
具体自定条件的执行的地方:
getClient是用于获取链接的根据自己的环境进行调整即可
getIndex getType用于获取当前被操作Index的信息
数据会以json格式的形式拼接进去像es服务发送请求来进行操作
public boolean updateByQuery(QueryBuilder query, String scriptStr) { boolean flag = true; RestClient lowClient = getClient().getLowLevelClient(); Map<String, Object> scriptMap = new HashMap<String, Object>(); scriptMap.put("source", scriptStr); scriptMap.put("lang", "painless"); String param = "{\"query\":" + query.toString() + ",\"script\":" + JSON.toJSONString(scriptMap) + "}"; HttpEntity entity = new NStringEntity(param, ContentType.APPLICATION_JSON); Map<String, String> map = new HashMap<String, String>(); try { Response res = lowClient.performRequest("POST", "/" + getIndex() + "/" + getType() + "/_update_by_query?conflicts=proceed&refresh=true", map, entity); if (res.getStatusLine().getStatusCode() != 200) { flag = false; } } catch (IOException e) { e.printStackTrace(); log.error(e.getMessage(), e); flag = false; } return flag; }
适用于高版本es例如7.X以上版本
//自定义条件更新
public void customUpdateCondition() throws IOException { //组装各种更新数据的条件。相当于mysql中update语句内的where部分 must=and should=or QueryBuilder edu = QueryBuilders.termQuery("education.keyword", "本科"); QueryBuilder weight = QueryBuilders.termQuery("weight", 110); RangeQueryBuilder totalScore = QueryBuilders.rangeQuery("totalScore"); totalScore.gte(86); totalScore.lte(1000); BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); queryBuilder.should(edu); queryBuilder.should(weight); queryBuilder.should(totalScore); UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest(); //指定具体要操作的索引 updateByQueryRequest.indices("user"); //加载更新数据。相当于mysql中update语句内的set部分 updateByQueryRequest.setQuery(queryBuilder); String setValuesStr = "ctx._source.userName='小明1';ctx._source.height='5544'"; Script script = new Script(ScriptType.INLINE, "painless", setValuesStr, Collections.emptyMap()); updateByQueryRequest.setScript(script); //更新 this.client.updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT); }