elasticsearch,Rest,elasticsearch" /> elasticsearch,Rest,elasticsearch" />

Rest 向标记添加多个字段时弹性搜索Api问题

Rest 向标记添加多个字段时弹性搜索Api问题,rest,elasticsearch,Rest,elasticsearch,我在看文件 用于添加文档并对其进行更新 添加的请求是 PUT test/_doc/1 { "counter" : 1, "tags" : ["red"] } 向标记列表添加新值的方法如下 POST test/_update/1 { "script" : { "source": "ctx._source.tags.add(params.tag)", "lang": "painless", "params" : {

我在看文件

用于添加文档并对其进行更新

添加的请求是

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"]

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

您只需调整脚本即可处理这两种情况

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

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"]
        }
    }
}
如果您不想添加新参数,可以这样做,并测试
标记
值的性质,以便运行正确的操作:

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"]
        }
    }
}

这是一次又一次地添加重复值,有没有办法避免它?是的,使用集合而不是列表。我修改了我的答案,告诉你怎么做