Index(寫)調優
副本數置0
? ?如果是集群首次灌入數據,可以將副本數設置為0,寫入完畢再調整回去,這樣副本分片只需要拷貝,節省了索引過 程。
PUT /my_temp_index/_settings
{
"number_of_replicas": 0
}
自動生成doc ID?
? ?通過Elasticsearch寫入流程可以看出,如果寫入doc時如果外部指定了id,則Elasticsearch會先嘗試讀取原來doc 的版本號,以判斷是否需要更新。這會涉及一次讀取磁盤的操作,通過自動生成doc ID可以避免這個環節。
合理設置mappings
- 將不需要建立索引的字段index屬性設置為not_analyzed或no。對字段不分詞,或者不索引,可以減少很多運 算操作,降低CPU占用。 尤其是binary類型,默認情況下占用CPU非常高,而這種類型進行分詞通常沒有什么意義。
- 減少字段內容長度,如果原始數據的大段內容無須全部建立 索引,則可以盡量減少不必要的內容。
-
使用不同的分析器(analyzer),不同的分詞器在索引過程中 運算復雜度也有較大的差異。
調整_source字段
? source 字段用于存儲 doc 原始數據,對于部分不需要存儲的字段,可以通過 includes excludes過濾,或者將 source禁用,一般用于索引和數據分離,這樣可以降低 I/O 的壓力,不過實際場景中大多不會禁用_source。
對analyzed的字段禁用norms
?Norms用于在搜索時計算doc的評分,如果不需要評分,則可以將其禁用:
"title": {
"type": "string",
"norms": {
"enabled": false
}
調整索引的刷新間隔
? 該參數缺省是1s,強制ES每秒創建一個新segment,從而保證新寫入的數據近實時的可見、可被搜索到。比如該參 數被調整為30s,降低了刷新的次數,把刷新操作消耗的系統資源釋放出來給index操作使用。
PUT /my_index/_settings
{
"index" : {
"refresh_interval": "30s"
}
}
批處理
批處理把多個index操作請求合并到一個batch中去處理,和mysql的jdbc的bacth有類似之處。如圖:
推薦閱讀
什么是AI Agent
高性能:為什么說Elasticsearch的倒排表比mySql的B+樹查詢快呢?
技術總體方案設計思路