理解为什么需要重建索引,以及完整的重建流程
Elasticsearch 的索引一旦创建,其 Mapping(映射结构) 和 Settings(索引配置) 就被「锁定」了。许多关键参数的修改只能通过重建索引的方式来完成,因为 ES 设计上不支持直接修改已创建索引的结构。
将 text 改为 keyword,或修改字段的数据类型(如 string → date)。ES 不支持直接 ALTER COLUMN,必须重建。
修改 analyzer、添加 IK 分词器、调整分词策略等。分词器影响索引结构,一旦设定无法更改。
索引创建后的主分片数 不可修改。只有重建才能改变分片分布,影响查询性能和数据写入。
新增字段可以动态添加,但新增 multi-field 或修改字段属性需要重建。
优化索引结构、重新组织分片、合并段(segments)以提升查询性能。
升级 ES 大版本时,某些旧索引格式可能不兼容,需要重建以适配新版本。
查看当前索引的 Mapping 和 Settings,了解需要修改的内容。
# 查看索引信息 GET /my_index/_mapping GET /my_index/_settings # 查看索引健康状态 GET /_cat/indices/my_index?v
以新名称创建目标索引,设置好新的 Mapping 和 Settings。
PUT /my_index_v2
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"ik_max_word": {
"type": "ik_max_word"
}
}
}
},
"mappings": {
"properties": {
"title": { "type": "text", "analyzer": "ik_max_word" },
"status": { "type": "keyword" }
}
}
}
根据数据量选择合适的迁移方式:
| 方式 | 适用场景 | 特点 |
|---|---|---|
| Reindex API | 一般场景 | ES 内置,跨索引迁移 |
| Logstash | 大量数据、跨集群 | 支持数据过滤转换 |
| 快照/Restore | 超大数据量 | 速度快,不占用集群资源 |
使用 Reindex API 将数据从旧索引迁移到新索引。
POST _reindex
{
"source": {
"index": "my_index",
"size": 5000 # 每批处理文档数
},
"dest": {
"index": "my_index_v2"
},
"conflicts": "proceed" # 遇到冲突继续
}
"script" 可以对数据做转换,如修字段名、格式等
检查数据完整性和一致性。
# 检查文档数量 GET /_cat/count/my_index_v2?v # 检查数据一致性(抽样对比) POST _reindex { "source": { "index": "my_index" }, "dest": { "index": "my_index_v2" }, "conflicts": "proceed", "size": 100, "script": { "source": "ctx._id = ctx._source.user_id + '_' + ctx._id" } } # 查询对比 GET my_index/_count GET my_index_v2/_count
通过别名实现无缝切换,零停机迁移。
# 1. 创建别名指向新索引 POST /_aliases { "actions": [ { "add": { "index": "my_index_v2", "alias": "my_index_alias" }}, { "remove": { "index": "my_index", "alias": "my_index_alias" }} ] } # 2. 确认别名切换成功 GET /_cat/aliases/my_index_alias?v
确认一切正常后,删除旧索引释放资源。
# 确认数据后删除旧索引
DELETE /my_index
throttle_size 限制并发slices 并行但不超过集群承载GET _cluster/healthsearch_after 增量同步最后的数据slices 提高并行度GET _tasks?detailed=true&actions=*reindex"slices": "auto" 或 CPU 核数indices.memory.index_buffer_sizerefresh=false 减少开销Elasticsearch 索引重建是运维中的常见操作,本质原因是 索引结构不可变。 理解重建的必要性、掌握零停机迁移方案(别名切换),是保障业务连续性的关键。 建议从一开始就使用索引别名,将索引名称与业务代码解耦,这样重建时可以实现真正的零停机切换。