前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >干货 | Elasticsearch基础但非常有用的功能之二:模板

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

作者头像
铭毅天下
发布2019-12-04 12:30:41
1.9K0
发布2019-12-04 12:30:41
举报
文章被收录于专栏:铭毅天下铭毅天下

1、 引言

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

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

思考上面两个问题,当单Mapping不能解决多索引问题时,模板的作用就体现出来了。

下文中:模板=template,映射=Mapping。

2、Elasticsearch模板是什么鬼?

【维基百科】模板:或称样板、范本,通常指具有固定内容、可构建多个不同实例的可重用样板。

Elasticsearch索引template指:在创建新索引时将自动套用的模板。

直接上样例,一探究竟。

代码语言:javascript
复制
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 增
代码语言:javascript
复制
1PUT _template/template_1
2...

如第二节的示例。

3.2 删
代码语言:javascript
复制
1DELETE /_template/template_1
3.3 改

直接执行3.1的创建模板操作,会生成相同名称的新的模板,并会覆盖掉原来创建的模板。

新模板只对新创建的索引生效,对历史索引不起作用。

3.4 查
代码语言:javascript
复制
1GET /_template/template_1

4、Elasticsearch模板进阶实战

当template和Mapping的dynamic_templates结合就相当于放了大招

直接拿个实战例子说明问题。

需求1:默认如果不显示指定Mapping,数值类型的值会被映射会long类型,但实际业务数值都比较小,会有存储浪费。需要将默认值改成integer。

需求2:date_*开头的字符统一匹配为date日期类型。

实战如下:

代码语言:javascript
复制
1PUT sampleindex/_doc/1
 2{
 3  "Value":123
 4}
 5
 6GET sampleindex/_mapping
 7
 8
 9PUT _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
37DELETE sampleindex
38PUT sampleindex/_doc/1
39{
40  "Value":123,
41  "date_curtime":"1574494620000"
42}
43
44GET 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呢?

正确写法参考:

代码语言:javascript
复制
1PUT _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
13PUT logstash-b-tomcat-1
14
15PUT _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的综合优势,才能保证模型的健壮性。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、 引言
  • 2、Elasticsearch模板是什么鬼?
  • 3、Elasticsearch模板的基础操作
    • 3.1 增
      • 3.2 删
        • 3.3 改
          • 3.4 查
          • 4、Elasticsearch模板进阶实战
          • 5、常见问题
          • 问题1:template和Mapping到底什么区别?
          • 问题2:模板里可以指定Mapping,那我们还需要Mapping做什么?
          • 问题3:如果我想更新Mapping,更新模板可以吗?
          • 问题4:模板order起到什么作用?
            • 6、小结
            相关产品与服务
            Elasticsearch Service
            腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档