ElasticSearch无痛脚本删除除键列表之外的所有键

时间:2018-01-19 10:47:25

标签: elasticsearch

我想在Elasticsearch(6.1)文档上执行原子更新操作,我想删除除某些键之外的所有文档(在顶层,而不是嵌套)。

我知道要从文档中删除特定密钥(示例中为something),我可以执行以下操作:

curl -XPOST 'localhost:9200/index/type/id/_update' -d '{
    "script" : "ctx._source.remove(params.field)",
    "params": {
      "field": "something"
    }
}'

但是,如果我想删除除a字段和名为b的字段之外的所有字段,该怎么办?

1 个答案:

答案 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内的内容更新文档,同时保留文档以前版本的密钥ab。这种方法对我的用例来说更简单,因为与现有文档中存在的密钥数量相比,要保留的密钥列表将会很小。

如果您只想保留密钥,并且首先将密钥存储在变量中,请执行ctx._source.clear(),然后再添加密钥。