34

干货 | Elasticsearch基础但非常有用的功能之二:模板

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ%3D%3D&%3Bmid=2247484584&%3Bidx=1&%3Bsn=accfb65830255f00c28ac1571725e493
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1、 引言

业务场景1: 数据量非常大,需要进行索引生命周期管理,按日期划分索引,要求多个索引的Mapping一致,每次手动创建或者脚本创建都很麻烦! 怎么破?

业务场景2: 实际业务多个索引,想让多个索引中的相同名字的字段类型完全一致,以便实现跨索引检索。 怎么破?

mAnYfe7.jpg!web

思考上面两个问题,当单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 指索引层面的设置。

可以设置索引层面的配置,包括:

  1. 分片数(number_of_shards)、

  2. 副本数(number_of_replicas)、

  3. 刷新频率(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类型。

更多分类如下:

6zi6Bjv.png!web

核心参见:

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的综合优势,才能保证模型的健壮性。

更多推荐:

重磅 | 死磕Elasticsearch方法论认知清单(2019国庆更新版)

VZBneeI.jpg!web

更短时间,更快习得更多干货!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK