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