我有UpdateRequest
,可以用updateRequest.doc(XContentBuilder);
设置XContentBuilder
。是否可以对UpdateByQueryRequest
执行相同的操作?如果不能,我可以将XContentBuilder
转换为Script
吗?Script
的替代品有哪些?
如果你查看Elasticsearch的UpdateByQueryRequest的源代码,你会注意到,使用下面的方法可以实现你想要的,正如你所注意到的,它可以将script
转换为XContentBuilder
。
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
if (getScript() != null) {
builder.field("script");
getScript().toXContent(builder, params);
}
getSearchRequest().source().innerToXContent(builder, params);
builder.endObject();
return builder;
}
ES文档并没有将script
转换为XContentBuilder
的示例,但由于有这种方法,您可以简单地使其工作:(
我最终要做的是转换为Map,并将其作为脚本传递:
Map<String, Object> params = mapper.readValue(Strings.toString(XContentBuilder), Map.class);
UpdateByQueryRequest updateRequest = new UpdateByQueryRequest("document");
updateRequest.setScript(new Script(ScriptType.INLINE,
"painless",
"ctx._source.document = params.document",
params));
如果有人找到更好的解决方案,我会把这个问题留着。