当前位置: 代码迷 >> 综合 >> es painless 脚本追加嵌套数组对象
  详细解决方案

es painless 脚本追加嵌套数组对象

热度:20   发布时间:2024-02-05 18:59:16.0

首先,文档格式

{"_index" : "test_index","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"id" : "1","name" : "哈哈哈","pageView" : 0,"personCerts" : [{"certNo" : "333""regMajor" : "321","regType" : "231"},{"certNo" : "334""regMajor" : "322","regType" : "233},{"certNo" : "335""regMajor" : "323","regType" : "231"}]}
}

在id=1的文档中,给personCerts追加一个对象。这里会存在此文档中之前未录入进personCerts这个字段。可以在追加时做个判断。es中写法为

POST test_index/_update/1
{"script": {"source": """ if(ctx._source.containsKey('personCerts')){def targets = ctx._source.personCerts.findAll(personCert -> personCert.certNo == params.personCerts.certNo);//这一步去重,防止重复录入if(targets.size() == 0) { ctx._source.personCerts.add(params.personCerts)}}else{ctx._source.personCerts=[params.personCerts];}""","lang": "painless","params": {"personCerts": {"regMajor": "000","regType":"111","certNo":"333"}}}
}

Java写法

Map<String,Object> personCert = new HashMap<>();personCert.put("certNo"   ,"000");personCert.put("regMajor" ,"111");personCert.put("regType"  ,"678");Map<String, Object> personCerts = Collections.singletonMap("personCerts",personCert);Script inline = new Script(ScriptType.INLINE, "painless","if(ctx._source.containsKey('personCerts')){       \n" +"   def targets = ctx._source.personCerts.findAll(personCert -> personCert.certId == params.personCerts.certId);\n" +"   if(targets.size() == 0) { \n" +"       ctx._source.personCerts.add(params.personCerts)\n" +"   }\n" +"}else{\n" +"   ctx._source.personCerts=[params.personCerts]; \n"+"}", personCerts);esService.executeScript(inline,"test_index","1");
public void executeScript(Script inline, String id, String index) {UpdateRequest request = new UpdateRequest( index,  id);request.script(inline);try{UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);log.info("...... result status {} ...... ",response.status().getStatus());}catch (Exception e){log.info("...... execute script failed ...... ");}}