Elastic4s/Elasticsearch:能否在单次请求中更新文档并删除字段?
问题
我的应用会获取某一对象的变更事件,并基于这些事件构建文档,用于upsert到Elasticsearch,代码如下:
updateById( "index", "id" ).doc(changeEvent) .docAsUpsert(true)
问题在于,变更事件可能需要置空或删除Elasticsearch中的字段。请问如下写法是否可行?能否通过单次请求实现该操作?
updateById( "index", "id" ).doc(changeEvent) .docAsUpsert(true) .script( Script( "for (field in params.removeFields) {ctx._source.remove(field)}", params = removeMap ) ) .scriptedUpsert(true)
还是说我需要先发送一个upsert请求,再发送一个单独的脚本请求来遍历参数并删除字段?
回答
你的写法完全可行,而且可以通过单次请求同时完成字段更新/插入和指定字段删除操作,不需要分两次请求。
有几个细节需要留意:
scriptedUpsert(true)会让脚本在文档不存在时也执行,但此时ctx._source不存在,所以脚本里最好加个判断避免异常:Script( "if (ctx._source != null) { for (field in params.removeFields) {ctx._source.remove(field)} }", params = removeMap )- 当文档不存在时,
doc(changeEvent)结合docAsUpsert(true)会先创建文档,之后脚本执行(因为scriptedUpsert已开启),刚创建的ctx._source包含changeEvent的字段,脚本会移除指定字段,这符合预期逻辑。 - 如果需求是置空字段而非删除,把脚本里的
ctx._source.remove(field)改成ctx._source[field] = null即可。
总结:单次请求就能完成所有需要的操作,无需拆分请求。
内容的提问来源于stack exchange,提问作者flame1481
相关产品推荐
相关产品推荐

