将弹性搜索字段转换为数组

时间:2015-10-23 13:41:59

标签: json elasticsearch

在弹性搜索中,如果您有包含预先存在的数组的文档

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

所以我的问题是如何获取现有字段并将其“转换”为数组以告诉弹性搜索我想将其视为数组?

2 个答案:

答案 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" 
  }
}