以前不知道es還有別名這個東西,直到碰見了一個問題,請教公司的大神,才發現索引別名這個東西必不可少。
產品有個需求,從我技術的角度描述是這樣的:將搜索結果按品牌分組統計數量,取數量最多的前五十個品牌顯示在頁面上。這個需求不難,用es的聚合很容易就能獲得,可是品牌我當時用的是text,這個類型貌似不支持分組聚合,要改爲keyword才能夠。
我想刪掉原來的mapping,再從新構建一個新的。不過當時crontab中運行了一個定時向es導入的腳本,我雖然刪掉了mapping,但由於就算沒有mapping,es也會本身分析新創建一個mapping,致使我新建的時候,就會提示這個索引已存在。
後來諮詢了一下大神,告訴我索引用一個新的名字,新mapping建好以後,建立一個跟以前索引同樣的別名,並指向新的索引,就能夠實現平滑遷移了。html
假設原來的index命名爲product_index
咱們要建立的新的index命名爲product_index_1mysql
PUT /product_index_1 { "mappings": { "my_type": { "properties": { "brand": { "type": "keyword", } } } } } POST /_aliases { "actions": [ { "remove": { "index": "*", "alias": "product_index" }}, { "add": { "index": "product_index_1", "alias": "product_index" }} ] }
建立好新的索引,而後刪除掉全部以product_index爲別名的索引,而後將別名product_index指向product_index_1索引。sql
新創建的索引裏面確定是沒有數據的,要保證不影響搜索結果,先把數據補充上,而後再改別名,我不建議直接用es當數據庫,怕誤刪,數據都是從mysql裏面導入的,目的只是爲加快全文檢索。數據庫
參考:
官方文檔:https://www.elastic.co/guide/...
還有一篇文章介紹了其餘的別名應用場景:
https://www.cnblogs.com/rainw...app