ES UpdateByQuery Java Api
最编程
2024-05-06 11:15:06
...
为什么要整理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怎么使用,就不要占用自己太长时间,多关注设计,然后让设计被成功实现,过程优雅一点,围绕软件的核心——为用户解决领域相关的问题的能力。
上一篇: Scala 实验 2 3
下一篇: API 认证
推荐阅读
-
ES UpdateByQuery Java Api
-
elasticsearch8.5.0 复杂查询 - Java API 客户端 - 组合+页面+排序+分组查询
-
Java面试 "带你一次性了解面试中的必要问题,谈谈你对ES的理解。
-
ES]带基本操作和官方查询指导的 JAVA 集成 ES
-
Java 教程:实现 Mysql 和 ES 数据同步的方法
-
ElasticSearch 高级版:Java 中的各种 ES 查询概述
-
ES 学习教程 - 前言 什么是 es? es 是一个基于 Apache Lucene 的开源分布式(全文)搜索引擎,它提供了一个简单的 RESTful API 来隐藏 Lucene 的复杂性。 除了是一个全文搜索引擎,es 还可以描述如下: 分布式实时文件存储,每个字段都有索引并可被搜索 分布式实时分析搜索引擎 可扩展至数百或数千台服务器,处理 PB 级的结构化或非结构化数据。 ES 的数据组织类比
-
安卓音频开发(6):使用 OpenSL ES API(继续)
-
使用 Java 流 API 高效确定列表中是否存在字段值为 0 的字段
-
百度收录后如何提交 API(java、python)