NO IMAGE

重新索引過程中的問題是必須更新你的應用,來使用另一個索引名。索引別名正是用來解決這個問題的!

索引 別名 就像一個快捷方式或軟連線,可以指向一個或多個索引,也可以給任何需要索引名的 API 使用。別名帶給我們極大的靈活性,允許我們做到:

  • 在一個執行的叢集上無縫的從一個索引切換到另一個
  • 給多個索引分類(例如,last_three_months
  • 給索引的一個子集建立 檢視

我們以後會討論更多別名的使用場景。現在我們將介紹用它們怎麼在零停機時間內從舊的索引切換到新的索引。

這裡有兩種管理別名的途徑:_alias 用於單個操作,_aliases 用於原子化多個操作。

在這一章中,我們假設你的應用採用一個叫 my_index 的索引。而事實上,my_index 是一個指向當前真實索引的別名。真實的索引名將包含一個版本號:my_index_v1my_index_v2 等等。

開始,我們建立一個索引 my_index_v1,然後將別名 my_index 指向它:

PUT /my_index_v1 <1>
PUT /my_index_v1/_alias/my_index <2>

<1> 建立索引 my_index_v1

<2> 將別名 my_index 指向 my_index_v1

你可以檢測這個別名指向哪個索引:

GET /*/_alias/my_index

或哪些別名指向這個索引:

GET /my_index_v1/_alias/*

兩者都將返回下列值:

{
"my_index_v1" : {
"aliases" : {
"my_index" : { }
}
}
}

然後,我們決定修改索引中一個欄位的對映。當然我們不能修改現存的對映,索引我們需要重新索引資料。首先,我們建立有新的對映的索引 my_index_v2

PUT /my_index_v2
{
"mappings": {
"my_type": {
"properties": {
"tags": {
"type":   "string",
"index":  "not_analyzed"
}
}
}
}
}

然後我們從將資料從 my_index_v1 遷移到 my_index_v2,下面的過程在【重新索引】中描述過了。一旦我們認為資料已經被正確的索引了,我們就將別名指向新的索引。

別名可以指向多個索引,所以我們需要在新索引中新增別名的同時從舊索引中刪除它。這個操作需要原子化,所以我們需要用 _aliases 操作:

POST /_aliases
{
"actions": [
{ "remove": { "index": "my_index_v1", "alias": "my_index" }},
{ "add":    { "index": "my_index_v2", "alias": "my_index" }}
]
}

這樣,你的應用就從舊索引遷移到了新的,而沒有停機時間。

提示:

即使你認為現在的索引設計已經是完美的了,當你的應用在生產環境使用時,還是有可能在今後有一些改變的。

所以請做好準備:在應用中使用別名而不是索引。然後你就可以在任何時候重建索引。別名的開銷很小,應當廣泛使用。