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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 1、 引言业务场景1:数据量非常大,需要进行索引生命周期管理,按日期划分索引,要求多个索引的Mapping一致,每次手动创建或者脚本创建都很麻烦! 怎么破?业务场景2:实际业务多个索引,想让多个索引中的相同名字的字段类型完全一致,以便实现跨索引检索。怎么破?

image.png

链接

思考上面两个问题,当单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类型。


更多分类如下:

image.png

核心参见:


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体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
6月前
|
存储 搜索推荐 Java
|
6月前
|
API 索引
ElasticSearch索引模板
ElasticSearch索引模板
290 1
|
存储 人工智能 自然语言处理
Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]
Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]
Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]
|
4月前
|
存储 自然语言处理 算法
面试题ES问题之Solr和Elasticsearch功能实现如何解决
面试题ES问题之Solr和Elasticsearch功能实现如何解决
54 2
|
13天前
|
测试技术 API 开发工具
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
31 8
|
13天前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
19 1
|
29天前
|
机器学习/深度学习 存储 运维
探索未来:结合机器学习功能拓展Elasticsearch应用场景
【10月更文挑战第8天】随着数据量的爆炸性增长,高效的数据存储、检索和分析变得越来越重要。Elasticsearch 作为一个分布式的搜索和分析引擎,以其强大的全文搜索能力、实时分析能力和可扩展性而闻名。近年来,随着机器学习技术的发展,将机器学习集成到 Elasticsearch 中成为了一种新的趋势,这不仅增强了 Elasticsearch 的数据分析能力,还开拓了一系列新的应用场景。
48 7
|
6月前
|
存储 监控 API
Elasticsearch 8.X Rollup 功能详解及避坑指南
Elasticsearch 8.X Rollup 功能详解及避坑指南
68 0
|
2月前
|
JSON 自然语言处理 算法
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
|
5月前
|
存储 JSON API
Elasticsearch中的模板:定义、作用与实践
Elasticsearch中的模板:定义、作用与实践
下一篇
无影云桌面