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

elasticsearch RestHighLevelClient 关于document的常用操作 ---------- 编辑篇的更多相关文章

  1. Elasticsearch本地环境安装和常用操作

    本篇文章首发于我的头条号Elasticsearch本地环境安装和常用操作,欢迎关注我的头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech)获取更多干 ...

  2. 数据结构之链表-链表实现及常用操作(C++篇)

    数据结构之链表-链表实现及常用操作(C++篇) 0.摘要 定义 插入节点(单向链表) 删除节点(单向链表) 反向遍历链表 找出中间节点 找出倒数第k个节点 翻转链表 判断两个链表是否相交,并返回相交点 ...

  3. ElasticSearch之映射常用操作

    本文案例操作,建议先阅读我之前的文章<ElasticSearch之安装及基本操作API> Mapping (映射)类似关系型数据库中的表的结构定义.我们将数据以 JSON 格式存入到 El ...

  4. Elasticsearch(ES)API 增删查改常用操作

    常用操作 查询所有数据 POST http://192.168.97.173:27009/logstash_test_2018/doc/_search { "query": { & ...

  5. 【3】Chrome 的一些常用操作

    记录一些 Chrome 的常用操作 1. 让页面可以编辑 1). 在 控制台 输入 document.designMode = 'on';  链接地址>>

  6. elasticsearch RestHighLevelClient 使用方法及封装工具

    目录 EsClientRHL 更新日志 开发原因: 使用前你应该具有哪些技能 工具功能范围介绍 工具源码结构介绍 开始使用 未来规划 git地址:https://gitee.com/zxporz/ES ...

  7. vim(vi)常用操作及记忆方法

    vi(vim)可以说是linux中用得最多的工具了,不管你配置服务也好,写脚本也好,总会用到它.但是,vim作为一个“纯字符”模式下的工具,它的操作和WINDOWS中的文本编辑工具相比多少有些复杂.这 ...

  8. linux常用操作指令

    Linux常用操作指令: 常用指令 ls        显示文件或目录 -l           列出文件详细信息l(list) -a          列出当前目录下所有文件及目录,包括隐藏的a(a ...

  9. java与.net比较学习系列开发环境和常用调试技巧常用操作快捷键

    调试         F5 F11 调试运行   CTRL+F5 暂无 非调试运行   F6 不适用 编译整个解决方案   SHIFT+F6 不适用 编译当前选择的工程   SHIFT+F5 CTRL ...

  10. (转载)StringGrid常用属性和常用操作

    Delphi StringGrid常用属性和常用操作 StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控 ...

随机推荐

  1. Selenium KPI接口 iframe切换

    应用场景: 在编写脚本的时候,经常会发现最熟悉的错误"元素定位不到",此时如果你查看页面元素,有可能你会发现元素在>标签对之间. 此时,我们只有先将代码驱动切换到frame内 ...

  2. DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed

    前言 DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed 遇到 "Public Key Retrieval is not allo ...

  3. node_modules/@umijs/runtime" does not exist in container.

    使用 umi 脚手架搭建项目,启动时报错 node_modules/@umijs/runtime" does not exist in container. 出现问题 .umi 是临时文件夹 ...

  4. 搭建自己的OCR服务,第一步:选择合适的开源OCR项目

    一.OCR是什么? 光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程. 亦即将图像中的文字进行识别 ...

  5. Object类--toString方法--java进阶day05

    1.Object类.以及通用的类 2.toString方法 默认的toString方法,返回的是地址值(全类名再加上通过地址值算出来的十六进制哈希值) . 为什么打印语句会自动调用toString方法 ...

  6. 话说Hangfire

    参考文档 www.hangfire.io github.com/HangfireIO/Hangfire .NET Core开源组件:后台任务利器之Hangfire

  7. creative打靶学习笔记(4)

    参考视频[Tryhackme系列网安课程-Creative-难度3-哔哩哔哩] https://b23.tv/6qzkzyh nmap扫描![](https://cdn.nlark.com/yuque ...

  8. 2020年devops的7个发展趋势

    2020年devops的7个发展趋势 2019年对DevOps从业者来说是激动人心的一年,DevOps继续快速增长.大多数组织都在执行或评估他们的DevOps策略.那么,到2020年,DevOps.基 ...

  9. MONyog入门总结

    1.安装步骤 1)安装MONyog_6.6.3.exe文件,步骤如下: 2)停止MONyog服务 3)将MONyog.exe和MONyog-patch.exe文件放到E:\MONyog\bin目录下 ...

  10. AI浏览器自动化实战

    只需一句话,AI 即可自动操作浏览器: 搜索商品: 下单支付: 甚至还能进行深度研究(Deep Research),自动生成完整的攻略报告: Browser use 是一个开源项目,使 AI 大模型能 ...