1、说明
创建索引模板使用PUT方法,索引模板用于定义在创建新的索引时自动应用的模板,可以创建普通索引模板,也可以创建别名索引模板等,索引模板中的信息主要包括以下部份:
- 可套用该索引模板的索引名称格式,名称支持通配符,也可以配置多个名称格式匹配格式;
- 索引的基本设置(settings);
- 索引的字段映射(mapping)信息;
- 别名(alias);
- ...
模板创建语句语法如下所示:
PUT _template/my_template { "index_patterns": ..., "settings": { ... }, "mappings": { ... } } |
注意事项
- 索引套用模板是在索引的创建阶段,后续模板的修改都不会对已经存在的索引产生影响了,对索引本身的修改也不会对模板产生影响;
- 如果在创建索引的时候指定了设置或(和)字段映射信息,则指定的设置或(和)字段映射信息则会优先于模板应用到被创建的索引上;
- 创建的索引如果符合多个索引模板的定义,则会应用多个索引模板的定义,不过此时为了避免混淆,需要为模板设定一个优先级;
2、模板创建示例
普通索引模板
普通索引模板通常用于定义索引中字段的映射、用到的配置的预定义等,以下示例为“logs_”和“others_”开头的索引创建模板,操作如下:
PUT _template/logs_and_others_template { /*索引的名称支持通配符*/ "index_patterns": ["logs_*", "others_*"], "settings": { /*主分片的数量*/ "number_of_shards": 1, "number_of_replicas":0 }, "mappings": { "_source": { "enabled": false }, "properties": { "user_name": { "type": "keyword" }, "created": { "type": "date" } } } } |
定义模板的时候,支持使用C语言格式的注释/**/,JSON内容内部任何地方都可以使用注释,这个示例展示了两个注释示例。
别名索引模板
别名索引模板通常用于给索引定义一些索引别名、过滤器别名或路由别名等,自动创建一些索引“视图”,方便后续使用,操作如下:
PUT _template/logs_and_others_alias_template { "index_patterns": ["logs_*", "others_*"], "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "aliases": { /*定义别名*/ "{index}-alias": {}, "alias_tomcat_filter": { "filter": { "term": { "user_name": "tomcat" } }, "routing": "tomcat" } } } |
注:该别名模板中使用了{index}占位符变量,创建索引时,{index}会被替换为真实的索引名称,以达到模板中定义别名的唯一性。
3、查看模板
查看模板的定义,使用GET方法,操作如下:
GET /_template/logs_and_others_alias_template |
上面的语句是查看索引模板logs_and_others_alias_template的定义,如果希望查看其中某一部份的定义,如settings,可以使用以下语句:
GET /_template/logs_and_others_alias_template?filter_path=*.settings |
4、修改模板
模板的修改和模板的创建是一样的操作流程,只需要把修改后的模板,按照创建模板的操作,重新执行一下模板内容即可,此时就不在举例了。
5、多模板匹配
如果创建的索引,同时匹配了多个索引模板,则会同时使用多个索引模板中的定义。如前面创建的索引模板logs_and_others_template和logs_and_others_alias_template,都会匹配"logs_*"和"others_*"开头的索引,其中logs_and_others_template中定义了字段的映射,logs_and_others_alias_template中定义了索引别名。
创建新的索引logs_1,操作如下:
PUT /logs_1 |
再查看该索引的相关信息:
GET /logs_1 |
响应:
{ "logs_1" : { "aliases" : { "alias_tomcat_filter" : { "filter" : { "term" : { "user_name" : "tomcat" } }, "index_routing" : "tomcat", "search_routing" : "tomcat" }, "logs_1-alias" : { } }, "mappings" : { "_source" : { "enabled" : false }, "properties" : { "created" : { "type" : "date" }, "user_name" : { "type" : "keyword" } } }, ... } |
可以看到该索引中包括了前面两个索引模板中定义的别名和字段映射的内容。
前面的示例中,两个索引模板中没有定义不一样的内容,定义的都是互为补充的内容,不会让人理解上产生歧义。但是假设一个索引模板中定义的副本数为1,另一个索引模板中定义的副本数为2,存在类似这样的定义冲突,那么在建立索引的时候,就不容易确认确认索引建立出来的最终定义。
针对定义冲突的情况,可以通过以下两种方式解决:
- 在索引模板中指定order属性,其值为数字,该值越大表示该模板中的定义被使用的可能性越高,如同时两个模板中都定义了副本数,order属性为0的模板定义的副本数为1,,order属性为1的模板定义的副本数为2,此时匹配了这两个模板的索引,将会使用副本数为2的值;
- 通过创建索引的时候,在创建语句中指定需要的配置或字段映射,此优先级是最高的。
增加order属性的示例:
PUT /_template/template_1 { "index_patterns" : ["*"], "order" : 0, ... } |