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 增
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基础但非常有用的功能之二:模板的更多相关文章
- Elasticsearch基础但非常有用的功能之一:别名
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484454&idx=1&sn=43e95a2 ...
- Elasticsearch 基础介绍
# Elasticsearch简介 ## 基础概念 Elasticsearch由Shay banon在2004年进行初步开发,并且在2010年2月发布第一个版本. 此后Shay banon在2 ...
- ELK(elasticsearch+kibana+logstash)搜索引擎(二): elasticsearch基础教程
1.elasticsearch的结构 首先elasticsearch目前的结构为 /index/type/id id对应的就是存储的文档ID,elasticsearch一般将数据以JSON格式存储. ...
- ipython, 一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数
一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数. 若用的是fish s ...
- XMind十大最有用的功能
XMind十大最有用的功能 XMind是一款顶级商业品质的思维导图软件和头脑风暴软件,在企业和教育领域都有很广泛的应用,XMind功能全面,易上手,在此小编给大家整理出了XMind十大最有用的功能以供 ...
- RAC和单节点数据库的区别有哪些?RAC最有用的功能是什么?
区别 (1)RAC有2个以上的实例,单节点只有1个实例 (2)RAC具有实例级别的高可用 (3)实例与实例之间通过内联网络交换数据,单节点不可 (4)RAC每个节点都有自己套SGA.后台进程.redo ...
- 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能
第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...
- Elasticsearch 基础入门
原文地址:Elasticsearch 基础入门 博客地址:http://www.extlight.com 一.什么是 ElasticSearch ElasticSearch是一个基于 Lucene 的 ...
- ElasticSearch 基础 1
ElasticSearch 基础=============================== 索引创建 ========================== 1. RESTFUL APIAPI 基本 ...
随机推荐
- 编译安装Python出现“pip is configured with locations that require TLS/SSL, however the ssl.....”
ubuntu: sudo apt-get install libssl-dev Cenos: sudo yum install openssl-devel 重新编译: ./configure --en ...
- BUCK 电路PSIM仿真模型搭建之一 (PI模块稳定性分析)
1. 利用PI 模块仿真BUCK 电路电流环 在调制通道上未加入延迟环节时,无论KP, KI 参数如何调整系统都是稳定的 仿真结果: 在调制通道上引入 一个开关周期的延迟 系统出现明显的震荡情况,说 ...
- led闪烁(时序输入输出,自定义变量,时钟仿真,执行顺序)
1.设计定义 设计一个以200ms亮,200ms暗交替闪烁的led灯,并且有一个复位按钮可以停止工作. 2.设计输入 2.1端口 以固定周期交替闪烁说明由时钟控制,需要一个时钟控制端口clk,要求复位 ...
- jdbc 07: 解决sql注入
jdbc连接mysql,解决sql注入问题 package com.examples.jdbc.o7_解决sql注入; import java.sql.*; import java.util.Hash ...
- NOI / 2.1基本算法之枚举 1749:数字方格
描述: 如上图,有3个方格,每个方格里面都有一个整数a1,a2,a3.已知0 <= a1, a2, a3 <= n,而且a1 + a2是2的倍数,a2 + a3是3的倍数, a1 + a2 ...
- java的访问权限protected和default
protected和default的区别 第一点:在同一个包中,protected和default表现一致,即,当main方法所在的类和使用了protected与default修饰属性.方法的类在同一 ...
- JUC源码学习笔记3——AQS等待队列和CyclicBarrier,BlockingQueue
一丶Condition 1.概述 任何一个java对象都拥有一组定义在Object中的监视器方法--wait(),wait(long timeout),notify(),和notifyAll()方法, ...
- TCP协议调试工具TcpEngine V1.3.0使用教程
简介 这里说的TCP协议调试定义是在开发长连接TCP协议应用时,为了验证代码流程或查找bug,需要与对端交互数据过来,当需要时可以暂停发送:单条发送:跳过发送:正常发送:发送时修改数据等. T ...
- Azure Devops(十四) 使用Azure的私有Nuget仓库
哈喽大家好,最近因为工作的原因没有时间写文章,断更了俩月,今天我们开始继续研究Azure上的功能. 今天我们开始研究一下Azure的制品仓库,在之前的流水线的相关文章中,我们都使用到了制品仓库用来保存 ...
- 第十二天python3 匿名函数
python借助lambda表达式构建匿名函数: 参数列表不需要小括号: 冒号是用来分割参数列表和表达式的: 不需要使用return,表达式的值,就是匿名函数返回值: lambda表达式(匿名函数)只 ...