前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES UpdateByQuery Java Api

ES UpdateByQuery Java Api

作者头像
只喝牛奶的杀手
发布2020-09-03 16:38:39
5.1K0
发布2020-09-03 16:38:39
举报
文章被收录于专栏:只喝牛奶的杀手

为什么要整理ES UpdateByQuery的API?因为我当时写的时候有点费劲,官网给了Nested结构的Java Api一些例子,但是我觉得就是草草了事,官网更加侧重于DSL语句的语法。我理解的Api就是拿来即用,不要浪费太多时间。

我们就拿学生和爱好也举例子,爱好为嵌套结构,一个学生的爱好可以有多个。

把出生日期是1999年9月9日的童鞋,备注更新为重阳节活动候选人(根据条件更新某个字段):

代码语言:javascript
复制
   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增加一个爱好):

代码语言:javascript
复制
    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(看美女)的同学删除掉:

代码语言:javascript
复制
   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);
    }

把名字叫王尼玛的童鞋,看美女的爱好强制改为看比赛:

代码语言:javascript
复制
  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 忽略乐观锁版本号冲突。

代码语言:javascript
复制
    private BulkByScrollResponse getResponseBySearchRequest(UpdateByQueryRequest searchRequest) {
        BulkByScrollResponse searchResponse = elasticSearchConfig.getObject().updateByQuery(searchRequest, RequestOptions.DEFAULT);
        return searchResponse;
    }

上面四种是常用的ES UpdateByQuery Java Api的基本常用写法,对于这种Api怎么使用,就不要占用自己太长时间,多关注设计,然后让设计被成功实现,过程优雅一点,围绕软件的核心——为用户解决领域相关的问题的能力。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 只喝牛奶的杀手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档