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中,再进行迁移:
- 在ES2.4中执行批量更新:
POST foo/_update_by_query { "script": { "inline": "ctx._source['@type'] = ctx._type" } }
- 完成后再通过reindex API将数据迁移到ES8.8,此时目标文档的
_source中已经包含@type字段,无需额外脚本处理。
关键注意事项
- ES8.x已彻底移除
_type字段,目标索引无需配置任何类型(默认的_doc类型也会被系统忽略)。 - 如果使用快照恢复方式迁移,需确认恢复后的索引是否保留了
_type元数据——若未保留,仍需使用上述方法补充@type字段。
内容的提问来源于stack exchange,提问作者neus
相关产品推荐
相关产品推荐

