把数据分到不同索引、给新索引设置 mapping、把旧索引复制到新索引,是三件不同的事。模板不能替代写入分流,reindex 也不等于自动搬空来源。
以下使用 Elasticsearch 7.3 的旧模板接口解释概念,不应直接作为新版本的部署配置。
模板按索引名称匹配
在隔离学习环境中,一个旧模板可以写成:
PUT /_template/example_customer_template
{
"index_patterns": ["example-customer-*"],
"order": 10,
"settings": {
"number_of_shards": 1
},
"mappings": {
"properties": {
"timestamp": { "type": "date" }
}
}
}
它在匹配的新索引创建时应用配置,不自动修改已有索引。若业务要让某类客户进入独立索引,应由写入方或明确的数据管道选择目标名称。
多个模式写在同一个 index_patterns 数组里,不要在 JSON 中重复同名键。模式也不是任意正则表达式;旧模板有多个匹配时会按 order 等规则合并,不能直接按“只选最具体模板”理解。ES 7.3 旧索引模板
reindex 复制文档,不复制所有配置
先按需要创建目标索引的 mapping 和设置。下面的请求会写入目标,只应在备份充分的隔离环境使用:
POST /_reindex
{
"source": {
"index": ["example_source_a", "example_source_b"]
},
"dest": {
"index": "example_destination",
"op_type": "create"
}
}
来源文档不会因此自动删除,源索引的分片和 mapping 也不会被完整复制过去。
同 ID 冲突必须事先决定
默认复制会沿用文档 ID;多个来源含相同 ID 时,可能覆盖目标中的同 ID 文档。op_type:create 会在目标已存在 ID 时产生版本冲突,不是替每条文档自动生成无碰撞 ID。
即使配置冲突后继续执行,也不表示所有源文档都已保留。如果需要保留来源身份,应事先设计目标 ID 或其他合并策略。ES 7.3 Reindex API
实际迁移还要比较数量、抽样字段、失败和冲突报告,并处理复制期间的新增写入、切换与回退。任务开始或返回成功摘要,都不是可以立即删除来源的充分条件。