模板解决什么问题
索引模板按名称模式在索引创建的那一刻自动套用 settings、mappings 与 aliases,省掉每次建索引重复写配置。组合式(composable)模板还支持拆出组件模板复用公共配置,是 Elasticsearch 7.8 之后推荐的做法,旧的 legacy 模板在 8.0 已被移除。
基本信息
| 适用版本 | Elasticsearch 7.8+ / 8.x(composable) |
|---|---|
| 接口 | PUT /_index_template/<name> |
| 匹配规则 | index_patterns 支持通配符,priority 用于断冲突 |
| 组成 | template 下写 settings / mappings / aliases |
| 复用 | composed_of 引用组件模板 PUT /_component_template/<name> |
典型使用场景
- 按天滚动的日志索引:logs-* 统一分片数、副本数与 @timestamp 映射
- 统一字段规范:全站 message 用同一分词器,避免各索引行为不一致
- 多套环境复用:把公共 settings 抽成组件模板,业务模板只写差异部分
- 读写分离:模板里自动挂读别名,轮转时只切别名不动应用
- 覆盖通用规则:为特定前缀的索引准备更高 priority 的专用模板
示例
示例
PUT /_component_template/base_settings # 组件模板:公共配置,单独存在不生效
{
"template": {
"settings": { "number_of_shards": 3, "number_of_replicas": 1 }
}
}
PUT /_index_template/logs_template
{
"index_patterns": ["logs-*"],
"priority": 500,
"composed_of": ["base_settings"], # 引用组件模板
"template": {
"settings": { "refresh_interval": "30s" },
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"message": { "type": "text" }
}
},
"aliases": { "logs": {} }
}
}
GET /_index_template/logs_template # 核对真正生效的模板内容模板要素读法
| 要素 | 作用 | 注意点 |
|---|---|---|
| index_patterns | 哪些索引名会被套用 | 通配范围别开太宽,避免误套到别的业务索引 |
| priority | 多个模板同时匹配时决定取舍 | 不显式拉开优先级,容易出现预期外的配置组合 |
| composed_of | 引用组件模板复用配置 | 组件模板自身不作用于索引,必须被引用 |
| template.settings | 分片、副本、刷新等 | 静态设置只在创建索引那一刻生效 |
| template.mappings | 字段类型定义 | 类型写错会被之后创建的所有索引继承 |
| template.aliases | 自动挂别名 | 配合读写别名可实现轮转零停机 |
模板只在创建索引时生效:已存在的索引不会被补写配置,改了模板要让它产生作用,得滚动到新索引(rollover)或用 _reindex 重建。
排查「配置为什么不生效」的顺序:GET /_index_template/<name> 看模板内容,GET /<index>/_settings?include_defaults=true 看索引实际值,再确认创建时间在模板更新之后。
删除或重命名被 composed_of 引用的组件模板后,匹配该模板的新索引会创建失败;调整组件模板前先确认还有哪些索引模板在引用它。