Elasticsearch索引別名、Filtered索引別名、Template

在使用elasticsearch的時候,常常會遇到須要淘汰掉歷史數據的場景。html

爲了方便數據淘汰,並使得數據管理更加靈活,咱們常常會以時間爲粒度創建索引,例如:app

  • 每月創建一個索引:monthly-20170九、monthly-2017十、monthly-201711
  • 天天創建一個索引:daily-2017101五、daily-2017101六、daily-2017101七、daily-20171018

當不須要再繼續使用歷史數據的時候,咱們就能夠將索引刪除,釋放資源。curl

爲了很好的支撐這個場景,須要使用到Elasticsearch裏的兩個東西,索引別名和Template。elasticsearch

  • 索引別名:創建索引對外的統一視圖

例如,若是創建了上述相似的索引時間序列,在查詢的時候以wildcards的方式指定索引,例如index=monthly-*,或者index=daily-201710*。固然也可使用索引別名index=monthly。ide

  • Template:修改創建索引的默認配置

例如,你不想承擔按期去維護索引的風險和工做量,能夠在插入數據時自動建立索引,Template能夠提供自動建立索引時候的默認配置。ui

下面詳細解釋一下。url

一、索引別名code

一個索引別名就比如一個快捷方式(Shortcut)或一個符號連接(Symbolic Link),索引別名能夠指向一個或者多個索引,能夠在任何須要索引名的API中使用。使用別名能夠給咱們很是多的靈活性。它可以讓咱們:htm

  • 在一個運行的集羣中透明地從一個索引切換到另外一個索引
  • 讓多個索引造成一個組,好比last_three_months
  • 爲一個索引中的一部分文檔建立一個視圖(View)

如何建立索引別名呢?索引

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值的配置會繼而覆蓋。

相關文章
相關標籤/搜索