Elasticsearch重新索引时如何保留原字段映射?
重新索引时保留Elasticsearch原映射的方法
问题原因:
执行_reindex时,若目标索引new_index_name不存在,Elasticsearch会自动创建该索引,并根据写入的文档内容自动推断字段映射,这就是status字段从原有的keyword类型被修改为text+keyword多字段类型的核心原因。
解决方法
方法1:预先创建目标索引并复用原索引映射
这是最常用且可靠的方式,步骤如下:
- 获取原索引的完整映射:
GET source_index_name/_mapping
- 创建目标索引,将原索引的映射配置填入其中:
PUT new_index_name { "mappings": { // 粘贴上一步获取的原索引完整映射内容 }, "settings": { // 可选:同步原索引的分片、副本等配置 "number_of_shards": 1, "number_of_replicas": 0 } }
- 执行重新索引命令:
POST _reindex { "source": { "index": "source_index_name" }, "dest": { "index": "new_index_name" } }
方法2:使用_clone API直接复制索引(适用于全量复制场景)
如果不需要过滤文档,只是完整复制原索引的映射、设置和数据,可以用_clone API:
- 先将原索引设置为只读:
PUT source_index_name/_settings { "index.blocks.write": true }
- 执行克隆操作:
POST source_index_name/_clone/new_index_name
- 克隆完成后解除原索引的只读限制:
PUT source_index_name/_settings { "index.blocks.write": false }
注意:
_clone无法修改目标索引的分片数,若需要调整分片配置,建议使用方法1。
方法3:指定op_type: create(需目标索引已存在正确映射)
如果目标索引已经预先创建并配置好原映射,可以在_reindex中添加op_type: create,确保只写入新文档,且不会修改已有映射:
POST _reindex { "source": { "index": "source_index_name" }, "dest": { "index": "new_index_name", "op_type": "create" } }
内容的提问来源于stack exchange,提问作者Murtazali
相关产品推荐
相关产品推荐

