我正在关注文件
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"]
整个列表都将添加为字段。我如何避免这种情况?
答案 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"]
}
}
}