Elasticsearch Index Templates(索引模板)

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

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

一个索引模板示例如下:

PUT _template/template_1
{
  "index_patterns": [“ubi*”],                //@1
  "settings": {                                               //@2 
    "number_of_shards": 1
  },
  "mappings": {                                             //@3
    "_doc": {
      "_source": {
        "enabled": false
      },
      "properties": {
        "host_name": {
          "type": "keyword"
        },
        "created_at": {
          "type": "date",
          "format": ""
        }
      }
    }
  }
}

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

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

public static final void createIndexTemp() {
		RestHighLevelClient client = EsClient.getClient();
		try {
			PutIndexTemplateRequest request = new PutIndexTemplateRequest("ubi_index_template")
			List<String> indexPatterns = new ArrayList<String>();
			indexPatterns.add("ubi*");
			request.patterns(indexPatterns);
			
			/** mapping */
			XContentBuilder jsonBuilder = XContentFactory.jsonBuilder()
					.startObject()
					    .startObject("_source")
					    	.field("enabled", false)
					    .endObject()
					
						.startObject("properties")
							.startObject("host_name")
								.field("type", "keyword")
							.endObject()
							.startObject("created_at")
								.field("type", "date")
								.field("format", "yyyy-MM-dd HH:mm:ss")
							.endObject()
							
						.endObject()
					.endObject();
			
			
			request.mapping("_doc", jsonBuilder);
			
			Map<String, Object> settings = new HashMap<>();
			
			settings.put("number_of_shards", 1);
			request.settings(settings);
			
			System.out.println(client.indices().putTemplate(request, RequestOptions.DEFAULT));
			
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			EsClient.close(client);
		}
	}

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

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

其返回结果:

IndexResponse[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越大,越优先(前提是匹配模板表达式)。

举例如下:

PUT /_template/template_1
{
    "index_patterns" : ["*"],
    "order" : 0,
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "_doc" : {
            "_source" : { "enabled" : false }
        }
    }
}

PUT /_template/template_2
{
    "index_patterns" : ["te*"],
    "order" : 1,
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "_doc" : {
            "_source" : { "enabled" : true }
        }
    }
}

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

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

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

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


见文如面,我是威哥,热衷于成体系剖析JAVA主流中间件,关注公众号『中间件兴趣圈』,回复专栏可获取成体系专栏导航,回复资料可以获取笔者的学习思维导图。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中间件兴趣圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值