一尘不染

将Elastic Search字段转换为数组

elasticsearch

在elasticsearch中,如果您的文档具有预先存在的数组

"movies": [
     "Back to the Future"
]

然后您更新它以添加更多类似的电影

{
  "script" : "ctx._source.movies += tag",
  "params" : {
    "tag" : "Pulp Fiction"
  }      
}

然后将值添加到该字段。效果很好…但是,如果该领域并非一开始就很麻烦,而是看起来像这样,该怎么办

"movies": "Back to the Future"

如果运行相同的脚本,将得到以下结果

"movies":"Back to the FuturePulpFiction"

因此,我的问题是如何利用这个现有字段并将其“转换”为数组,以告诉elasticsearch我想将其视为数组?


阅读 793

收藏
2020-06-22

共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"
  }      
}
2020-06-22