如何使用Elastic Reindex API移除映射中的动态字段
解决方法
要实现仅移除base_geo动态模板及对应数据,同时保留其他动态映射,需要分两步操作:先手动创建目标索引的映射(剔除不需要的模板),再执行重索引并清理文档中的目标字段。
1. 手动创建目标索引的映射
首先复制原索引的映射结构,但删除base_geo这个动态模板项,确保其他动态模板完整保留。
示例创建索引请求
PUT /local_federal_agency_models_1708127195_3 { "mappings": { "dynamic_templates": [ // 保留原索引中除base_geo之外的所有动态模板 { "other_template_1": { "match": "*SomePattern", "mapping": { "type": "text" } } }, // 其他原有的动态模板... ] // 原索引中的其他静态字段映射也一并复制过来 } }
提示:可以先通过
GET /local_federal_agency_models_1708127195/_mapping获取原索引的完整映射,再删除base_geo模板部分,作为目标索引的映射配置。
2. 执行重索引并清理文档中的Geo字段
因为base_geo模板匹配的是所有后缀为Geo的字段(如locationGeo、areaGeo等),需要在重索引时移除文档中这类字段,可选两种方式:
方式一:使用Reindex API脚本
POST _reindex { "source": { "index": "local_federal_agency_models_1708127195" }, "dest": { "index": "local_federal_agency_models_1708127195_3" }, "script": { "source": """ // 遍历并移除所有后缀为Geo的字段 def keysToRemove = ctx._source.keySet().findAll(k -> k.endsWith('Geo')); keysToRemove.forEach(k -> ctx._source.remove(k)); """ } }
方式二:使用Ingest Pipeline
如果字段处理逻辑更复杂,可先创建处理管道:
PUT _ingest/pipeline/remove_geo_fields { "processors": [ { "remove": { "field": "*Geo", "ignore_missing": true } } ] }
再在重索引时调用该管道:
POST _reindex { "source": { "index": "local_federal_agency_models_1708127195" }, "dest": { "index": "local_federal_agency_models_1708127195_3", "pipeline": "remove_geo_fields" } }
关键注意事项
- 必须手动配置目标索引映射:不能依赖ES自动生成,否则原有的其他动态模板会丢失,需确保目标索引映射保留了除
base_geo外的所有原配置。 - 脚本要匹配实际字段名:之前的错误是试图移除模板名称
base_geo,但实际需要清理的是模板匹配的*Geo后缀字段。
内容的提问来源于stack exchange,提问作者wonder95
相关产品推荐
相关产品推荐

