将多个字段添加到标签时出现Elastic Search Api问题

时间:2019-11-27 07:57:40

标签: rest elasticsearch

我正在关注文件

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html用于添加和更新文档。

添加请求为

PUT test/_doc/1
{
    "counter" : 1,
    "tags" : ["red"]
}

和用于在标签列表中添加新值的地址类似

POST test/_update/1
{
    "script" : {
        "source": "ctx._source.tags.add(params.tag)",
        "lang": "painless",
        "params" : {
            "tag" : "blue"
        }
    }
}

运行正常。现在我的问题是,如果我像

"tag" : ["green","yellow"]

整个列表都将添加为字段。我如何避免这种情况?

1 个答案:

答案 0 :(得分:2)

您只需要修改脚本即可处理这两种情况。

一种方法是使用另一个参数(例如tags)添加值列表,并为单个值保留tag

POST test/_update/1
{
    "script" : {
        "source": "def set = new HashSet(ctx._source.tags); if (params.tags != null) { set.addAll(params.tags) } else if (params.tag != null) { set.add(params.tag)} ctx._source.tags = new ArrayList(set);",
        "lang": "painless",
        "params" : {
            "tags" : ["green", "yellow"]
        }
    }
}

如果您不想添加新参数,可以这样做,并测试tag值的性质,以便运行正确的操作:

POST test/_update/1
{
    "script" : {
        "source": "def set = new HashSet(ctx._source.tags); if (params.tag instanceof List) { set.addAll(params.tag) } else { set.add(params.tag) } ctx._source.tags = new ArrayList(set);",
        "lang": "painless",
        "params" : {
            "tag" : ["green", "yellow"]
        }
    }
}