elasticsearch 索引優化

ES索引優化篇主要從兩個方面解決問題,一是索引數據過程;二是檢索過程。 
索引數據過程我在上面幾篇文章中有提到怎麼建立索引和導入數據,可是你們可能會遇到索引數據比較慢的過程。其實明白索引的原理就能夠有針對性的進行優化。ES索引的過程到相對Lucene的索引過程多了分佈式數據的擴展,而這ES主要是用tranlog進行各節點之間的數據平衡。因此從上我能夠經過索引的settings進行第一優化: 
1
Java代碼   收藏代碼
  1. "index.translog.flush_threshold_ops""100000"  

2
Java代碼   收藏代碼
  1. "index.refresh_interval""-1"  

這兩個參數第一是到tranlog數據達到多少條進行平衡,默認爲5000,而這個過程相對而言是比較浪費時間和資源的。因此咱們能夠將這個值調大一些仍是設爲-1關閉,進而手動進行tranlog平衡。第二參數是刷新頻率,默認爲120s是指索引在生命週期內定時刷新,一但有數據進來能refresh像lucene裏面commit,咱們知道當數據addDoucment會,還不能檢索到要commit以後才能行數據的檢索因此能夠將其關閉,在最初索引完後手動refresh一之,而後將索引setting裏面的index.refresh_interval參數按需求進行修改,從而能夠提升索引過程效率。 
另外的知道ES索引過程當中若是有副本存在,數據也會立刻同步到副本中去。我我的建議在索引過程當中將副本數設爲0,待索引完成後將副本數按需量改回來,這樣也能夠提升索引效率。 
「number_of_replicas」: 0 
上面聊了一次索引過程的優化以後,咱們再來聊一下檢索速度比較慢的問題,其實檢索速度快度與索引質量有很大的關係。而索引質量的好壞與不少因素有關。 

1、分片數 
分片數,與檢索速度很是相關的的指標,若是分片數過少或過多都會致使檢索比較慢。分片數過多會致使檢索時打開比較多的文件別外也會致使多臺服務器之間通信。而分片數過少爲導至單個分片索引過大,因此檢索速度慢。 
在肯定分片數以前須要進行單服務單索引單分片的測試。好比我以前在IBM-3650的機器上,建立一個索引,該索引只有一個分片,分別在不一樣數據量的狀況下進行檢索速度測試。最後測出單個分片的內容爲20G。 
因此索引分片數=數據總量/單分片數 
目前,咱們數據量爲4億多條,索引大小爲近1.5T左右。由於是文檔數據因此單數據都中8K之前。如今檢索速度保證在100ms 如下。特別狀況在500ms如下,作200,400,800,1000,1000+用戶長時間併發測試時最壞在750ms如下. 

2、副本數 
副本數與索引的穩定性有比較大的關係,怎麼說,若是ES在非正常掛了,常常會致使分片丟失,爲了保證這些數據的完整性,能夠經過副原本解決這個問題。建議在建完索引後在執行Optimize後,立刻將副本數調整過來。 
你們常常有一個誤去副本越多,檢索越快,這是不對的,副本對於檢索速度其它是減無增的我曾作過實現,隨副本數的增長檢索速度會有微量的降低,因此你們在設置副本數時,須要找一個平衡值。另外設置副本後,你們有可能會出現兩次相同檢索,出現出現不一樣值的狀況,這裏多是因爲tranlog沒有平衡、或是分片路由的問題,能夠經過?preference=_primary 讓檢索在主片分上進行。 

3、分詞 
其實分詞對於索引的影響可大可小,看本身把握。你們越許認爲詞庫的越多,分詞效果越好,索引質量越好,其實否則。分詞有不少算法,大部分基於詞表進行分詞。也就是說詞表的大小決定索引大小。因此分詞與索引膨漲率有直接連接。詞表不該不少,而對文檔相關特徵性較強的便可。好比論文的數據進行建索引,分詞的詞表與論文的特徵越類似,詞表數量越小,在保證查全查準的狀況下,索引的大小能夠減小不少。索引大小減小了,那麼檢索速度也就提升了。 

4、索引段 
索引段即lucene中的segments概念,咱們知道ES索引過程當中會refresh和tranlog也就是說咱們在索引過程當中segments number不至一個。而segments number與檢索是有直接聯繫的,segments number越多檢索越慢,而將segments numbers 有可能的狀況下保證爲1這將能夠提到將近一半的檢索速度。 
Java代碼   收藏代碼
  1. $ curl -XPOST ‘http://localhost:9200/twitter/_optimize? max_num_segments =1′  


5、刪除文檔 
刪除文檔在Lucene中刪除文檔,數據不會立刻進行硬盤上除去,而進在lucene索引中產生一個.del的文件,而在檢索過程當中這部分數據也會參與檢索,lucene在檢索過程會判斷是否刪除了,若是刪除了在過濾掉。這樣也會下降檢索效率。因此能夠執行清除刪除文檔。 
Java代碼   收藏代碼
  1. $ curl -XPOST ‘http://localhost:9200/twitter/_optimize? only_expunge_deletes =true’  
相關文章
相關標籤/搜索