美文网首页
ElasticSearch ES 批量修改 批量修改集合某个属

ElasticSearch ES 批量修改 批量修改集合某个属

作者: TDominator | 来源:发表于2021-02-01 16:39 被阅读0次

最近碰到根据条件批量修改某个属性跟集合里面某个属性的业务,自己摸索,给出以下例子

【批量修改根据条件修改某个属性值】

           Map<String,Object> map = new HashMap<String,Object>();
           map.put("tags","blue");
           String idOrCode = "ctx._source.tags=params.tags"
           UpdateByQueryRequestBuilder builder = UpdateByQueryAction.INSTANCE.newRequestBuilder(transportClientForOperate);
           builder.source(index).filter(QueryBuilders.termsQuery(key, ids))
           .script(new Script(ScriptType.INLINE, "painless", idOrCode, map))
           .abortOnVersionConflict(false)    // 设置ES版本导致问题失败是否停止运行
           .get();

参数介绍
QueryBuilders.termsQuery(key, ids)
key 条件字段
ids 条件值,多个就是集合

new Script(ScriptType.INLINE, "painless", idOrCode, map)
idOrCode : 脚本语法 ctx._source.tags="blue"
map : 存储值 (也可以直接在脚本里硬编码,这里就直接写 Collections.emptyMap())

对应es语句

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : {
        "inline": "ctx._source.tags = tag", // 对应api idOrCode
        "params" : { // 对应api map里的键值对
            "tag" : "blue"
        }
    }
}'

重点来了,修改对应集合里的数据怎么修改

例如ES数据存储:

 "tagInfo": [
         {
        "tagId": 1,
        "name": "标签",
        "des": "说明",
        "no": 1
      },
      {
        "tagId": 2,
        "name": "标签2",
        "des": "说明2",
        "no": 2
      }
      ]

api写法

String key = "tagInfo";
String update_key = "name";
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","标签1");  
String idOrCode =
"if (ctx._source.containsKey('"+ key +"')) {for (int i=0;i<ctx._source."+ key  +".size();i++) { ctx._source."+ key +"[i]."+ update_key + "= params.name} }";

重点
if (ctx._source.containsKey('"+ key +"')) {
}
这个判断一定要写不然脚本会报空异常

如果要更改多个值拼接 idOrCode 的时候用;分开就行了哦;

最后看到这里对你有用的话,点个赞分享一下哦~

相关文章

网友评论

      本文标题:ElasticSearch ES 批量修改 批量修改集合某个属

      本文链接:https://www.haomeiwen.com/subject/bdzjtltx.html