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"]
}
}
}
这是一次又一次地添加重复值,有没有办法避免它?是的,使用集合而不是列表。我修改了我的答案,告诉你怎么做