Elasticsearch Index Templates(索引模板)

Stella981
• 阅读 1018

索引模板,故名思议,就是创建索引的模板,模板中包含公共的配置(settings)和映射(Mapping),并包含一个简单触发条件,及条件满足时使用该模板创建一个新的索引。

注意:模板只在创建索引时应用。更改模板不会对现有索引产生影响。当使用create index API时,作为create index调用的一部分定义的设置/映射将优先于模板中定义的任何匹配设置/映射。

一个索引模板示例如下:

 1PUT _template/template_1 2{ 3  "index_patterns": [“ubi*”],                //@1 4  "settings": {                                               //@2  5    "number_of_shards": 1 6  }, 7  "mappings": {                                             //@3 8    "_doc": { 9      "_source": {10        "enabled": false11      },12      "properties": {13        "host_name": {14          "type": "keyword"15        },16        "created_at": {17          "type": "date",18          "format": ""19        }20      }21    }22  }23}

代码@1:触发条件。
代码@2:索引配置定义。
代码@3:索引映射配置。

上述示例对应的JAVA示例如下:

 1public static final void createIndexTemp() { 2        RestHighLevelClient client = EsClient.getClient(); 3        try { 4            PutIndexTemplateRequest request = new PutIndexTemplateRequest("ubi_index_template") 5            List<String> indexPatterns = new ArrayList<String>(); 6            indexPatterns.add("ubi*"); 7            request.patterns(indexPatterns); 8 9            /** mapping */10            XContentBuilder jsonBuilder = XContentFactory.jsonBuilder()11                    .startObject()12                        .startObject("_source")13                            .field("enabled", false)14                        .endObject()1516                        .startObject("properties")17                            .startObject("host_name")18                                .field("type", "keyword")19                            .endObject()20                            .startObject("created_at")21                                .field("type", "date")22                                .field("format", "yyyy-MM-dd HH:mm:ss")23                            .endObject()2425                        .endObject()26                    .endObject();272829            request.mapping("_doc", jsonBuilder);3031            Map<String, Object> settings = new HashMap<>();3233            settings.put("number_of_shards", 1);34            request.settings(settings);3536            System.out.println(client.indices().putTemplate(request, RequestOptions.DEFAULT));3738        } catch (Exception e) {39            // TODO: handle exception40        } finally {41            EsClient.close(client);42        }43    }

上述索引模板创建好之后,然后在向一个不存在的索引添加文档时,如果能找到合适的模板,则自动创建索引,否则抛出索引不存在,例如:

 1public static void index_template() { 2        ElasticsearchTemplate template = new ElasticsearchTemplate(); 3        try { 4            Map<String, String> data = new HashMap<>(); 5            data.put("host_name", "localhost"); 6            data.put("created_at", "2019-04-07 23:05:04"); 7            //ubi_201904该索引一开始不存在,但索引ubi_201904符合ubi_index_template 8            //中定义的匹配表达式ubi*,所以会自动创建索引。 9            template.index("ubi_201904", "_doc", data);10        } finally {11            template.close();12        }13    }

其返回结果:

1IndexResponse[index=ubi_201904,type=_doc,id=lCJZ-GkBrOLJP-QWff3I,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]

那如果能匹配到多个模板呢?

多个索引模板可能匹配一个索引,可以使用order属性为索引模板指定顺序。从顺序较小的开始寻找,order越大,越优先(前提是匹配模板表达式)。

举例如下:

 1PUT /_template/template_1 2{ 3    "index_patterns" : ["*"], 4    "order" : 0, 5    "settings" : { 6        "number_of_shards" : 1 7    }, 8    "mappings" : { 9        "_doc" : {10            "_source" : { "enabled" : false }11        }12    }13}1415PUT /_template/template_216{17    "index_patterns" : ["te*"],18    "order" : 1,19    "settings" : {20        "number_of_shards" : 121    },22    "mappings" : {23        "_doc" : {24            "_source" : { "enabled" : true }25        }26    }27}

首先从order=0进行匹配,由于其表达式为*,则默认会全匹配,故首先尝试使用该模板,然后再遍历下一个模板,也就是order=1的模板,如果匹配,则使用第二个模板的配置,如果不匹配,则使用第一个模板的配置,依次类推。

其匹配的具体实现逻辑大概如下:
1、对所有的模板按照order属性进行升序排序。
2、遍历所有的模板,进行表达式匹配,匹配成功,则设置为当前匹配模板,然后判断下一个,直到把所有的模板都处理过。
3、选最后匹配的模板当成最后的模板。

那如果存在多个模板,其order相同,那其顺序能保证吗?

答案是不能保证,因为对所有模板进行排序的过程中,如果order相同,其顺序无法得到保证。

思考:索引模板的使用场景是什么呢?欢迎大家留言讨论。


更多文章请关注微信公众号:

Elasticsearch Index Templates(索引模板)


作者新书《RocketMQ技术内幕》已成功上市。

Elasticsearch Index Templates(索引模板)

《RocketMQ技术内幕》已出版上市,目前可在主流购物平台(京东、天猫等)购买,本书从源码角度深度分析了RocketMQ NameServer、消息发送、消息存储、消息消费、消息过滤、主从同步HA、事务消息;在实战篇重点介绍了RocketMQ运维管理界面与当前支持的39个运维命令;并在附录部分罗列了RocketMQ几乎所有的配置参数。本书得到了RocketMQ创始人、阿里巴巴Messaging开源技术负责人、Linux OpenMessaging 主席的高度认可并作序推荐。目前是国内第一本成体系剖析RocketMQ的书籍。

本文分享自微信公众号 - 中间件兴趣圈(dingwpmz_zjj)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
添砖java的啾 添砖java的啾
3年前
distinct效率更高还是group by效率更高?
目录00结论01distinct的使用02groupby的使用03distinct和groupby原理04推荐groupby的原因00结论先说大致的结论(完整结论在文末):在语义相同,有索引的情况下groupby和distinct都能使用索引,效率相同。在语义相同,无索引的情况下:distinct效率高于groupby。原因是di
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Elasticsearch 索引模板
概述记录自己在工作中将生产的数据按月保存在ES中(通过logstash采集kafka数据到ES),由于生产环境数据量比较庞大(一天的日志量大概在2500万条左右),为了后期减轻服务器压力,方便我们维护,所以需要对我们的日志进行处理,按月建立不同的ES索引库,能够查询最近6个月的日志,关闭前6个月不用的日志。创建模板如果用户每次新建
Wesley13 Wesley13
3年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Wesley13 Wesley13
3年前
MySQL索引的索引长度问题
MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制。在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,注意这里索引的长度的计算是根据表字段设定的长度来标量的,例如:createtabletest(idint,name1varchar(300),name2varchar(300),nam
Stella981 Stella981
3年前
Elasticsearch Dynamic Mapping(动态映射机制)
Elasticsearch可以根据待索引数据自动建立索引、自动定义映射类型。1PUT data/_doc/1 2{ "count": 5 }执行上述请求时,索引"data"不必预先创建,该API首先会自动创建索引data、类型映射\_doc,其映射类型下包含字段count,其类型为long。自动根据文档的值推测其类型的过程,就是本文要重点描述
Stella981 Stella981
3年前
ES中删除索引的mapping字段时应该考虑的点
1.创建新索引2.新索引创建新mapping3.原索引导出数据到新索引4.新索引创建原索引一致的别名5.删除原索引针对于第四步:这个就要用到索引别名了,如果你最开始建索引的时候没有考虑设计索引别名,那就杯具了。你可以把索引的名称设置成name\_v1 别名设置为name,然后代码里面访问搜索的时候连接的其实是别名na
Stella981 Stella981
3年前
ELK学习笔记之ElasticSearch的索引详解
0x00ElasticSearch的索引和MySQL的索引方式对比Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询。倒排索引很多地方都有介绍,但是其比关系型