在弹性搜索中,如果您有包含预先存在的数组的文档
"movies": [
"Back to the Future"
]
然后你更新它以添加更多像这样的电影
{
"script" : "ctx._source.movies += tag",
"params" : {
"tag" : "Pulp Fiction"
}
}
然后将值添加到字段中。这很有效......但是,如果该字段不是一个arry开始,而是看起来像这样
"movies": "Back to the Future"
如果您运行相同的脚本,您将获得以下结果
"movies":"Back to the FuturePulpFiction"
所以我的问题是如何获取现有字段并将其“转换”为数组以告诉弹性搜索我想将其视为数组?
答案 0 :(得分:1)
您可以改用此脚本。它检查movies
是否为数组,如果不是则创建一个
{
"script" : "if (ctx._source.movies.getClass().isArray()) { ctx._source.movies += tag } else { ctx._source.movies = [ctx._source.movies, tag] }",
"params" : {
"tag" : "Pulp Fiction"
}
}
另一种更简单的方法是始终分配一个数组,然后使用Groovy的Collection.flatten()
方法“展平”它
{
"script" : "ctx._source.movies = [ctx._source.movies, tag].flatten()}",
"params" : {
"tag" : "Pulp Fiction"
}
}
答案 1 :(得分:1)
从Val添加答案,如果ctx._source.movies
不存在,则会在结果列表中添加null
。以下是我用来做类似但不包括null
。
{
"script": "if (ctx._source.movie.getClass().isArray()) {ctx._source.event += tag} else if (ctx._source.movie) {ctx._source.movie = [ctx._source.movie, tag]} else {ctx._source.movie=[tag]}",
"params" : {
"tag" : "Pulp Fiction"
}
}