索引模板是 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 会按照以下步骤应用模板配置:
先应用vehicle_common组件模板中的设置,将索引分片数设为 3,副本数设为 1,并为vehicle_id和alarm_time字段设置好数据类型。
接着应用engine_fault_mappings组件模板,添加engine_error_code和engine_status字段的映射。
再应用brake_fault_mappings组件模板,添加brake_pressure和brake_wear_level字段的映射。
最后应用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字段等配置。最终创建的索引,既具备了通用的索引设置和常见报警字段映射,又满足了发动机和刹车故障报警数据存储的特殊要求,实现了灵活且高效的数据管理。
评论区