ES 手冊
如何提高ES的性能
不要返回較大的結果集
ES是設計成一個搜索引擎的,只擅長返回匹配查詢較少文檔,如果需要返回非常多的文檔需要使用Scroll。
避免稀疏
因為ES是基於Lucene來索引和存儲數據的,所以對稠密的數據更有效。Lucene能夠有效的確定文檔是通過一個整數的文檔id,無論有沒有數據都會話費一個字節存儲id。稀疏主要影響norms和doc_values,一些可以避免稀疏的推薦:
避免將不相關的數據放到相同的索引中
規范的文檔結構
使用相同的字段名來保存同樣的數據。
避免類型
不用norms和doc_values在稀疏字段
調整索引速度
使用bulk請求
並且每個請求不超過幾十M,因為太大會導致內存使用過大
使用 multiple workers/threads發送數據到ES
多進程或者線程,如果看到TOO_MANY_REQUESTS (429)
和EsRejectedExecutionException
則說明ES跟不上索引的速度,當集群的I/O或者CPU飽和就得到了工作者的數量。
增加刷新間隔
index.refresh_interval
默認是1s,可以改成30s以減少合並壓力。
在加載大量數據時候可以暫時不用refresh和repliccas
index.refresh_interval to -1 and index.number_of_replicas to 0
禁用swapping
給文件緩存分配內存
緩存是用來緩存I/O操作的,至少用一般的內存來運行ES文件緩存。
使用更快的硬件
- 使用SSD作為存儲設備。
- 使用本地存儲,避免使用NFS或者SMB
- 注意使用虛擬存儲,比如亞馬遜的EBS
索引緩沖大小
indices.memory.index_buffer_size
通常是JVM的0.1,確保他足夠處理至多512MB的索引。
調整搜索速度
給文件系統緩存大內存
至少給可用內存的一半到文件系統緩存。
使用更快的硬件
- 使用SSD作為存儲設備。
- 使用性能更好的CPU,高並發
- 使用本地存儲,避免使用NFS或者SMB
- 注意使用虛擬存儲,比如亞馬遜的EBS
文檔建模
避免鏈接,嵌套會使查詢慢幾倍,而親自關系能使查詢慢幾百倍,所以如果同樣的問題可以通過沒有鏈接的非規范回答就可以提升速度。
預索引數據
不明覺厲
映射
數值型數據不一定要映射成整形或者長整型
避免scripts
如果實在要使用,就用painless和expressions
強勢合並只讀索引
https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-forcemerge.html
不要強勢合並正在寫的索引
准備全局順序
准備文件系統緩存
index.store.preload
,如果內存不是很大會使搜索變得緩慢。
調整磁盤使用
禁用不需要的功能
- 不需要過濾時可以禁用索引
“index”:false
- 如果你不需要text字段的score,可以禁用
”norms”:false
- 如果不需要短語查詢可以不索引positions
"indexe_options":"freqs"
不用默認的動態字符串匹配
不要使用_all
使用best_compression
使用最小的足夠用的數值類型
byte,short,integer,long
half_float,float,double