You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch 8.x脚本处理器中如何获取旧_type元数据?

解决Elasticsearch 8.8迁移时从旧_type生成@type字段的问题

因为ES8.x的reindex脚本上下文默认不会携带_type元数据,所以直接用ctx._type会返回null,以下是两种可行的解决方法:

方法一:利用Reindex API的metadata_fields参数(推荐)

ES7.10及以上版本支持metadata_fields参数,可指定将原文档的元数据带入脚本上下文。在reindex请求中配置该参数后,就能通过ctx._metadata._type获取旧的_type值:

POST _reindex
{
  "source": {
    "index": "foo",
    "metadata_fields": ["_type"]
  },
  "dest": {
    "index": "foo_new"
  },
  "script": {
    "source": "ctx._source['@type'] = ctx._metadata._type; delete ctx._metadata;"
  }
}
  • 该请求会将原索引foo中的数据迁移到新索引foo_new,同时把旧_type值写入_source的@type字段。
  • 最后删除ctx._metadata是为了避免不必要的元数据被写入目标文档。

方法二:先在旧ES2.4集群预处理数据

如果旧ES2.4集群仍可访问,可先将_type直接写入原文档的_source中,再进行迁移:

  1. 在ES2.4中执行批量更新:
POST foo/_update_by_query
{
  "script": {
    "inline": "ctx._source['@type'] = ctx._type"
  }
}
  1. 完成后再通过reindex API将数据迁移到ES8.8,此时目标文档的_source中已经包含@type字段,无需额外脚本处理。

关键注意事项

  • ES8.x已彻底移除_type字段,目标索引无需配置任何类型(默认的_doc类型也会被系统忽略)。
  • 如果使用快照恢复方式迁移,需确认恢复后的索引是否保留了_type元数据——若未保留,仍需使用上述方法补充@type字段。

内容的提问来源于stack exchange,提问作者neus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:43:35