3.3 索引的生老病死:创建、设置、别名与删除 本节摘要:索引不只是"建了就用"的容器,它有完整的生命周期:创建时定静态参数,运行中调动态参数,扩容或改映射时借别名无缝切换,归档后可关闭或删除。本节把这些操作串成一条线,并完整演练一次零停机重建——它是"主分片数不可改、字段类型不可改"两大限制的标准出路,也是第 9 章容量规划的基本功。 索引的一生 前两节给索引填好了映射与分析器,这一节管容器本身。
本节摘要:索引不只是"建了就用"的容器,它有完整的生命周期:创建时定静态参数,运行中调动态参数,扩容或改映射时借别名无缝切换,归档后可关闭或删除。本节把这些操作串成一条线,并完整演练一次零停机重建——它是"主分片数不可改、字段类型不可改"两大限制的标准出路,也是第 9 章容量规划的基本功。
前两节给索引填好了映射与分析器,这一节管容器本身。一个索引从生到死要经历四个阶段,每个阶段都有对应的操作面:
| 阶段 | 操作 | 要点 |
|---|---|---|
| 出生 | 创建请求带 settings 与 mappings | 静态参数此时定死,错过不再来 |
| 成长 | 动态设置随负载调整 | 副本数、刷新间隔可随时改 |
| 变形 | 新索引承接数据、别名切换 | 解决改类型与改分片数两大限制 |
| 退场 | 关闭省资源或彻底删除 | 关闭的分片不占内存只占磁盘 |
创建之后哪些还能改、哪些不能?记一条分界线:凡与数据物理分布有关的都是静态的。主分片数决定文档路由(第 1 章的公式),分词器决定倒排结构,字段类型决定存储格式——它们都随数据一起落盘,改了就要重组,所以只能在创建时声明。副本数、刷新间隔、每个分片的副本数上限这些运行时参数则随时可调:
PUT tickets_v3/_settings { "number_of_replicas": 2, "refresh_interval": "5s" }
这条请求把副本加到 2(读流量上涨前的准备),刷新间隔放宽到 5 秒(写入高峰的常见减压手段——机制在 8.3 展开)。生效即刻,无需重启。
关闭一个索引,分片从内存里卸载,磁盘数据保留,随时可重新打开;删除则是物理清除,不可恢复。归档场景(三年前的工单)适合关闭:省内存、留数据、可秒开。确认无用再删除,删除前用索引统计接口核对文档数,给自己一次反悔的机会:
GET tickets_2023/_stats/docs # 确认文档数与预期一致 POST tickets_2023/_close # 关闭 内存卸载 POST tickets_2023/_open # 需要时重新打开
单数名词的索引用起来顺手,生产上却有个隐藏成本:一切"改分片数、改映射、改分析器"的需求都等价于重建。硬切必然停写,解法是让应用永远只面向别名(alias)——一个指向真实索引的软链接。

完整演练一遍,从给现有索引挂别名开始:
POST _aliases { "actions": [ { "add": { "index": "tickets_v3", "alias": "tickets" } } ] }
应用改造一次,从此读写都用 tickets。某天要把分片数从 3 提到 6、顺带换上 3.2 的自定义分析器,四步走:
PUT tickets_v4 { "settings": { "number_of_shards": 6, "number_of_replicas": 1 }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "reply_analyzer" }, "status": { "type": "keyword" } } } }
POST _reindex { "source": { "index": "tickets_v3" }, "dest": { "index": "tickets_v4" } }
数据搬完后,原子切换再拆除旧索引:
POST _aliases { "actions": [ { "remove": { "index": "tickets_v3", "alias": "tickets" } }, { "add": { "index": "tickets_v4", "alias": "tickets" } } ] }
DELETE tickets_v3 # 观察几天确认无误后删除
解读:重建全程应用无感知,切换动作是集群状态的一次原子更新,不存在"别名悬空"的中间态。变式一:数据量太大、一次搬运太久时,用双写方案——新旧索引同时写,存量慢慢搬,搬完切别名、停双写。变式二:日志类数据按月建索引(名带年月后缀),用带过滤条件的别名把"最近三个月"聚成一个名字供查询,配合第 8 章的生命周期管理自动滚动与删除。变式三:搜索请求要求"主写索引优先",可以给别名设置索引属性 is_write_index,多个索引挂同一别名时指明写入落点。
⚠️ 常见坑:重建索引接口按批次拉取再写入,源索引写入不停时可能出现少量覆盖竞态。低峰期执行、或以时间戳字段为界只搬历史段,双写补最新增量,是工程上常见的兜底组合。
| 考核点 | 达标标准 |
|---|---|
| 静态动态分界 | 判断给定参数属于哪类,并说出判断依据 |
| 别名原子切换 | 写出同一请求内一删一挂的动作,解释为何不存在中间态 |
| 重建四步 | 按顺序说出建新、搬运、切别名、删旧与各自的校验点 |
| 关闭与删除 | 区分两者适用场景,写出删除前的核对动作 |
| 双写变式 | 说出数据量大或写入不停时的替代方案与取舍 |
容器、登记表、剪刀都齐了。下一章文档正式上路:写入请求发出后,它如何被路由、被持久化、被并发世界温柔以待。