文章转载自:

https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484584&idx=1&sn=accfb65830255f00c28ac1571725e493&chksm=eaa82c80dddfa596bef19161d713fe935142eda894f11d065a38495cd3e7ec59157403c5393f&scene=21#wechat_redirect

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 增

1PUT _template/template_1

2...

如第二节的示例。

3.2 删

1DELETE /_template/template_1

3.3 改

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

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

3.4 查

1GET /_template/template_1

4、Elasticsearch模板进阶实战

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

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

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

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

实战如下:

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呢?

正确写法参考:

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

Elasticsearch基础但非常有用的功能之二:模板的更多相关文章

  1. Elasticsearch基础但非常有用的功能之一:别名

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484454&idx=1&sn=43e95a2 ...

  2. Elasticsearch 基础介绍

    # Elasticsearch简介 ## 基础概念 ​ Elasticsearch由Shay banon在2004年进行初步开发,并且在2010年2月发布第一个版本. ​ 此后Shay banon在2 ...

  3. ELK(elasticsearch+kibana+logstash)搜索引擎(二): elasticsearch基础教程

    1.elasticsearch的结构 首先elasticsearch目前的结构为 /index/type/id  id对应的就是存储的文档ID,elasticsearch一般将数据以JSON格式存储. ...

  4. ipython, 一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数

    一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数. 若用的是fish s ...

  5. XMind十大最有用的功能

    XMind十大最有用的功能 XMind是一款顶级商业品质的思维导图软件和头脑风暴软件,在企业和教育领域都有很广泛的应用,XMind功能全面,易上手,在此小编给大家整理出了XMind十大最有用的功能以供 ...

  6. RAC和单节点数据库的区别有哪些?RAC最有用的功能是什么?

    区别 (1)RAC有2个以上的实例,单节点只有1个实例 (2)RAC具有实例级别的高可用 (3)实例与实例之间通过内联网络交换数据,单节点不可 (4)RAC每个节点都有自己套SGA.后台进程.redo ...

  7. 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  8. Elasticsearch 基础入门

    原文地址:Elasticsearch 基础入门 博客地址:http://www.extlight.com 一.什么是 ElasticSearch ElasticSearch是一个基于 Lucene 的 ...

  9. ElasticSearch 基础 1

    ElasticSearch 基础=============================== 索引创建 ========================== 1. RESTFUL APIAPI 基本 ...

随机推荐

  1. java通过注解顺序通过映射导出excel

    import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.ann ...

  2. day02_基本语法

    基本语法 学习目标: 1. 数据类型 2. 变量 3. 编码介绍 4. 标识符和关键字 5. 字符串类型 6. 数据类型转化 7. 进制转换 8. 运算符 一.数据类型 什么是数据类型? 在开发软件的 ...

  3. 【跟着大佬学JavaScript】之数组去重(结果对比)

    前言 数组去重在面试和工作中都是比较容易见到的问题. 这篇文章主要是来测试多个方法,对下面这个数组的去重结果进行分析讨论.如果有不对的地方,还请大家指出. const arr = [ 1, 1, &q ...

  4. GRPC头测试记录

    GRPC头记录 http://nodejs.cn/api/http2/note_on_authority_and_host.html https://cloud.tencent.com/develop ...

  5. Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_182 之前的一篇文章:mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能,主要介绍了微信小程序内 ...

  6. linux-0.11分析:boot文件 head.s 第三篇随笔

    head.s 参考 [github这个博主的][ https://github.com/sunym1993/flash-linux0.11-talk ] 改变栈顶位置 _pg_dir: startup ...

  7. 高并发之网络IO模型

    你好,我是坤哥 今天我们聊一下高并发下的网络 IO 模型 高并发即我们所说的 C10K(一个 server 服务 1w 个 client),C10M,写出高并发的程序相信是每个后端程序员的追求,高并发 ...

  8. 百亿数据百亿花, 库若恒河沙复沙,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang数据库操作实践EP12

    Golang可以通过Gorm包来操作数据库,所谓ORM,即Object Relational Mapping(数据关系映射),说白了就是通过模式化的语法来操作数据库的行对象或者表对象,对比相对灵活繁复 ...

  9. Webstorm设置背景图为Windows桌面背景

    桌面背景图会缓存在这个目录中,文件名不确定在改变桌面背景后会不会变. C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Themes\CachedFiles ...

  10. 盘点Vue2和Vue3的10种组件通信方式(值得收藏)

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异:本文将通过选项式API 组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式.其中将要实现的通信 ...