我想在Elasticsearch(6.1)文档上执行原子更新操作,我想删除除某些键之外的所有文档(在顶层,而不是嵌套)。
我知道要从文档中删除特定密钥(示例中为something
),我可以执行以下操作:
curl -XPOST 'localhost:9200/index/type/id/_update' -d '{
"script" : "ctx._source.remove(params.field)",
"params": {
"field": "something"
}
}'
但是,如果我想删除除a
字段和名为b
的字段之外的所有字段,该怎么办?
答案 0 :(得分:1)
我找到了让它发挥作用的方法。我在这里发帖,因为它可能对其他人有用:
POST /index/type/id/_update
{
"script" : {
"source" : "Object var0 = ctx._source.get(\"a\"); Object var1 = ctx._source.get(\"b\"); ctx._source = params.value; if(var0 != null) ctx._source.put(\"a\", var0); if(var1 != null) ctx._source.put(\"b\", var1);",
"params": {
"value": {
"newKey" : "newValue"
}
}
}
}
此脚本使用params.value
内的内容更新文档,同时保留文档以前版本的密钥a
和b
。这种方法对我的用例来说更简单,因为与现有文档中存在的密钥数量相比,要保留的密钥列表将会很小。
如果您只想保留密钥,并且首先将密钥存储在变量中,请执行ctx._source.clear()
,然后再添加密钥。