前言
索引模板允許我們定義在創建新索引時自動應用的模板。模板包括設置和映射,以及一個簡單的模式模板,該模板控制是否應該將模板應用於新索引。
為什么需要索引模板?
在開發中,elasticsearch
很大一部分工作是用來處理日志信息的,比如某公司對於日志處理策略是以日期為名創建每天的日志索引。並且每天的索引映射類型和配置信息都是一樣的,只是索引名稱改變了。如果手動的創建每天的索引,將會是一件很麻煩的事情。為了解決類似問題,elasticsearch
提供了預先定義的模板進行索引創建,這個模板稱作為Index Templates
。通過索引模板可以讓類似的索引重用同一個模板。
模板只在創建索引時應用。更改模板不會對現有索引產生影響。當使用create index API
時,作為create index
調用的一部分定義的設置/映射將優先於模板中定義的任何匹配設置/映射。
環境:
- win10
- elasticsearch6.5.4
- kibana6.5.4
本文所有的示例演示都在kibana
的Dev Tools
中完成。
創建索引模板
我們針對前文中提出的問題,來實現一個索引模板:
PUT _template/2019
{
"index_patterns": ["20*", "product1*"], ①
"settings":{ ②
"number_of_shards": 2,
"number_of_replicas": 1
},
"mappings":{ ③
"doc":{
"properties":{
"ip":{
"type":"keyword"
},
"method":{
"type": "keyword"
}
}
}
}
}
①,index_patterns
是索引模式,指當創建以20
和product1
開頭的索引時,使用該索引模板。注意,在elasticsearch的6.x版本中,索引模板模式index_patterns
取代原來的template
。
②,在settings
設置中,我們自定義為該索引分配3個主分片。復制分片不變。
③,mappings
中指定映射關系。
查看索引模板
我們來查看一下剛才創建的索引模板。
GET _template/2019
我們還可以通過使用通配符來查詢多個模板。
GET /_template/temp*
GET /_template/template_1,template_2
除此之外,我們可以查看所有可用的模板列表:
GET /_template
也可以查詢某個模板是否存在:
HEAD _template/2019
注意,返回是以HTTP的狀態表示模板是否存在,200
表示存在,404
表示不存在。
索引模板的使用
有了索引模板,我們就可以創建索引並且添加數據了。
PUT 20190101/doc/1
{
"ip": "127.0.0.1",
"method":"GET"
}
PUT 20190102/doc/2
{
"ip":"192.168.1.1",
"method":"POST"
}
PUT product1_log/doc/1
{
"ip":"127.0.0.1",
"method":"GET"
}
上例會按照模板自動生成3個索引20190101
、20190102
和product1_log
。
當然查詢也是沒有問題的:
GET 2019*/doc/_search
{
"query": {
"match_all": {}
}
}
我們可以通過查詢索引的信息來看一下是否應用上了模板。
GET 20190101
# 結果如下
{
"20190101" : {
"aliases" : { },
"mappings" : {
"doc" : {
"properties" : {
"ip" : {
"type" : "keyword"
},
"method" : {
"type" : "keyword"
}
}
}
},
"settings" : {
"index" : {
"creation_date" : "1557889480975",
"number_of_shards" : "2",
"number_of_replicas" : "1",
"uuid" : "FEuyT5aoTnGP3k_7hCtQFA",
"version" : {
"created" : "6050499"
},
"provided_name" : "20190101"
}
}
}
}
由上例可以看出,索引20190101
已經成功應用上了我們之前創建的模板。
多模板匹配
多個索引模板可以應用於同一個索引,順序由order
參數的大小決定。比如現在有着一樣的一個索引模板:
PUT _template/2018_1
{
"index_patterns": ["2018*"],
"order":0,
"settings":{
"number_of_shards": 2
}
}
上述索引模板將應用於以2018
開頭的所有索引,設置索引的主分片數量為2,order
參數為0。
PUT 2018010101/doc/1
{
"method":"GET"
}
GET 2018010101/_settings
# 結果如下
{
"2018010101" : {
"settings" : {
"index" : {
"creation_date" : "1557900456281",
"number_of_shards" : "2",
"number_of_replicas" : "1",
"uuid" : "P53RDmT6RRCDY2DlHtpymg",
"version" : {
"created" : "6050499"
},
"provided_name" : "2018010101"
}
}
}
}
可以看到20180101
索引的主分片數量是2,已經成功應用了索引模板。
現在我們再來創建一個索引模板:
PUT _template/2018_2
{
"index_patterns": ["201802*"],
"order":1,
"settings":{
"number_of_shards": 3
}
}
上述模板應用於以201802
開頭的索引,只是主分片的數量為3,order
參數為1。
我們再來創建一個索引:
PUT 2018010201/doc/1
{
"method": "POST"
}
GET 20180201/_settings
# 結果如下
{
"20180201" : {
"settings" : {
"index" : {
"creation_date" : "1557901225020",
"number_of_shards" : "3",
"number_of_replicas" : "1",
"uuid" : "-B8_ZiK7QgesmGSzD_8xlQ",
"version" : {
"created" : "6050499"
},
"provided_name" : "20180201"
}
}
}
}
可以看到20180201
索引應用了order
參數為1的索引模板。這在某些情況下非常有效,比如我們預料到2018年2月份的日志將會暴增,而其他月份不變,所以我們通過上述創建多個模板來完成索引創建,2月份每天的索引的主分片都多一片,過了2月,恢復正常。
刪除索引模板
刪除索引模板使用DELETE
命令刪除即可:
DELETE _template/2019
需要注意的是,刪除索引模板並不會影響其通過該模板創建的索引。那么,如果想要刪除相關的索引怎么辦?比如我們刪除以2019
開頭的索引該怎么辦?
DELETE 2019*
可以使用通配符*
來完成。
see also:[Elasticsearch 6 新特性與重要變更解讀](https://blog.csdn.net/napoay/article/details/79135136) | [官網:Index Templates](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html)