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


關於映射

實際工作中使用過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

學會用數據說話-分布式鎖究竟可以多少並發?

大話高可用

 

關於作者

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM