如何通过Java API更新Elasticsearch 2.2脚本中的嵌套对象
我正在尝试通过JavaAPI更新Elasticsearch中的嵌套对象,使用的技术类似于本文概述的技术。问题是如何将json传递到脚本中。如果我只是按照建议盲目地将json连接到脚本字符串,Groovy就不会编译。如果您直接将其作为参数传入,它将被解析为字符串。如果我尝试使用JsonSlurper,比如:如何通过Java API更新Elasticsearch 2.2脚本中的嵌套对象,java,
elasticsearch,Java,
elasticsearch,我正在尝试通过JavaAPI更新Elasticsearch中的嵌套对象,使用的技术类似于本文概述的技术。问题是如何将json传递到脚本中。如果我只是按照建议盲目地将json连接到脚本字符串,Groovy就不会编译。如果您直接将其作为参数传入,它将被解析为字符串。如果我尝试使用JsonSlurper,比如: String script = "ctx._source.pete = new groovy.json.JsonSlurper().parseText(json)"; Map<Strin
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);
String script=“ctx.\u source.pete=new groovy.json.JsonSlurper().parseText(json)”;
Map params=ImmutableMap.of(“json”,json);
返回新脚本(Script,ScriptService.ScriptType.INLINE,null,params);
我得到一个编译异常:无法解析groovy.json.JsonSlurper类
JsonSlurper方法的另一个问题似乎是Elasticsearch团队在2.2中基本上已经使用了它
有人知道如何通过Java API正确传递json吗?感谢Elasticsearch的同事们在这方面的帮助。答案是将JSON转换为
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);
String script=“ctx.\u source.pete=jsonMap”;
Map jsonMap=newObjectMapper().readValue(json,HashMap.class);
Map params=ImmutableMap.of(“jsonMap”,jsonMap);
返回新脚本(Script,ScriptService.ScriptType.INLINE,null,params);
我正在使用
org.codehaus.jackson.map.ObjectMapper
将JSON转换为map我已经在上一篇文章中就这个主题写了大量的答案。我没有使用脚本,而是使用Java中的UpdateRequest
类,您必须为该类提供一个XContentBuilder
对象,该对象包含您希望执行的所有更改
以下是答案的一小部分:
UpdateRequest updateRequest = new UpdateRequest();
//....
XContentBuilder jb = XContentFactory.jsonBuilder();
jb.startObject();
jb.startArray("..");
for ( /**/) {
jb.startObject()
.field("attrX", value)
// ..
.startObject("attrY")
.field("attrZ", value)
.endObject()
.field("atrrW", value)
.endObject();
}
jb.endArray();
b.endObject();
updateRequest.doc(jb);
能否尝试添加import groovy.json.JsonSlurper代码>在脚本的开头?只是想看看编译错误是否会出现?@Val不幸的是,这没有帮助,同样的错误。值得一试,尽管很清楚为什么会禁用它,为什么ES人员会坚持这个决定。