在使用elasticsearch的時候,常常會遇到須要淘汰掉歷史數據的場景。html
爲了方便數據淘汰,並使得數據管理更加靈活,咱們常常會以時間爲粒度創建索引,例如:app
當不須要再繼續使用歷史數據的時候,咱們就能夠將索引刪除,釋放資源。curl
爲了很好的支撐這個場景,須要使用到Elasticsearch裏的兩個東西,索引別名和Template。elasticsearch
例如,若是創建了上述相似的索引時間序列,在查詢的時候以wildcards的方式指定索引,例如index=monthly-*,或者index=daily-201710*。固然也可使用索引別名index=monthly。ide
例如,你不想承擔按期去維護索引的風險和工做量,能夠在插入數據時自動建立索引,Template能夠提供自動建立索引時候的默認配置。ui
下面詳細解釋一下。url
一、索引別名code
一個索引別名就比如一個快捷方式(Shortcut)或一個符號連接(Symbolic Link),索引別名能夠指向一個或者多個索引,能夠在任何須要索引名的API中使用。使用別名能夠給咱們很是多的靈活性。它可以讓咱們:htm
last_three_months
如何建立索引別名呢?索引
1)建立索引
我這裏建立audit-2017十、audit-201711兩個索引
curl -XPOST "http://10.93.21.21:8049/kangaroo-201710?pretty" curl -XPOST "http://10.93.21.21:8049/kangaroo-201711?pretty"
若是安裝了head,你能夠在可視化頁面看到
從索引信息能夠看到,咱們沒有配置mapping和alias,shards和replicas也使用的默認值。
2)創建索引別名
curl -XPOST 'http://10.93.21.21:8049/_aliases' -d ' { "actions": [ {"add": {"index": "kangaroo-201710", "alias": "kangaroo"}}, {"add": {"index": "kangaroo-201711", "alias": "kangaroo"}} ] }'
這樣就對kangaroo-201710和kangaroo-201711創建了索引別名kangaroo,再看head可視化
能夠看到索引別名已經創建。
3)注意
寫:不能直接對索引別名進行寫入。因此在寫數據的時候,要直接使用普通索引。
讀:查詢,對索引別名進行查詢,查詢會透明的下發到別名下掛的全部索引執行,設置的路由也會隨之下發。
二、帶filtered的索引別名
對於同一個索引,例如zoo,咱們如何給不一樣人看到不一樣的數據,即,所謂的多租戶。
假設索引zoo的數據有個字段是group,group字段記錄了該數據是那個「租戶」的。多租戶之間的數據應該是不可見的。
咱們模擬一下這個場景
1)建立索引zoo
curl -XPOST "http://10.93.21.21:8049/zoo?pretty"
2)設置mappings
curl -XPOST "http://10.93.21.21:8049/zoo/animal/_mapping?pretty" -d ' { "animal": { "properties": { "name": {"type": "string", index: "not_analyzed"}, "group": {"type": "string", index: "not_analyzed"} } } }'
3)設置帶filter的別名
curl -XPOST "http://10.93.21.21:8049/_aliases?pretty" -d ' { "actions": [ { "add": { "index": "zoo", "alias": "zoo_animal_vegetarian", "filter":{ "term":{ "group":"vegetarian" } } } }, { "add": { "index": "zoo", "alias": "zoo_animal_carnivorous", "filter":{ "term":{ "group":"carnivorous" } } } } ] }'
經過head看一下
咱們索引兩條數據進去
老虎-肉食
curl -XPUT 'http://10.93.21.21:8049/zoo/animal/1' -d '{ "name" : "tiger", "group" : "carnivorous" }'
兔子-素食
curl -XPUT 'http://10.93.21.21:8049/zoo/animal/2' -d '{ "name" : "rabbit", "group" : "vegetarian" }'
使用帶filter的索引查一下
素食的只有兔子
curl -XGET "http://10.93.21.21:8049/zoo_animal_vegetarian/_search?pretty" { "took" : 32, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 1.0, "hits" : [ { "_index" : "zoo", "_type" : "animal", "_id" : "2", "_score" : 1.0, "_source":{ "name" : "rabbit", "group" : "vegetarian" } } ] } }
肉食的只有老虎
curl -XGET "http://10.93.21.21:8049/zoo_animal_carnivorous/_search?pretty" { "took" : 33, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 1.0, "hits" : [ { "_index" : "zoo", "_type" : "animal", "_id" : "1", "_score" : 1.0, "_source":{ "name" : "tiger", "group" : "carnivorous" } } ] } }
當你創建索引時間序列的時候,遇到的問題是,須要不斷的創建新索引,例如到了11月份,你能夠須要新建kangaroo-201711這個索引。
固然,若是不建立索引,直接寫入數據的話,ES會爲你分析你寫入的document的字段類型,並使用默認配置創建索引。
可是默認配置可能並非你想要的。例如ES對string類型默認是分析的,即,對string類型會進行分詞,可是你的數據中可能有一些string類型的字段不但願被分析。
那麼怎麼修改默認配置呢?能夠建立一個template。
三、Template
template能夠修改索引的默認配置。咱們如下面這個template爲例說明一下。
1)咱們創建了一個template名稱爲kangaroo_template
2)"template": "kangaroo*",表示對於全部以kangaroo*開頭的索引,默認配置使用template中的配置。
3)"settings","mappings","aliases",能夠修改這些類型的默認配置
4)禁用了_source,對name字段設置string類型且不分析,索引別名設置爲kangaroo
curl -XPUT "http://10.93.21.21:8049/_template/kangaroo_template?pretty" -d '{ "template": "kangaroo*", "settings": { "number_of_shards": 10 }, "mappings": { "data": { "_source": { "enabled": false }, "properties": { "name": { "type": "string", "index": "not_analyzed" }, "id": { "type": "long" } } } }, "aliases": {"kangaroo":{}} }'
執行生效後,看一下template生效的內容,這裏注意有一個"order"字段,該字段跟多template合併有關,後面咱們會講。
curl -XGET "http://10.93.21.21:8049/_template/kangaroo_template?pretty" { "kangaroo_template" : { "order" : 0, "template" : "kangaroo*", "settings" : { "index" : { "number_of_shards" : "10" } }, "mappings" : { "data" : { "_source" : { "enabled" : false }, "properties" : { "name" : { "index" : "not_analyzed", "type" : "string" }, "id" : { "type" : "long" } } } }, "aliases" : { "kangaroo" : { } } } }
咱們能夠向一個不存在的索引寫入數據,這個操做會使用默認配置,若是索引名稱命中template中的規則,就會使用template的配置建立索引。
這裏咱們向kangaroo-201712寫入數據,會命中以前建立的kangaroo_template。
curl -XPUT 'http://10.93.21.21:8049/kangaroo-201712/data/1' -d '{ "name" : "yang", "id" : "1001", "weight" : "70 kg" }'
經過head看一下,能夠看到,索引別名已經創建,分片數=10,source禁用生效,name不分析。這就是咱們想要的結果。
多個template配置的合併
這個場景是這樣的,一個索引命中了多個template配置,例如:有兩個template配置分別爲:a*, ab*,那麼若是有一個索引名字是abc,就會命中了兩個template,這時候會怎麼樣呢?
配置會merge,merge的法則能夠參見官方文檔,簡單來講,就是跟order值有關,較小order值的配置會先生效,較大order值的配置會繼而覆蓋。