使用Elasticsearch的動態索引和索引優化

程式設計一生發表於2019-03-28

關於對映

實際工作中使用過ES的朋友可能會有和靜兒一樣的感受。ES儲存更新從編碼上是很方便。如下,Kubernetes的yaml檔案完全可以通過json直接序列化一下,一行程式碼存入ES。

 

剩下的工作可以交給ES進行動態生成對映。索引對映的生成方式有兩種:

動態對映

欄位和對映型別不需要在使用前定義,新欄位名可以自動被新增到索引。只需要更新索引,新欄位可以被新增到頂層對映、內部物件或者巢狀欄位。

顯示的對映

動態的對映,欄位型別定義靠的ES自己來猜。開發人員自己比ES更瞭解自己的索引欄位。所以有時會需要明確的指定索引型別。指定索引可以在建立索引時指定,也可以使用PUT API來在已經存在的索引裡新增。

使用模板建立索引

索引可使用預定義的模板進行建立,這個模板稱作Index templates。模板設定包括settings和mappings,通過模式匹配的方式可以使得多個索引重用一個模板。

別名

說起來容易做起來難。除錯中,需要反覆的權衡和實踐。發現索引的型別定義不合理,需要在ES平臺上進行索引的欄位型別修改。如果使用的是模板方式,修改模板後需要將索引刪除後重建生效。如果只是想重新命名一個欄位而不修改對映,可以使用別名(alias)欄位。

 

提高索引效能的一些建議

提高寫入效率

1>使用批量請求並調整其大小

使用bulk api可以多執行緒併發建立,並將操作合併批量進行請求。批量的大小取決於資料、叢集配置等。

2>根據日誌對故障容忍,合理設定事務日誌是同步還是非同步

因為Translog順序寫日誌比構建索引更高效。為了保證資料的完整性,ES預設每次請求結束都會進行一次sync同步操作。但是如果是海量的日誌,可以容忍發生故障時丟失一定的資料,可以設成非同步來提高寫效率。設定引數是:index.translog.durability=async。

提高讀取效率

1>根據實時性需求調整索引重新整理頻率

如果搜尋結果不需要實時性很高,可以按需設定i索引重新整理頻率。設定引數是index.refresh_interval。在大批匯入時間還可以通過設定此值為-1關掉重新整理。

2>對索引進行合理分片

ES的分片分為兩種,主分片(Primary Shard)和副本(Replicas)。分片越少寫入速度越快。如果過度分配,會增大合併分片查詢結果的複雜度,從而耗時增加。

3>如果不需要使用KEY之間的關係,使用展開提高效率

ES提供了為欄位提供巢狀型別。巢狀型別因為包括著巢狀內欄位的關係,效率低於將這些欄位展平的效率。所以如果不需要使用KEY之間的關係,可以使用展開提高效率。

 

總結

<程式設計師修煉之道>不要做形式方法的奴隸

Don't Be a Slave to Formal Methods.

靜兒解讀:如果某項技術在開發時間和能力中作用不大,不要盲目的採用它,不要為了用而用。

 

相關閱讀

《程式設計師修煉之道》解讀

Elasticsearch的基本概念和指標

鬱金香搜尋引擎的方案(2017版)

實現一個自己的搜尋引擎的初始規劃(2017版)

程式常用的設計技巧

到底多大才算高併發?

美團分散式服務通訊框架及服務治理系統OCTO

學會用資料說話-分散式鎖究竟可以多少併發?

大話高可用

 

關於作者

作者是一個有美國矽谷、日本東京工作經驗,十二年堅持一線寫程式碼的程式媛。堅持原創文章。歡迎技術交流!

 

相關文章