创建索引是什么
建索引时用 settings 指定主分片数、副本数与刷新间隔,mappings 里显式定义字段类型。主分片数建好之后不能直接修改,只能通过 reindex 或 shrink/split 迁移;副本数与刷新间隔可以随时调整。索引名只能用小写字母,同一索引只允许一种映射结构,因此分片数和字段类型的规划要在动手前想清楚。
基本信息
| 接口 | PUT /<index> |
|---|---|
| 可动态改 | number_of_replicas、refresh_interval、max_result_window |
| 不可改 | number_of_shards(需迁移或重建) |
| 命名规则 | 小写字母,不能含空格、逗号、星号,不以 - _ + 开头 |
| 常用参数 | wait_for_active_shards、aliases |
| 适用版本 | Elasticsearch 7.x / 8.x |
典型使用场景
- 新业务上线前建好索引与映射,避免自动映射产生错误类型
- 按时间滚动建索引,如 logs-2026.10
- 迁移重建时先建目标索引,再 reindex 数据
- 给索引绑定写别名,为后续零停机切换做准备
- 为聚合场景预留 keyword 子字段与 doc_values
- 测试环境按小分片建索引,节省资源
示例
示例
PUT /my-index-000001
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "1s"
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"message": { "type": "text" },
"user_id": { "type": "keyword" }
}
},
"aliases": { "my-index": { "is_write_index": true } }
}设置项能否动态修改
| 设置项 | 是否可动态改 | 说明 |
|---|---|---|
| number_of_shards | 不可以 | 只能重建或 shrink/split |
| number_of_replicas | 可以 | 调整后立即触发分片复制 |
| refresh_interval | 可以 | 导入期调大可提升吞吐 |
| max_result_window | 可以 | 调大只是放开限制 |
| mapping.properties | 只能新增 | 已有字段类型不可改 |
| alias | 可以 | 用 _aliases 原子增删 |
分片规划要点
- 分片数要与数据量、节点数一起估算,建好之后改动代价大
- 单分片体积建议控制在几十 GB 量级,过大影响恢复速度
- 分母片会增加集群状态开销,索引数量不宜无限膨胀
- 副本数提高可用性与读吞吐,同时占用成倍磁盘
- 写多读少的场景副本不宜过多,避免写入放大
- 滚动索引场景配合索引模板统一分片与副本配置
索引名只能用小写字母,不能含大写、空格、逗号、星号等字符;同一索引只允许一种映射结构,字段类型出错后只能重建。
分片数要按数据量与节点数预估,建好之后再改只能重建索引,代价远高于一开始就把参数定对。
副本数可以随时调整,但新增副本会立即占用节点磁盘与写入带宽,业务高峰期调整要评估影响。
建索引时用 wait_for_active_shards 可以等待分片就绪,写入前调用可避免刚建好就写入受挫;别名配合索引模板是滚动索引的标准做法。
与模板和别名的配合
- 用索引模板统一新索引的分片、副本与映射,避免每次手写
- 滚动索引场景固定写别名,写入只指向当前索引
- 别名切换用 _aliases 原子操作,减少查询真空期
- 模板里设置好生命周期策略名,新索引自动纳入管理
- 映射变更时先建新索引再切别名,历史索引保留只读
- 索引命名统一带业务与日期,巡检与清理才不会漏
建索引前检查清单
- 确认索引名合法:全小写、不含空格与特殊字符
- 确认别名是否已存在,避免命名冲突
- 评估数据量与增长速度,定下分片数与副本数
- 按查询模式定字段类型,字符串想清楚 text 还是 keyword
- 需要排序聚合的字段确保有 keyword 子字段
- 时间字段显式声明 date 与 format
创建索引时可以一并声明别名与映射,一次请求完成;分步创建虽然结果相同,但中间状态更容易被其他程序误用。