別名是指給一個或者多個索引定義另外一個名稱,使索引別名和索引之間可以建立某種邏輯關系。
可以用別名表示別名和索引之間的包含關系。例如,我們建立了10月、11月、12月的用戶入住酒店的日志索引,假設需要搜索這3個月的日志索引,如果分別去3個索引中進行搜索,這種編碼方案比較低效。此時可以創建一個別名4_quarter,設置前面的3個索引的別名為4_quarter,然后在4_quarter中進行搜索即可。
創建10_month_log,11_month_log ,12_month_log 3個索引:
PUT /10_month_log PUT /11_month_log PUT /12_month_log { "mappings":{ "properties":{ "uid":{ //用戶ID字段 "type":"keyword" }, "hotel_id":{ //酒店ID字段 "type":"keyword" }, "check_in_date":{ //入住日期字段 "type":"keyword" } } } }
寫入文檔:
POST /10_month_log/_doc/001 { //寫入的文檔數據 "uid":"001", "hotel_id":"1", "check_in_date":"2021-10-05" } POST /11_month_log/_doc/002 { //寫入的文檔數據 "uid":"002", "hotel_id":"1", "check_in_date":"2021-11-05" } POST /12_month_log/_doc/003 { //寫入的文檔數據 "uid":"003", "hotel_id":"1", "check_in_date":"2021-12-05" }
設置上面3個索引的別名為4_quarter,請求的DSL如下:
POST /_aliases { "actions": [ { "add": { //為索引10_month_log建立別名4_quarter "index": "10_month_log", "alias": "4_quarter" } }, { "add": { //為索引11_month_log建立別名4_quarter "index": "11_month_log", "alias": "4_quarter" } }, { "add": { //為索引12_month_log建立別名4_quarter "index": "12_month_log", "alias": "4_quarter" } } ] }
此時,請求在索引4_quarter中搜索hotel_id為1的用戶的入住記錄,搜索的DSL如下:
GET /4_quarter/_search { "query": { "term": { //搜索hotel_id為1的文檔 "hotel_id": "1" } } }
在默認情況下,當一個別名只指向一個索引時,寫入數據的請求可以指向這個別名,如果這個別名指向多個索引,則寫入數據的請求是不可以指向這個別名的。
ES不能確定向4_quarter寫入數據時的轉發對象。這種情況需要在別名設置時,將目標索引的is_write_index屬性值設置為true來指定該索引可用於執行數據寫入操作。例如設置12_month_log為數據寫入轉發對象,對應的DSL如下:
POST /_aliases { "actions": [ { "add": { //設置12_month_log為索引別名4_quarter的數據寫入轉發對象 "index": "12_month_log", "alias": "4_quarter", "is_write_index":true } } ] }
文章參考:Elasticsearch搜索引擎構建入門與實戰 --> 3.1.5 索引別名