最近想写一篇es的索引的一个设计,因为设计的东西特别多,固然,elasticsearch的模板和动态映射也是其中的一个设计点,因此干脆先来聊聊索引的模板和动态映射,模板,听这个名字就至关于一些公共可用的东西能够做为全部索引的一个设置,html
本文为博客园做者所写: 一寸HUI,我的博客地址:https://www.cnblogs.com/zsql/正则表达式
这里说明下,elasticsearch7.8的模板接口发生了一些变化,_template接口将在后期被废弃(虽然还能使用,不推荐),因此本文不介绍这个接口。既然有废弃的那确定有新的方式来玩模板了。sql
最详细接介绍看官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/index-templates.html数组
如今模板分为两种模板,一个索引模板(index templates ),一个是组件模板(component templates),索引模板是告诉Elasticsearch如何在建立索引时配置索引的一种方法。模板是在建立索引以前配置的,当手动或经过索引文档建立索引时,模板的基础设置将用做建立索引。组件模板是可重用的构建块,用于配置映射、设置和别名。使用组件模板来构造索引模板,组件模板不能直接应用于索引。索引模板能够包含组件模板的集合,也能够直接指定设置、映射和别名。组件模板的接口是:_component_template,而索引模板的接口是:_index_template,下面来个官方的例子,能够明显的看出来组件模板component_template1和other_component_template被索引模板经过参数composed_of被引用,因此索引模板template_1既包括本身的设置,又包括了两个组件模板的设置,这样就能够轻松灵活的作组合,下降耦合性。app
PUT _component_template/component_template1
{
"template": {
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
}
}
}
}
}
PUT _component_template/other_component_template
{
"template": {
"mappings": {
"properties": {
"ip_address": {
"type": "ip"
}
}
}
}
}
PUT _index_template/template_1
{
"index_patterns": ["te*", "bar*"],
"template": {
"settings": {
"number_of_shards": 1
},
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"host_name": {
"type": "keyword"
},
"created_at": {
"type": "date",
"format": "EEE MMM dd HH:mm:ss Z yyyy"
}
}
},
"aliases": {
"mydata": { }
}
},
"priority": 10,
"composed_of": ["component_template1", "other_component_template"],
"version": 3,
"_meta": {
"description": "my custom"
}
}
经过上面的接收,应该就清楚了这两个模板之间的关系,能够用来干吗了。接下来一一介绍下这两个模板。elasticsearch
先上官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/indices-templates-v1.htmlide
组件模板是构建索引模板的构建块。好比指定索引映射、设置和别名等。ui
使用语法:spa
PUT /_component_template/<component-template>
索引模板能够由多个组件模板组成。要使用组件模板,请在索引模板经过参数composed_of指定。组件模板仅做为匹配索引模板的一部分。在任何的索引或者索引模板中定义的一些内容(设置,mapping等)都会覆盖组件模板中与之相同的内容,也就是说组件模板等级最低了,容易被取代。组件模板的只会在索引建立的时候生效,修改组件模板不会对现有的索引有影响。下面介绍下组件模板请求体的一些参数:设计
参数名 | 参数介绍 |
template | 必须配置,表名是要应用的模板,能够选择包括映射、设置或别名配置 |
aliases | 配置可选,配置index的别名 |
mappings | 配置可选,配置index的mapping |
settings | 配置可选,配置index的一些通用配置 |
version | 配置可选,用于外部管理组件模板的版本号 |
_meta | 配置可选,用于配置一些介绍信息,好比用户元数据 |
举个例子,一看就懂:
PUT _component_template/template_1
{
"template": {
"settings": {
"number_of_shards": 1
},
"aliases": {
"alias1": {},
"alias2": {
"filter": {
"term": {
"user.id": "kimchy"
}
},
"routing": "shard-1"
},
"{index}-alias": {}
}
},
"version": 123,
"_meta": {
"description": "set number of shards to one",
"serialization": {
"class": "MyComponentTemplate",
"id": 10
}
}
}
先看官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/indices-put-template.html
使用语法:
PUT /_index_template/<index-template>
索引模板定义能够定义设置、映射和别名等,而后经过匹配自动应用于新建的索引。Elasticsearch基于与索引名称匹配的通配符模式将模板应用于新索引,也就是说经过索引进行匹配,看看新建的索引是否符合索引模板,若是符合,就将索引模板的相关设置应用到新的索引,若是同时符合多个索引模板呢,这里须要对参数priority进行比较,这样会选择priority大的那个模板进行建立索引。在建立索引模板时,若是匹配有包含的关系,或者相同,则必须设置priority为不一样的值,不然会报错。索引模板也是只有在新建立的时候起到做用,修改索引模板对现有的索引没有影响。一样若是在索引中设置了一些设置或者mapping都会覆盖索引模板中相同的设置或者mapping。接下来看看建立索引模板请求体的一些参数:
参数名称 | 参数介绍 |
index_patterns | 必须配置,用于在建立期间匹配索引名称的通配符(*)表达式数组 |
template | 可选配置,能够选择包括别名、映射或设置配置 |
composed_of | 可选配置,组件模板名称的有序列表。组件模板按指定的顺序合并,这意味着最后指定的组件模板具备最高的优先级 |
priority | 可选配置,建立新索引时肯定索引模板优先级的优先级。选择具备最高优先级的索引模板。若是未指定优先级,则将模板视为优先级为0(最低优先级) |
version | 可选配置,用于外部管理索引模板的版本号 |
_meta | 可选配置,关于索引模板的可选用户元数据。可能有任何内容 |
看这些,好像很复杂,举个例子就容易了:(匹配全部te开头的新建索引,分片为1,优先级为10)
PUT /_index_template/template_1
{
"index_patterns": [
"te*"
],
"template": {
"settings": {
"number_of_shards": 1
},
"aliases": {
"alias1": {},
"alias2": {
"filter": {
"term": {
"user.id": "kimchy"
}
},
"routing": "shard-1"
},
"{index}-alias": {}
},
"mappings": {
"_source": {
"enabled": true
}
}
},
"version": 123,
"priority": 10,
"_meta": {
"description": "set number of shards to three",
"serialization": {
"class": "MyIndexTemplate",
"id": 17
}
}
}
这里没有说组合索引的使用,请看第一节介绍部分,这两种索引的关系,还有就是组合索引被引用顺序,后者更具备更高的优先级,会覆盖前面的一些组合索引的一些相同的设置,然而组件索引不一样的部分将会叠加在一块儿成为索引模板的设置。语法确实不难,可是怎么应用好呢,好比在elk中使用索引模板写数据到es,好比索引设计,怎么把索引自动滚动呢,这块后期会有文章介绍,尽请期待。固然还有动态模板没有介绍,继续往下走。
注意:其实我的以为把动态模板写这里是为了区分索引模板和动态模板,由于我的混淆过,因此写这里比较好区别,其实动态模板不是索引模板,这里不要误会,其实动态模板就是能够配置在索引中或者配置在索引模板中,做用是elasticsearch对数据探索自发现添加,能够指定匹配,并映射成指定类型。这里要记住elasticsearch只有组合模板和索引模板,动态模板时动态映射的一种实现。动态模板定义了索引建立后新添加字段的映射规则,而索引模板是在建立索引时默认为索引添加的别名、配置和映射等信息。索引模板包含该模板适用索引的模式或规则,以及索引建立时默认包含的别名、配置和映射关系等。它们分别经过index_patterns、aliases、settings和mappings等四个参数设置
在说动态模板以前,先要说说动态映射。
Elasticsearch最重要的功能之一就是能够自动探索数据。要为文档编制索引,没必要首先建立索引、定义映射类型和定义字段,只需为文档编制索引,索引、类型和字段就会自动生成。
自动检测和添加新字段以及字段类型称为动态映射,主要分为动态字段和动态模板。这里引出动态字段和动态模板,因此先看看动态字段。
先看官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/dynamic-field-mapping.html
默认状况下,当在文档中找到索引没有定义的字段时,Elasticsearch会将新字段添加到类型映射中。经过将参数dynamic设置为false(忽略新字段)或strict(遇到未知字段时引起异常),能够在文档和对象级别禁用此行为。
假设启用了动态字段映射,则使用一些简单规则来肯定字段应具备的数据类型:固然不是全部的类型均可以自动映射的,只有field data types这些能够动态的探索映射,因此其余的数据类型须要显示的指定。例如:
提及来可能比较有点很差理解,那就须要例子说明了:
PUT my-index-000001/_doc/1
{
"create_date": "2015/09/02"
}
GET my-index-000001/_mapping
这样就自动把create_date在映射中添加了,而且字段类型为date,这就是动态字段映射,也就是elasticsearch的一个特点,这样就不要给全部的字段提早定义好,可是虽然方便了,可是不利于索引的管理,若是出现了一条异常的数据插入到索引中,这样就会致使索引中的mapping中出现不少没必要要的字段,动态字段映射能够更具需求对其进行配置。
详情见官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/dynamic-templates.html
动态模板(Dynamic Template)用于自定义动态添加字段时的映射规则,可经过索引映射类型的dynamic_templates参数设置。该参数接收一组命名的动态模板,每个模板由匹配条件和映射规则组成。匹配条件定义了新字段是否可使用当前模板,可根据新字段的数据类型、名称和路径来定义条件;而映射规则由参数mapping定义,它须要给出新字段要使用哪些参数,可以使用type定义新字段数据类型。
使用规则以下:
使用语法:
"dynamic_templates": [
{
"my_template_name": { //这里能够随便写,便于辨别就好,
... match conditions ... //这里就是上面说的规则,好比match_mapping_type
"mapping": { ... } //匹配字段使用的映射,意思就是把匹配到的内容映射为你想要设置的内容
}
},
...
]
这里只举例说明一个规则或者说是条件:match_mapping_type
PUT my-index-000002
{
"mappings": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
},
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
]
}
}
PUT my-index-000002/_doc/1
{
"my_integer": 5,
"my_string": "Some string"
}
查看结果
其实静下心来看也不难,其余的规则能够看官网的例子。