【问题标题】:ElasticSearch - Copy one field value to other field for all documentsElasticSearch - 将一个字段值复制到所有文档的另一个字段
【发布时间】:2019-02-20 17:04:47
【问题描述】:

我们在索引中有一个字段“名称”。我们最近添加了一个新字段“别名”。 我想将 name 字段值复制到所有文档的新字段别名。

是否有任何更新查询可以做到这一点? 如果那不可能,请帮助我实现这一目标。 提前致谢

我正在尝试这个查询 http://URL/index/profile/_update_by_query

{
  "query": {

        "constant_score" : {
            "filter" : {
                "exists" : { "field" : "name" }
            }
        }

  },
  "script" : "ctx._source.alias = name;"
}

在脚本中,我不确定如何给出名称字段。 我收到错误

{
  "error": {
    "root_cause": [
      {
        "type": "class_cast_exception",
        "reason": "java.lang.String cannot be cast to java.util.Map"
      }
    ],
    "type": "class_cast_exception",
    "reason": "java.lang.String cannot be cast to java.util.Map"
  },
  "status": 500
}

【问题讨论】:

标签: elasticsearch


【解决方案1】:

确实,从那以后语法发生了一点点变化。您需要将查询修改为:

{
  "query": {

        "constant_score" : {
            "filter" : {
                "exists" : { "field" : "name" }
            }
        }

  },
  "script" : {
      "inline": "ctx._source.alias = ctx._source.name;"
  }
}

ES 6 更新

使用source 而不是inline

【讨论】:

  • 当我尝试这个时,我得到“类型为 [inline]、操作 [update] 和 lang [groovy] 的脚本被禁用”。
  • 你还没有读完另一个问题。您需要启用动态脚本。
  • 好的,非常感谢
  • 很高兴它有帮助!
  • 对于版本 > 6,在 script 中使用 source 代替 inline
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
相关资源
最近更新 更多