Elasticsearch 索引模板:标准化索引配置与映射的利器
索引模板(Index Template)是 Elasticsearch 中用于预定义索引配置(settings)和映射(mapping)的工具。通过模板,可确保新创建的索引自动应用统一的配置,避免重复劳动并保证索引结构的一致性,尤其适合按时间分片的索引(如日志索引 log-2024-08)。
索引模板的核心作用
- 标准化配置:为一类索引(如所有日志索引)统一设置分片数、副本数、刷新间隔等参数。
- 预定义映射:提前定义字段类型、分词器等映射规则,避免动态映射导致的字段类型错误。
- 自动化应用:新索引创建时,若名称匹配模板的
index_patterns,自动应用模板配置。
索引模板的基本操作
创建索引模板
通过 PUT _template/<模板名称> 创建模板,核心参数包括:
index_patterns:匹配索引名称的模式(支持通配符*)。order:模板优先级(数值越大优先级越高,冲突时覆盖低优先级配置)。settings:索引的配置参数(如分片数、副本数)。mappings:索引的字段映射规则。
示例:创建一个适用于所有日志索引的模板
1 | PUT _template/template_logs |
注意:模板仅对新创建的索引生效,已存在的索引不受影响。
查看索引模板
查看指定模板:
1
GET _template/template_logs // 查看模板template_logs
查看所有模板:
1
GET _template // 返回所有模板列表
检查模板是否存在:
1
HEAD _template/template_logs // 存在返回200,不存在返回404
删除索引模板
通过 DELETE _template/<模板名称> 删除模板:
1 | DELETE _template/template_logs // 删除模板template_logs |
模板的匹配与合并规则
当新索引的名称匹配多个模板时,Elasticsearch 会按以下规则处理:
- 匹配所有模板:收集所有
index_patterns匹配索引名称的模板。 - 按优先级合并:
- 先应用低
order模板的配置。 - 再应用高
order模板的配置,冲突的参数(如number_of_replicas)会被高优先级模板覆盖。
- 先应用低
示例:多个模板的合并效果
- 模板 A(
order:0):index_patterns: ["log-*"],settings.number_of_replicas: 0。 - 模板 B(
order:1):index_patterns: ["log-*"],settings.number_of_replicas: 1。
创建索引 log-2024-08 时,最终副本数为 1(模板 B 覆盖模板 A)。
索引模板的高级用法
结合索引生命周期管理(ILM)
模板可与 ILM 策略结合,自动管理索引的生命周期(如滚动、删除旧索引):
1 | PUT _template/template_logs |
禁用动态映射
通过模板禁用动态映射,强制字段必须显式定义,避免意外添加字段:
1 | PUT _template/template_strict |
创建 strict-user 索引时,若文档包含未定义的字段(如 age),会写入失败。
模板变量(6.8+ 支持)
使用 {{变量名}} 定义动态参数,创建索引时通过 index.settings 传递值:
1 | PUT _template/template_var |
注意事项
- 模板与索引的优先级:若创建索引时显式指定了
settings或mappings,会覆盖模板中的对应配置(显式配置 > 模板配置)。 - 版本兼容性:
- 6.x 支持
type,模板中需包含mappings.<type>。 - 7.x 及以上移除
type,模板中映射直接写在mappings下(默认_doc)。
- 6.x 支持
- 避免过度模板化:模板数量过多可能导致合并逻辑复杂,建议按业务类型(如日志、用户)分类管理模板
v1.3.10