干货 | Elasticsearch基础但非常有用的功能之二:模板
1、 引言
业务场景1: 数据量非常大,需要进行索引生命周期管理,按日期划分索引,要求多个索引的Mapping一致,每次手动创建或者脚本创建都很麻烦! 怎么破?
业务场景2: 实际业务多个索引,想让多个索引中的相同名字的字段类型完全一致,以便实现跨索引检索。 怎么破?
思考上面两个问题,当单Mapping不能解决多索引问题时,模板的作用就体现出来了。
下文中: 模板=template,映射=Mapping。
2、Elasticsearch模板是什么鬼?
【维基百科】模板: 或称样板、范本,通常指具有固定内容、可构建多个不同实例的可重用样板。
Elasticsearch索引template指: 在创建新索引时将自动套用的模板。
直接上样例,一探究竟。
1 PUT _template/template_1
2 {
3 “index_patterns” : [ “te*” , “bar*” ],
4 “aliases” : {
5 “alias1” : {}}
6 “settings” : {
7 “number_of_shards” : 1
8 },
9 “mappings” : {
10 “_source” : {
11 “enabled” : false
12 },
13 “properties” : {
14 “host_name” : {
15 “type” : “keyword”
16 },
17 “created_at” : {
18 “type” : “date” ,
19 “format” : “EEE MMM dd HH:mm:ss Z yyyy”
20 }
21 }
22 }
23 }
其中:
index_patterns代表匹配的索引。
settings 指索引层面的设置。
可以设置索引层面的配置,包括:
-
分片数(number_of_shards)、
-
副本数(number_of_replicas)、
-
刷新频率(refresh_interval)
…..
mappings:字段映射。
aliases:指定索引的别名。
别名的妙处参考: Elasticsearch基础但非常有用的功能之一:别名
3、Elasticsearch模板的基础操作
3.1 增
1 PUT _template/template_1
2 …
如第二节的示例。
3.2 删
1 DELETE /_template/template_1
3.3 改
直接执行3.1的创建模板操作,会生成相同名称的新的模板,并会覆盖掉原来创建的模板。
新模板只对新创建的索引生效,对 历史索引不起作用 。
3.4 查
1 GET /_template/template_1
4、Elasticsearch模板进阶实战
当template和Mapping的dynamic_templates结合就相当于 放了大招
。
直接拿个实战例子说明问题。
需求1: 默认如果不显示指定Mapping,数值类型的值会被映射会long类型,但实际业务数值都比较小,会有存储浪费。 需要将默认值改成integer。
需求2: date_*开头的字符统一匹配为date日期类型。
实战如下:
1 PUT sampleindex/_doc/ 1
2 {
3 “Value” : 123
4 }
5
6 GET sampleindex/_mapping
7
8
9 PUT _template/sample_dynamic_template
10 {
11 “index_patterns” : [
12 “sample*”
13 ],
14 “mappings” : {
15 “dynamic_templates” : [
16 {
17 “handle_integers” : {
18 “match_mapping_type” : “long” ,
19 “mapping” : {
20 “type” : “integer”
21 }
22 }
23 },
24 {
25 “handle_date” : {
26 “match” : “date_*” ,
27 “unmatch” : “*_text” ,
28 “mapping” : {
29 “type” : “date”
30 }
31 }
32 }
33 ]
34 }
35 }
36
37 DELETE sampleindex
38 PUT sampleindex/_doc/ 1
39 {
40 “Value” : 123 ,
41 “date_curtime” : “1574494620000”
42 }
43
44 GET sampleindex/_mapping
-
index_patterns:对应待匹配的以”sample开头的“索引。
-
handle_integers:动态模板的名字,你可以自己定义。
-
match_mapping_type:被匹配的被重写的源数据类型。
-
match/unmatch:匹配字段类型。
整个操作的核心是: 将默认的long改成integer,date_*开头匹配为date类型。
更多分类如下:
核心参见:
https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html
不再赘述。
5、常见问题
问题1:template和Mapping到底什么区别?
-
Mapping:
针对单一索引。
类似Mysql中的表结构定义,是所有数据存储到该索引的架构定义。
字段支持:
1)静态明确定义、2)系统层面自动识别、3)动态匹配。
-
template:
针对一个或多个索引。
除了定义Mapping的全支持外,还可以指定Setting、别名等。
适合数据量大、灵活多变的业务场景。
问题2:模板里可以指定Mapping,那我们还需要Mapping做什么?
-
索引模板对于在多个索引创建映射时非常有用。
-
如果数据量少,业务场景单一,那只Mapping也能解决问题。
问题3:如果我想更新Mapping,更新模板可以吗?
认知前提: Mapping一旦创建了,不能修改。 除非进行reindex操作。
-
一旦创建了索引,对索引模板的更新将不会影响该索引。更新模板仅适用于新索引。
-
同样,更新为dynamic_templates仅会影响索引中的新字段。
问题4:模板order起到什么作用?
拿星球同学实战例子举例一下:
问题: 我现在想创建2个template,其中模板B-template有副本设置,另外一个A-template没有副本设置,我可以这样配置吗?
-
其中B-template匹配到我单独设置的几个索引(”logstash-B-tomcat- “,”logstash-B1-tomcat- “,”logstash-B2-server-*”,”logstash-B3-tomcat”),
-
另外A-template匹配所有,我设置B-template的order比A-template高,是不是我那4个索引就会匹配到B-template呢?
正确写法参考:
1 PUT _template/b- template
2 {
3 “order” : 1 ,
4 “index_patterns” :[ “logstash-b-tomcat-*” , “logstash-b1-tomcat-*” , “logstash-b2-server-*” , “logstash-b3-tomcat-*” ],
5 “settings” :{
6 “number_of_shards” : “5” ,
7 “number_of_replicas” : “1” ,
8 “refresh_interval” : “30s” ,
9 “translog.durability” : “async”
10 }
11 }
12
13 PUT logstash-b-tomcat -1
14
15 PUT _template/a- template
16 {
17 “order” : 0 ,
18 “index_patterns” :[ “*” ],
19 “settings” :{
20 “number_of_shards” : “5” ,
21 “number_of_replicas” : “0” ,
22 “refresh_interval” : “30s” ,
23 “translog.durability” : “async”
24 }
25 }
核心原理: order高会覆盖order低的模板。
6、小结
实战中,你会发现: template是高效的的工具,可全局设置多个索引且批量生效,避免的不必要的返工。
相比之下Mapping和别名优势如下:
-
Mapping有助于我们保持数据库结构的一致性,并为我们提供Elasticsearch丰富的数据类型以及更复杂的自定义Mapping和分析类型。
-
别名Alias对于最大限度地无需停服完成索引切换起到重要作用。
因此,当我们新系统准备选型Elasticsearch作为核心数据存储时,优先注意数据建模; 数据建模的过程中要整合template、alias和mapping的综合优势,才能保证模型的健壮性。
更多推荐: