我正在尝试使用类似于概述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?
答案 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);