把数据分到不同索引、给新索引设置 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

实际迁移还要比较数量、抽样字段、失败和冲突报告,并处理复制期间的新增写入、切换与回退。任务开始或返回成功摘要,都不是可以立即删除来源的充分条件。