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. 自动化平台-环境搭建2-cmd 下mysql 卸载命令

    "" net stop mysql sc delete mysql rd /s /q "C:\Program Files\MySQL" rd /s /q &qu ...

  2. JMeter 简介

    JMeter 下载地址: https://jmeter.apache.org/ apipost 下载地址:(另外一个工具) https://www.apipost.cn/

  3. npm ERR! request to https://registry.npm.taobao.org/axios failed, reason: certificate has expired

    前言 一直使用 npm build没问题的,突然出现报错: npm WARN install Usage of the `--dev` option is deprecated. Use `--onl ...

  4. go time包:秒、毫秒、纳秒时间戳输出

    时间戳 10 位数的是以 秒 为单位: 13 位数的是以 毫秒 为单位: 19 位数的是以 纳秒 为单位: golang 中可以这样写: package main import ( "fmt ...

  5. selenium自动化测试-登录网站用户

    昨天学习了selenium自动化测试工具的入门,知道了Selenium是用于自动化控制浏览器做各种操作,打开网页,点击按钮,输入表单等等. 今天学习通过selenium自动化测试工具自动登录某网站用户 ...

  6. 大模型提示词(Prompt)模板推荐

    只有提示词写得好,与大模型的互动才能更高效.提示词不仅仅是与AI对话的起点,更是驱动模型产生高质量输出的关键因素.本文将介绍大模型提示词的概念.意义,并分享一些实用的提示词模板,帮助AI玩家更好地利用 ...

  7. Obsidian 笔记一键转换发布为 Jekyll 博客

    Obsidian 是一款功能强大且灵活的知识管理和笔记软件,与 Jekyll 这一轻量级静态博客框架的结合,既能保留 Obsidian 的网状知识关联优势,又能借助 Jekyll 的高效编译能力快速生 ...

  8. 【硬件】认识和选购4K画质的显卡

    2.6 认识和选购4K画质的显卡 显卡一般是一块独立的电路板,插在主板上接收由主机发出的控制显示系统工作的指令和显示内容的数字信号,然后通过输出模拟(或数字)信号控制显示器显示各种字符和图形,它和显示 ...

  9. 【Python】导出docx格式Word文档中的文本、图片和附件等

    [Python]导出docx格式Word文档中的文本.图片和附件等 零.需求 为批量批改学生在机房提交的实验报告,我需要对所有的实验文档内容进行处理.需要批量提取Word文档中的图片和附件以便进一步检 ...

  10. study Rust-7【使用结构体的demo】

    fn main() { let width1 = 30; let height1 = 50; println!( "The area of the rectangle is {} squar ...