首先,文档格式
{"_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 ...... ");}}