如何通过Java API更新Elasticsearch 2.2脚本中的嵌套对象

时间:2016-03-01 16:30:30

标签: java elasticsearch

我正在尝试使用类似于概述here的技术,通过Java API更新Elasticsearch中的嵌套对象。问题是如何将json传递给脚本。如果我只是盲目地将json连接到建议here的脚本字符串,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中基本上disabled

有没有人知道如何通过Java API正确传递json?

2 个答案:

答案 0 :(得分:2)

感谢Elasticsearch的工作人员帮助我解决这个问题。答案是将JSON转换为class GameStateMachine<T> where T : GameViewMachine { } abstract class GameViewMachine { public int Count { get; } public IQueue InputQueue { get; } } ,然后将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); 进行从JSON到org.codehaus.jackson.map.ObjectMapper的转换。

答案 1 :(得分:-1)

我在StackOverflow in this thread上就该主题撰写了大量答案。我在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);