Elasticsearch重建索引后映射未更新问题咨询
问题分析与解决办法
首先你创建新索引的命令存在语法错误:索引名index 2包含空格,正确写法应为index2。执行带空格的PUT /index 2会导致索引创建失败,后续执行_reindex时Elasticsearch会自动创建index2,并根据旧索引index1的数据自动生成映射,这就是新索引保留旧映射的直接原因。
另外,即使新索引创建成功,若旧索引存在新映射未定义的字段,Elasticsearch默认的dynamic mapping会自动为这些字段生成映射,也会让你误以为新索引沿用了旧规则。
正确操作步骤:
修正并重新创建指定映射的新索引
确保索引名无空格,同时可通过关闭动态映射避免自动生成未定义字段:PUT /index2 { "mappings": { "dynamic": "strict", // 严格模式,遇到未定义字段会报错,杜绝自动创建映射 "properties": { "@timestamp": { "type": "date", "format": "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'" } // 按需添加其他需要自定义映射的字段 } } }执行后用
GET /index2/_mapping命令验证映射是否正确创建。执行
_reindex迁移数据
如果旧索引存在新映射未定义的字段,需在迁移时过滤这些字段(否则会因strict模式报错):POST _reindex { "source": { "index": "index1", "_source": ["@timestamp"] // 仅迁移需要的字段 }, "dest": { "index": "index2" } }若不需要严格限制,也可将新索引的
dynamic设为false(忽略未定义字段),但不建议设为true(自动创建映射)。验证最终结果
迁移完成后,再次执行GET /index2/_mapping确认映射符合预期,同时检查数据是否正常迁移。
内容的提问来源于stack exchange,提问作者user18196814
相关产品推荐
相关产品推荐

