0%

索引模板

Elasticsearch 索引模板:标准化索引配置与映射的利器

索引模板(Index Template)是 Elasticsearch 中用于预定义索引配置(settings)和映射(mapping)的工具。通过模板,可确保新创建的索引自动应用统一的配置,避免重复劳动并保证索引结构的一致性,尤其适合按时间分片的索引(如日志索引 log-2024-08)。

索引模板的核心作用

  • 标准化配置:为一类索引(如所有日志索引)统一设置分片数、副本数、刷新间隔等参数。
  • 预定义映射:提前定义字段类型、分词器等映射规则,避免动态映射导致的字段类型错误。
  • 自动化应用:新索引创建时,若名称匹配模板的 index_patterns,自动应用模板配置。

索引模板的基本操作

创建索引模板

通过 PUT _template/<模板名称> 创建模板,核心参数包括:

  • index_patterns:匹配索引名称的模式(支持通配符 *)。
  • order:模板优先级(数值越大优先级越高,冲突时覆盖低优先级配置)。
  • settings:索引的配置参数(如分片数、副本数)。
  • mappings:索引的字段映射规则。

示例:创建一个适用于所有日志索引的模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PUT _template/template_logs
{
"index_patterns": ["log-*"], // 匹配所有以log-开头的索引
"order": 1, // 优先级为1(可用于覆盖低优先级模板)
"settings": {
"number_of_shards": 3, // 主分片数3
"number_of_replicas": 1, // 副本数1
"refresh_interval": "30s" // 刷新间隔30秒(降低实时性,提升写入性能)
},
"mappings": {
"default": { // 6.x支持type,7.x后默认_type为_doc
"properties": {
"timestamp": { "type": "date" }, // 时间字段
"level": { "type": "keyword" }, // 日志级别(精确匹配)
"message": { "type": "text", "analyzer": "ik_max_word" } // 日志内容(中文分词)
}
}
}
}

注意:模板仅对新创建的索引生效,已存在的索引不受影响。

查看索引模板

  • 查看指定模板:

    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 会按以下规则处理:

  1. 匹配所有模板:收集所有 index_patterns 匹配索引名称的模板。
  2. 按优先级合并:
    • 先应用低 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
2
3
4
5
6
7
8
PUT _template/template_logs
{
"index_patterns": ["log-*"],
"settings": {
"number_of_shards": 3,
"index.lifecycle.name": "log_policy" // 关联ILM策略log_policy
}
}

禁用动态映射

通过模板禁用动态映射,强制字段必须显式定义,避免意外添加字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PUT _template/template_strict
{
"index_patterns": ["strict-*"],
"settings": { "number_of_shards": 1 },
"mappings": {
"default": {
"dynamic": "strict", // 禁用动态映射
"properties": {
"id": { "type": "keyword" },
"name": { "type": "text" }
}
}
}
}

创建 strict-user 索引时,若文档包含未定义的字段(如 age),会写入失败。

模板变量(6.8+ 支持)

使用 {{变量名}} 定义动态参数,创建索引时通过 index.settings 传递值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PUT _template/template_var
{
"index_patterns": ["var-*"],
"settings": {
"number_of_replicas": "{{replica_count}}" // 变量replica_count
}
}

// 创建索引时传递变量值
PUT var-test
{
"settings": {
"replica_count": 2 // 实际副本数为2
}
}

注意事项

  1. 模板与索引的优先级:若创建索引时显式指定了 settingsmappings,会覆盖模板中的对应配置(显式配置 > 模板配置)。
  2. 版本兼容性
    • 6.x 支持 type,模板中需包含 mappings.<type>
    • 7.x 及以上移除 type,模板中映射直接写在 mappings 下(默认 _doc)。
  3. 避免过度模板化:模板数量过多可能导致合并逻辑复杂,建议按业务类型(如日志、用户)分类管理模板

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10