【问题标题】:Converting Elastic Search field to Array将 Elastic Search 字段转换为数组
【发布时间】:2016-01-23 01:52:51
【问题描述】:

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

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

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

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

然后将值添加到字段中。这很好用……但是如果该字段不是一开始的,而是看起来像这样

"movies": "Back to the Future"

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

"movies":"Back to the FuturePulpFiction"

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

【问题讨论】:

    标签: json elasticsearch


    【解决方案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"
      }      
    }
    

    【讨论】:

      【解决方案2】:

      除了 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" 
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-01-17
        • 1970-01-01
        • 2022-09-28
        • 2012-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        相关资源
        最近更新 更多