ES UpdateByQuery Java Api
时间:2022-07-24
本文章向大家介绍ES UpdateByQuery Java Api,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
为什么要整理ES UpdateByQuery的API?因为我当时写的时候有点费劲,官网给了Nested结构的Java Api一些例子,但是我觉得就是草草了事,官网更加侧重于DSL语句的语法。我理解的Api就是拿来即用,不要浪费太多时间。
我们就拿学生和爱好也举例子,爱好为嵌套结构,一个学生的爱好可以有多个。
把出生日期是1999年9月9日的童鞋,备注更新为重阳节活动候选人(根据条件更新某个字段):
public void testUpdateField() {
UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest("student");
Map<String, Object> paramsMap = new HashMap<String, Object>();
paramsMap.put("mark", "重阳节活动候选人");
ScriptType type = ScriptType.INLINE;
String lang = "painless";
updateByQueryRequest.setScript(new Script(type, lang, "ctx._source.mark= params.mark", paramsMap));
updateByQueryRequest.setQuery(new TermQueryBuilder("birthday.keyword", "1999-9-9"));
updateByQueryRequest.setBatchSize(100);
updateByQueryRequest.setAbortOnVersionConflict(false);
this.getResponseBySearchRequest(updateByQueryRequest);
}
把所有的男童鞋,爱好增加一个看美女(根据条件把嵌套类型hobbyList增加一个爱好):
public void testNestedAdd() {
UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest("student");
HobbyDto hobbyDto = new HobbyDto();
hobbyDto.setId(102);
hobbyDto.setName("看美女");
Map<String, Object> params = BaseUtil.java2Map(hobbyDto);
Map<String, Object> parameters = Collections.singletonMap("jsonMap", params);
ScriptType type = ScriptType.INLINE;
String lang = "painless";
updateByQueryRequest.setScript(new Script(type, lang, "ctx._source.hobbyList.add(params.jsonMap)", parameters));
updateByQueryRequest.setQuery(new TermQueryBuilder("sex.keyword", "男"));
updateByQueryRequest.setBatchSize(100);
updateByQueryRequest.setAbortOnVersionConflict(false);
this.getResponseBySearchRequest(updateByQueryRequest);
}
把名字叫曹尼玛的童鞋,爱好是102(看美女)的同学删除掉:
public void testNestedDelete() {
UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest("student");
Map<String, Object> paramsMap = new HashMap<String, Object>(16);
paramsMap.put("id", 102);
ScriptType type = ScriptType.INLINE;
String lang = "painless";
updateByQueryRequest.setScript(new Script(type, lang, "ctx._source.hobbyList.removeIf(item -> item.id == params.id)", paramsMap));
updateByQueryRequest.setQuery(new TermQueryBuilder("name.keyword", "曹尼玛"));
updateByQueryRequest.setBatchSize(100);
updateByQueryRequest.setAbortOnVersionConflict(false);
this.getResponseBySearchRequest(updateByQueryRequest);
}
把名字叫王尼玛的童鞋,看美女的爱好强制改为看比赛:
public void testNestedUpdate() throws Exception {
UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest("student");
Map<String, Object> paramsMap = new HashMap<String, Object>(16);
paramsMap.put("id", 102);
paramsMap.put("name","看比赛");
ScriptType type = ScriptType.INLINE;
String lang = "painless";
String idOrCode = "for(e in ctx._source.scoreList){if (e.id == params.id) {e.name = params.name;}}";
updateByQueryRequest.setScript(new Script(type, lang, idOrCode, paramsMap));
updateByQueryRequest.setQuery(new TermQueryBuilder("name.keyword", "王尼玛"));
updateByQueryRequest.setBatchSize(100);
updateByQueryRequest.setAbortOnVersionConflict(false);
this.getResponseBySearchRequest(updateByQueryRequest);
}
执行UpdateByQuery 请求获取返回结果的方法如下,setBatchSize 分批执行,setAbortOnVersionConflict 忽略乐观锁版本号冲突。
private BulkByScrollResponse getResponseBySearchRequest(UpdateByQueryRequest searchRequest) {
BulkByScrollResponse searchResponse = elasticSearchConfig.getObject().updateByQuery(searchRequest, RequestOptions.DEFAULT);
return searchResponse;
}
上面四种是常用的ES UpdateByQuery Java Api的基本常用写法,对于这种Api怎么使用,就不要占用自己太长时间,多关注设计,然后让设计被成功实现,过程优雅一点,围绕软件的核心——为用户解决领域相关的问题的能力。
- JavaWeb(二)会话管理之细说cookie与session
- 概率论09 期望
- Javascript中数组的sort()和reverse()方法
- CentOS6.5开放端口,配置防火墙
- JavaWeb(一)Servlet中乱码解决与转发和重定向的区别
- Java魔法堂:四种引用类型、ReferenceQueue和WeakHashMap
- Javascript中数组的使用
- JavaWeb(一)Servlet中的request与response
- 数据库18456错误怎么解决
- JavaWeb(一)Servlet中的ServletConfig与ServletContext
- 语义化HTML:p、h1-6、q、blockquote、hr、address、code、pre、var、cite、dfn和samp
- Win7系统 IIS 调试ASP(aspcmsgbk25) 错误号:3706 提示 “未找到提供程序 该程序可能未正确安装”解决办法
- 普通文件和数据库存储的对比
- JavaWeb(一)之细说Servlet
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 树的重心
- PostgreSQL 13:索引并行vacuum
- 『数据库』震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)
- 萌新不看会后悔的C++基本类型总结(一)
- 2019 ICPC 银川网络赛 D. Take Your Seat (疯子坐飞机问题)
- 2019 ICPC 银川网络赛 H. Fight Against Monsters
- 状态压缩DP(大佬写的很好,转来看)
- 2019 ICPC 银川网络赛 F-Moving On (卡Cache)
- 树形结构--二叉树的遍历算法应用(十九)
- POJ1088 滑雪题解+HDU 1078(记忆化搜索DP)
- 2019 ICPC 南京网络赛 F Greedy Sequence
- 补题Codeforces 1102E. Monotonic Renumeration
- 2019 ICPC 南京网络赛 H-Holy Grail
- 写代码?程序猿?你不能不懂的八大排序算法的Python实现
- Java开发编程规范:5.集合处理