哪些设置能热改
索引设置分动态与静态两类。副本数、刷新间隔、结果窗口上限、分片分配开关这些可以边跑边改;主分片数、已存在字段的分析器这类属于静态设置,热改会被直接拒绝,只能新建索引再迁移数据。
基本信息
| 适用版本 | Elasticsearch 7.x / 8.x |
|---|---|
| 接口 | PUT /<index>/_settings |
| 可动态改 | number_of_replicas、refresh_interval、max_result_window、routing.allocation.enable、blocks.* |
| 静态项 | number_of_shards、已存在字段的 analyzer |
| 查看命令 | GET /<index>/_settings?include_defaults=true |
典型使用场景
- 提高可用性:把 number_of_replicas 从 1 调到 2,容忍单节点故障
- 写入调优:批量导入期把 refresh_interval 放宽到 30s 或 -1,减少小段
- 支持更大的页面:临时调高 max_result_window,让业务侧的大分页先跑通
- 滚动重启或迁移:先设 routing.allocation.enable=primaries 抑制分片搬迁,完成后恢复 all
- 防误写与冻结:对历史索引设置 blocks.read_only,避免被程序写脏
示例
示例
PUT /my-index/_settings
{
"index": {
"number_of_replicas": 2,
"refresh_interval": "5s",
"max_result_window": 20000
}
}
GET /my-index/_settings?include_defaults=true # 连默认值一起看,排查“谁改过什么”
PUT /my-index/_settings
{ "index": { "routing.allocation.enable": "primaries" } } # 滚动重启前,减少分片搬迁
PUT /my-index/_settings
{ "index": { "routing.allocation.enable": "all" } } # 重启完成后恢复
PUT /logs-2026.10.*/_settings # 通配多个索引,改名范围前先用 _cat/indices 核对
{ "index": { "blocks.read_only": true } }可动态更新项
| 设置项 | 作用 | 注意点 |
|---|---|---|
| number_of_replicas | 副本数 | 写入高峰上调会触发分片复制,吞吐短时下降 |
| refresh_interval | 自动刷新周期 | -1 关闭自动刷新,新文档需手动 _refresh 才可见 |
| max_result_window | from+size 的结果窗口上限,默认 10000 | 放开只是解除限制,深分页成本没变 |
| routing.allocation.enable | 控制分片分配 | 设 none/primaries 后要记得恢复 all,否则新分片一直未分配 |
| blocks.read_only | 把索引置为只读 | 需要在迁移或防误写场景显式撤销 |
| number_of_shards | 主分片数(静态) | 只能在创建时指定,改不了,需 _reindex 重建 |
只想改那些没有显式配置过的项,可以加 ?preserve_existing=true;这对批量下发统一设置很实用,能避免覆盖个别索引上的手工设置。
索引级设置只影响当前索引;想让新建索引自带这些值,要么写进索引模板,要么调整集群级默认设置(PUT /_cluster/settings)。
静态设置在运行中的索引上改会返回 illegal_argument_exception;看到错误别反复重试,先确认该项属于哪一类,再决定是否走重建索引流程。