我正在尝试使用类似于此处概述的技术,通过Java API在Elasticsearch中更新嵌套对象。问题是如何将json传递到脚本中。如果我只是像这里建议的那样盲目地将json连接到脚本字符串,则Groovy无法编译。如果直接将其作为参数传递,则只会将其解析为字符串。如果我尝试使用JsonSlurper,例如:
String script = "ctx._source.pete = new groovy.json.JsonSlurper().parseText(json)"; Map<String, Object> params = ImmutableMap.of("json", json); return new Script(script, ScriptService.ScriptType.INLINE, null, params);
我收到一个编译异常:无法解析类groovy.json.JsonSlurper
JsonSlurper方法的另一个问题似乎是,Elasticsearch团队基本上已在2.2中禁用了它。
有谁知道如何通过Java API正确传递json?
感谢Elasticsearch的人员为我提供的帮助。答案是将JSON转换为Map,然后仅将Map用作参数:
Map
String script = "ctx._source.pete = jsonMap"; Map<? ,?> jsonMap = new ObjectMapper().readValue(json, HashMap.class); Map<String, Object> params = ImmutableMap.of("jsonMap", jsonMap); return new Script(script, ScriptService.ScriptType.INLINE, null, params);
我org.codehaus.jackson.map.ObjectMapper用来做从JSON到的转换Map。
org.codehaus.jackson.map.ObjectMapper