目 录CONTENT

文章目录

【入门篇】5. Elasticsearch 索引模板

冰点
2023-01-20 / 0 评论 / 0 点赞 / 24 阅读 / 16910 字


索引模板是 Elasticsearch 中极具价值的配置利器。当创建新索引时,Elasticsearch 会自动搜寻与之匹配的索引模板,并依据模板配置生成索引,就像建筑工人严格按照设计图纸搭建房屋。​

以车联网系统为例,道路上行驶的每辆车都是数据的生产者,它们实时回传着各种报警信息,如刹车失灵、轮胎气压异常、发动机故障等。每天产生的数据量庞大且繁杂,如果没有索引模板,每次创建新索引存储报警数据都要手动设置分片数量、副本数量,定义报警时间、车辆 ID 等字段类型,不仅效率低下,还极易出错。而有了索引模板,我们提前设定好规则,新索引创建时就能 “一键配置”,让海量报警数据精准、高效地存储。

一、什么是索引模板

索引模板是 Elasticsearch 中一种强大的配置工具,它允许我们预先定义索引的各项设置和映射结构。当创建新索引时,Elasticsearch 会自动查找与之匹配的索引模板,并按照模板中的配置来创建索引。这就好比建筑工人在建造房屋之前,先依据设计图纸进行规划,而索引模板就是 Elasticsearch 创建索引的 “设计图纸”。

以车联网系统中的报警事件数据存储为例,假设每天都会产生大量不同类型的车辆报警数据,我们可以利用索引模板,提前规划好索引的分片数量、副本数量,以及报警时间、车辆 ID 等字段的数据类型,确保新创建的索引能够高效、规范地存储数据。

二、模板类型

(一)传统索引模板

在 Elasticsearch 7.8 版本之前,传统索引模板是我们常用的模板类型。它包含了索引的完整配置信息,涵盖了settings(索引设置)、mappings(字段映射)和aliases(别名)等内容 。

例如,在车联网项目中,我们可以创建一个名为vehicle_alarm_template的传统索引模板:

PUT _template/vehicle_alarm_template
{
  "index_patterns": ["vehicle-alarm-*"],
  "priority": 100,
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1,
    "refresh_interval": "30s"
  },
  "mappings": {
    "properties": {
      "vehicle_id": {
        "type": "keyword"
      },
      "alarm_time": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      },
      "alarm_type": {
        "type": "keyword"
      },
      "alarm_level": {
        "type": "integer"
      },
      "latitude": {
        "type": "double"
      },
      "longitude": {
        "type": "double"
      }
    }
  },
  "aliases": {
    "current_vehicle_alarm": {}
  }
}

当创建vehicle-alarm-2025-06-21这样的索引时,Elasticsearch 会根据index_patterns匹配到该模板,然后按照模板中的设置,将索引划分为 5 个分片,1 个副本,设置刷新间隔为 30 秒,并为各个字段定义好数据类型,同时为索引添加current_vehicle_alarm别名。

(二)组件模板(7.8 版本引入)

随着业务的发展,当索引配置变得复杂,且存在许多重复的配置项时,传统索引模板就显得有些力不从心。于是,Elasticsearch 7.8 版本引入了组件模板。组件模板专注于某一类配置,如只包含settings或mappings,它可以被多个索引模板或其他组件模板引用,极大地提高了配置的复用性。

比如在车联网系统中,我们可以创建一个通用的vehicle_common_settings组件模板来定义一些常用的索引设置:

PUT _component_template/vehicle_common_settings
{
  "template": {
    "settings": {
      "number_of_shards": 4,
      "number_of_replicas": 1,
      "index.lifecycle.name": "vehicle_alarm_lifecycle"
    }
  },
  "version": 1,
  "description": "Common settings for vehicle alarm indices"
}

再针对特定的报警类型,如轮胎压力报警,创建tire_pressure_mappings组件模板来定义相关字段映射:

PUT _component_template/tire_pressure_mappings
{
  "template": {
    "mappings": {
      "properties": {
        "tire_pressure_value": {
          "type": "double"
        },
        "tire_position": {
          "type": "keyword"
        }
      }
    }
  },
  "version": 1,
  "description": "Mappings for tire pressure alarm"
}

然后通过组合这些组件模板,构建出完整的索引模板。

三、索引模板中的优先级

当存在多个索引模板都能匹配同一个索引时,Elasticsearch 需要确定应用哪个模板的配置,这时就涉及到了索引模板的优先级。

优先级是一个整数值,数值越大,优先级越高。当多个模板匹配同一个索引时,高优先级的模板会覆盖低优先级模板的配置。例如,在车联网项目中,我们有两个索引模板都匹配vehicle-alarm-*:

模板 A:

PUT _template/vehicle_alarm_template_a
{
  "index_patterns": ["vehicle-alarm-*"],
  "priority": 80,
  "settings": {
    "number_of_shards": 3
  }
}

模板 B:

PUT _template/vehicle_alarm_template_b
{
  "index_patterns": ["vehicle-alarm-*"],
  "priority": 90,
  "settings": {
    "number_of_shards": 4
  }
}

当创建vehicle-alarm-2025-06-22索引时,由于模板 B 的优先级更高,所以该索引的分片数量将被设置为 4,而不是模板 A 中的 3。

四、内置索引模板

Elasticsearch 自带了一些内置索引模板,这些模板为 Elasticsearch 的核心功能提供了基础配置支持。

(一)_template/default

这是默认模板,优先级为 0。当创建的索引没有匹配到其他任何模板时,会应用该模板的配置。它为索引提供了一些基本的默认设置,确保索引能够正常创建和运行。

(二)logstash-*

