索引模板

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

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

索引模板的核心作用

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

索引模板的基本操作

创建索引模板

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

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

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

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" }  // 日志内容(中文分词)
      }
    }
  }
}

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

查看索引模板

  • 查看指定模板:

    GET _template/template_logs  // 查看模板template_logs
  • 查看所有模板:

    GET _template  // 返回所有模板列表
  • 检查模板是否存在:

    HEAD _template/template_logs  // 存在返回200,不存在返回404

删除索引模板

通过 DELETE _template/<模板名称> 删除模板:

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 策略结合,自动管理索引的生命周期(如滚动、删除旧索引):

PUT _template/template_logs
{
  "index_patterns": ["log-*"],
  "settings": {
    "number_of_shards": 3,
    "index.lifecycle.name": "log_policy"  // 关联ILM策略log_policy
  }
}

禁用动态映射

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

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 传递值:

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. 避免过度模板化:模板数量过多可能导致合并逻辑复杂,建议按业务类型(如日志、用户)分类管理模板