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); }

 

posted @ 2021-04-26 18:27  茴香饺子、  阅读(603)  评论(0编辑  收藏  举报