此模板主要用于 Logstash 工具创建的索引。Logstash 是一款常用的数据收集、处理和转发工具,logstash-*模板为其生成的索引提供了默认的配置,如字段映射、索引设置等,方便用户快速使用 Logstash 进行数据处理。

(三)beats-*

beats-*模板是为 Beats 系列工具(如 Filebeat、Metricbeat 等)创建的索引服务的。这些工具用于收集各种类型的数据,beats-*模板为它们生成的索引提供了合适的配置,保证数据能够正确存储和索引。

(四)kibana-*

该模板用于 Kibana 相关索引的配置。Kibana 是 Elasticsearch 的可视化工具,kibana-*模板为 Kibana 存储仪表盘、可视化图表等数据的索引提供了必要的设置和映射。

五、案例模拟

(一)多组件模板模拟

在车联网系统中,我们来模拟创建多个组件模板,并组合成完整的索引模板。

首先创建vehicle_common组件模板,定义通用的索引设置和部分字段映射:

PUT _component_template/vehicle_common
{
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1
    },
    "mappings": {
      "properties": {
        "vehicle_id": {
          "type": "keyword"
        },
        "alarm_time": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        }
      }
    }
  },
  "version": 1,
  "description": "Common settings and mappings for vehicle alarm indices"
}

接着创建engine_fault_mappings组件模板,专门用于发动机故障报警相关的字段映射:

PUT _component_template/engine_fault_mappings
{
  "template": {
    "mappings": {
      "properties": {
        "engine_error_code": {
          "type": "keyword"
        },
        "engine_status": {
          "type": "keyword"
        }
      }
    }
  },
  "version": 1,
  "description": "Mappings for engine fault alarm"
}

然后创建brake_fault_mappings组件模板,用于刹车故障报警的字段映射:

PUT _component_template/brake_fault_mappings
{
  "template": {
    "mappings": {
      "properties": {
        "brake_pressure": {
          "type": "double"
        },
        "brake_wear_level": {
          "type": "integer"
        }
      }
    }
  },
  "version": 1,
  "description": "Mappings for brake fault alarm"
}

最后,将这些组件模板组合成vehicle_engine_brake_template索引模板:

PUT _template/vehicle_engine_brake_template
{
  "index_patterns": ["vehicle-engine-brake-alarm-*"],
  "priority": 110,
  "composed_of": ["vehicle_common", "engine_fault_mappings", "brake_fault_mappings"],
  "template": {
    "settings": {
      "index.lifecycle.name": "engine_brake_alarm_policy"
    },
    "mappings": {
      "properties": {
        "combined_fault_info": {
          "type": "text"
        }
      }
    }
  }
}

(二)某个索引结果模拟

当我们创建vehicle-engine-brake-alarm-2025-06-23索引时,Elasticsearch 会按照以下步骤应用模板配置:

  1. 先应用vehicle_common组件模板中的设置,将索引分片数设为 3,副本数设为 1,并为vehicle_id和alarm_time字段设置好数据类型。

  1. 接着应用engine_fault_mappings组件模板,添加engine_error_code和engine_status字段的映射。

  1. 再应用brake_fault_mappings组件模板,添加brake_pressure和brake_wear_level字段的映射。

  1. 最后应用vehicle_engine_brake_template自身模板中的设置,添加index.lifecycle.name索引生命周期策略设置,并为combined_fault_info字段设置数据类型。

通过 GET 请求查看该索引的配置:

GET vehicle-engine-brake-alarm-2025-06-23/_settings,_mappings

返回结果会包含上述所有模板配置合并后的内容,展示出完整的索引设置和字段映射。

(三)组件模板结果模拟

我们单独查看vehicle_common组件模板应用后的效果。假设创建一个临时索引test_vehicle_common,我们可以手动应用vehicle_common组件模板的配置:

PUT test_vehicle_common
{
  "settings": {
    "index": {
      "lifecycle": {
        "name": "test_lifecycle"
      }
    }
  },
  "mappings": {
    "_source": {
      "enabled": true
    },
    "properties": {
      "test_field": {
        "type": "text"
      }
    }
  }
}

然后通过修改索引配置,应用vehicle_common组件模板:

PUT test_vehicle_common/_settings
{
  "index": {
    "lifecycle": {
      "name": "test_lifecycle"
    },
    "number_of_shards": "{{vehicle_common.settings.number_of_shards}}",
    "number_of_replicas": "{{vehicle_common.settings.number_of_replicas}}"
  }
}
PUT test_vehicle_common/_mapping
{
  "properties": {
    "vehicle_id": {
      "type": "keyword"
    },
    "alarm_time": {
      "type": "date",
      "format": "yyyy-MM-dd HH:mm:ss"
    }
  }
}

此时,通过 GET 请求查看test_vehicle_common索引配置,就能看到vehicle_common组件模板中设置的分片数、副本数以及vehicle_id、alarm_time字段映射已经生效。

(四)组件模板和自身模板结合后的结果模拟

以vehicle_engine_brake_template索引模板为例,我们再次创建vehicle-engine-brake-alarm-2025-06-24索引。在创建过程中,Elasticsearch 将组件模板和自身模板的配置进行了深度融合。

组件模板提供了基础的、可复用的配置部分,而自身模板则针对特定需求,补充了索引生命周期策略和特有的combined_fault_info字段等配置。最终创建的索引,既具备了通用的索引设置和常见报警字段映射,又满足了发动机和刹车故障报警数据存储的特殊要求,实现了灵活且高效的数据管理。

六、参考文章

  1. Elasticsearch 官方文档 - 索引模板

  1. Elasticsearch 官方文档 - 组件模板

0

评论区