關於對映
實際工作中使用過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.
靜兒解讀:如果某項技術在開發時間和能力中作用不大,不要盲目的採用它,不要為了用而用。
相關閱讀
關於作者
作者是一個有美國矽谷、日本東京工作經驗,十二年堅持一線寫程式碼的程式媛。堅持原創文章。歡迎技術交流!