ES中可以為索引添加別名,一個別名可以指向到多個索引中,同時在添加別名時可以設置篩選條件,指向一個索引的部分數據,實現在關系數據庫匯總的視圖功能,這就是ES中別名的強大之處。別名是一個非常實用的功能,為我們使用索引提供了極大的靈活性,許多ES的API都支持用別名來代替真實索引名。通過索引我們可以方便的進行以下操作:
- 實現正在雲心的集群上的一個索引到另一個索引之間的無縫切換。試想一下這種藏進,由於業務變換,我們需要將業務數據有索引1變換到新的索引2上,如果沒有別名,我們必須修改和總段業務系統,但是有了別名,只需要修改別名,另起指向新的索引2即可,這樣的操作可以在用戶無任何感知的情況下完成。
- 使數據檢索等炒作更加方便。加入有兩個月的日志數據,分別存放在index_202008和index_202009兩個索引中,沒有使用別名進行檢索時,我們需要同時寫上兩個索引名稱進行檢索,使用索引后,我們可以令別名同時指向這兩個索引,檢索時只需要使用這個別名就可以同時在兩個索引中盡心檢索。
- 為一個索引中的部分數據創建別名,例如,一個索引中存放了一整年的數據,現在新增一個業務場景,更多的是對其中某一個月的數據進行檢索,這時,我們可以在創建別名時,通過設置過濾條件filter,可以單獨令別名指向一個月的數據,使得檢索更加高效。
通過上面的場景我們可以看出,ES中別名可以指向一個索引,也可以同時指向多個索引,甚至可以通過配合過濾器filter指向索引中部分數據。別名可以再創建索引時添加,也可以在索引創建后進行添加,ES中提供豐富的API對別名進行管理。接下來,我們捋一捋ES中對別名的操作。
1 創建別名¶
創建別名有很多種方法,可以創建索引同時創建別名,也可以在創建索引后創建,既可以讓別名指向多個索引,也可以讓別名指向一個索引的部分數據,甚至指向一個字段。我們來一一例舉這是如何操作的。
(1)創建索引同時創建別名
創建一個名為users用戶索引,索引中記錄了用戶出生年,現在,我們在創建索引的同時,創建兩個別名,一個別名指向整個users索引,並通過filter進行過濾,使別名只指向2000年出生的用戶。
(2)創建索引后創建別名
直接通過API路由傳遞別名來創建,這種方法有一下幾種請求方式,注意,這種方式要求索引必須存在。
PUT /<index>/_alias/<alias>
POST /<index>/_alias/<alias>
PUT /<index>/_aliases/<alias>
POST /<index>/_aliases/<alias>
可以通過請求體來對別名進行設置,例如創建一個名為2020的別名,指向users索引中birth-year字段值為2020的文檔。
(3)創建字段別名
索引可以擁有別名,字段也可以,在創建索引時,我們可以為字段設置一個別名。例如,為username字段設置一個別名name。
2 修改+刪除別名¶
之所在現在要將修改別名和刪除出別名放在一起來說,是因為下面的這個API功能太多,既能夠添加別名,也能修改別名,還能刪除別名。通過例子來說明,例如,為users索引添加一個名為alias1的筆名,可以這么操作:
這個API形式上很好理解,就是想aliases
路由發送一個POST請求,別名的信息都是在請求體中進行配置,actions
表示需要進行的操作,里面每一個子項都表示一個動作,這個動作可以為add
表示添加別名的操作,remove
表示刪除別名的操作。index
表示針對哪一個索引上創建別名,alias
后面跟着的就是新建或者需要刪除的別名的名稱。下面通過一些例子說明如何使用這一API。
(1)為同一索引創建多個別名
(2)刪除一個別名
(3)重命名一個別名
ES中別為提供直接進行重命名操作的關鍵字,而是先執行remove,然后執行add,這一操作是原子操作,所以無需擔心別名刪除未創建的短暫中空期,這相當於為為原來別名創建了一個新的引用,刪除舊的應用,實際還是同一個別名,例如將名為alias1的別名重命名為alias2,可以這么操作:
(4)創建一個別名指向多個索引
例如創建一個名為myusers的別名同時指向索引users1和users2:
也可以通過通配符來實現這一操作:
(5)創建有過濾條件的別名
(6)創建可寫入別名
如果一個別名單獨指向一個索引,那么使用別名進行寫入操作是不會有問題的,但是,一個別名指向多個索引索引時,是不能進行寫入操作,因為ES不知道將文檔寫入到哪一個索引。這一問題可以在創建別名時將某一個索引設置為可寫來解決,注意,只能設置一個。
3 查看別名信息¶
(1)查看別名是否存在
使用HEAD請求方式+別名可以查看別名是否存在:
HEAD /_alias/<alias>
HEAD /<index>/_alias/<alias>
可使用HEAD方式查看是否存在,如果查看整個集群是否存在某個別名,可以這樣操作:
如果存在,則返回200狀態碼,如果不存在,返回404狀態碼:
如果是查看某個索引是否有某個別名,可以這么操作:
(2)查看別名信息
查看別名信息API如下所示:
GET /_cat/aliases/<alias>
GET /_cat/aliases
前者查看指定別名,后者查看集群中所有別名。