Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Java API更新Elasticsearch 2.2脚本中的嵌套对象_Java_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

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

如何通过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

我正在尝试通过JavaAPI更新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);
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人员会坚持这个决定。