本文是系列文章第一篇。介紹Elasticsearch的一些很是基礎但實戰開發確很是有用的技術點。瞭解這些技術點會幫助你設計更易於維護的數據索引,預先知道PB級大數據索引實戰中的坑,提高工做效率。html
本文從別名分類、索引別名實踐、索引別名的好處、索引別名常見問題及坑解讀、字段別名實踐一把 五個方面進行詳細解讀。mysql
別名在Elasticsearch中有兩種分類。linux
官方釋義: 索引別名能夠指向一個或多個索引,而且能夠在任何須要索引名稱的API中使用。 別名爲咱們提供了極大的靈活性。它們容許咱們執行如下操做: git
1)在正在運行的集羣上的一個索引和另外一個索引之間透明切換; sql
2)對多個索引進行分組組合(例如,lastthreemonths的索引別名:是過去3個月索引 logstash201903, logstash201904, logstash_201905的組合);windows
3)在索引中的文檔子集上建立「視圖」(結合業務場景,會提高檢索效率)。api
通俗解釋: 索引別名相似:windows的快捷方式,linux的軟連接,mysql的視圖。安全
前提:Elasitcsearch建立索引後,索引名不容許改。不少業務場景下單一索引可能沒法知足要求。數據結構
場景1:PB級別增量數據,藉助rollover api實現,由基於日期的n個索引組成,顯然,對外提供服務使用別名會很便捷。app
注意:實際業務場景使用別名會很方便、靈活、快捷、業務鬆耦合!!
在Elasticsearch Mapping定義的6.4+版本纔有的字段類型。
通俗解釋:
試想一下有一種業務場景。好比在實際的業務開發中:須要對Facebook、twitter行採集,採集入庫的是兩個業務團隊。
他們對content,分別使用了兩個字段。其中一個是,content。另一個是cont。 這時候存儲到elasticsearch會有兩個字段。
這樣若是咱們在檢索、寫業務代碼的時候,是否是要寫兩個不一樣的字段來處理呢? 若是有可能寫成一個字段,代碼方面就很避開業務耦合,就很方便了。
我認爲這是字段別名的由來。
POST visitor_logs_2017,visitor_logs_2018/_search
POST visitor_logs_*/_search
實戰中,咱們不須要知道操做的實際索引名稱,咱們能夠透明地更改別名引用的索引而不會影響使用別名的用戶。
POST /_aliases?pretty { "actions": [ { "add": { "index": "visitor_logs_2017", "alias": "visitor_logs" } }, { "add": { "index": "visitor_logs_2018", "alias": "visitor_logs" } } ] }
GET /visitor_logs/_search
場景: 實戰中,可能須要基於時間的數據保留策略(利用rollover機制實現),並從系統中刪除舊數據。 使用索引別名:
好處1:來簡化從Elasticsearch中刪除數據的過程。
基於時間索引的實現機制以下:
推薦閱讀:
試想一下:若是不是基於時間的索引,而使用大索引,刪除歷史數據會發生什麼?
答案:
一、刪除索引數據只能使用:deletebyquery,相比刪除索引,deletebyquery刪除數據只是邏輯刪除;
實戰中,索引的設計可能不是一步到位。 隨着業務的擴展,可能會在開發的中後期,調整索引Mapping結構, 好比:
1)iksmart改爲ikmax_word分詞以高效分詞,
2)long類型改爲keyword以提高檢索效率,
3)修改索引分片數以便於機器橫向擴展,
一般的作法,都須要藉助:reindex操做完成索引的遷移。 若是要確保線上環境的可靠運行且用戶無感知(即無需告知用戶,不影響用戶的業務),使用別名指向更改前和更改後的索引是 絕佳方案。
實戰舉例:
POST /_aliases?pretty { "actions": [ { "remove": { "index": "visitor_logs_2018", "alias": "visitor_logs" } }, { "add": { "index": "visitor_logs_2018_01", "alias": "visitor_logs" } } ] }
試想一下,若是沒有索引別名呢?
答案:
一、沒法保證查詢的連續性;
會報錯:
no write index is defined for alias[xxx]....
注意:索引別名不是在任何地方都通用。寫入或更新數據的時候須要指明物理索引,不要向別名寫入數據。
問題2:ES怎麼獲取全部別名信息 alias?
或者問題:如何經過索引別名查找實際索引名稱?
GET _cat/aliases
返回信息:
visitor_logs visitor_logs_2017 - - - .kibana .kibana_1 - - - visitor_logs visitor_logs_2018 - - `
是一致的。
前提:索引和別名指向相同的數據,相同的檢索條件。
原理:索引別名只是物理索引的軟連接名稱而已。
核心原理:物理上基於時間作了分隔,再加上冷熱數據分離機制,會極大縮小了檢索樣本。
POST /_aliases { "actions" : [ { "add" : { "index" : "test1", "alias" : "alias2", "filter" : { "term" : { "user" : "kimchy" } } } } ] }
路由機制參考官方文檔便可。
星友的問題:
「Aliasdatatype,這個數據類型,在現實工做中的使用場景是什麼?看官方文檔,沒有很好理解?」
字段別名原理第一部分已詳細解釋,再也不贅述。 這裏實踐一把,加深理解。
PUT trips { "mappings": { "_doc": { "properties": { "distance": { "type": "long" }, "route_length_miles": { "type": "alias", "path": "distance" }, "transit_mode": { "type": "keyword" } } } } }
注意: 當用戶使用檢索時,實際可使用routelengthmile字段替代distance作檢索,以達到distance同樣的效果。
實戰中,通常在開發 中後期才發現索引別名的妙處。正如文中分析:一、高效索引管理;二、用戶無感知維護數據修改更新。
建議:相同索引別名的物理索引有 一致的Mapping和數據結構,以提高檢索效率。
你的實際Elasticsearch業務場景,有哪些很是基礎但實戰開發很是有用的技術點呢? 歡迎留言留下你的思考,讓咱們一塊兒精進!
參考:
推薦閱讀:
重磅 | Elasticsearch7.X學習路線圖
Elasticsearch 7.0 正式發佈,盤他!
乾貨 | Elasticsearch 7.1免費安全功能全景認知
加入星球,更短期更快習得更多幹貨!