JAVA面試寶典 -《Elasticsearch 深度調優實戰》

文章目錄

  • 一、引言:搜索引擎為啥越來越慢?
    • 1.1 典型業務場景
      • 性能瓶頸表現??:
  • 二、倒排索引壓縮:讓存儲與檢索更高效
    • 🧠 2.1倒排索引結構簡述
    • 🔧 2.2 壓縮算法三劍客
    • ? 調優建議
  • 三、分片策略:寫入性能的生命線
    • ??3.1 分片數量黃金法則
    • 🔍3.2 分片寫入瓶頸
    • ? 3.3 分片動態調整
  • 四、深度分頁:性能黑洞解決方案
    • 🚨4.1 From/Size 的性能災難
    • 🧭 4.2 高性能替代方案
      • 🔁方案一:Search After(實時分頁)
      • 🔁方案二:PIT(Point In Time)
      • 方案對比
  • 五、相關性算分:從理論到業務定制
    • 🔍5.1 BM25 算法原理
    • 🎯業務相關性優化
      • 1. 字段加權:
      • 2. 結合業務數據:
  • 六、腦裂防護:集群高可用保障
    • 😱6.1 腦裂成因與影響
    • 🛡?6.2 防腦裂配置
    • ?6.3 節點部署最佳實踐
  • 七、總結與調優建議清單 ?
    • 🔧7.1 性能調優清單
    • 🗂?7.2 冷熱集群架構
    • 🖼?7.3 緊急故障處理
  • 八、技術附錄
    • 🧨8.1 Java 客戶端配置
    • 🛠8.2 索引生命周期管理

一、引言:搜索引擎為啥越來越慢?

在電商平臺的商品檢索系統中,隨著商品數量的增長、篩選條件變多、排序邏輯變復雜,搜索響應變得越來越慢:

用戶搜索「運動鞋」帶上多個篩選條件(品牌、尺碼、價格、評分等);

排序字段組合復雜(銷量 + 綜合評分 + 時間);

用戶經常點擊下一頁,導致深度分頁調用。

高并發 + 多字段組合查詢 + 分頁 + 相關性評分,使 Elasticsearch 性能面臨瓶頸。本文將從原理與實戰雙維度,深入解析核心性能優化策略。

1.1 典型業務場景

在這里插入圖片描述

性能瓶頸表現??:

  • 響應時間從 50ms → 3000ms+
  • 分頁越深越慢
  • 寫入速度隨數據量增加而下降
  • 節點負載不均(熱節點 CPU 100%)

??數據統計??:超過深度分頁請求數(from>1000)的查詢,??98%?? 最終被用戶放棄!

二、倒排索引壓縮:讓存儲與檢索更高效

🧠 2.1倒排索引結構簡述

在這里插入圖片描述

🔧 2.2 壓縮算法三劍客

壓縮方式應用場景說明
FST(Finite State Transducer)keyword 字段的 term dictionary前綴壓縮,相同前綴只存一份,提高內存命中率
Roaring Bitmap布爾條件組合,如標簽篩選加速 AND/OR 操作,比 bitset 更緊湊
Block-Packed EncodingdocID + 位置信息壓縮Lucene 默認優化機制

? 調優建議

  • 合理選擇字段類型:keyword 用于聚合和排序,text 用于全文搜索;
  • 對非查詢字段設置 “index”: false,避免不必要的倒排索引;
  • 可關閉不需要的 _source 字段,節省存儲空間。
// 創建優化映射
PUT /products
{"settings": {"index": {"number_of_shards": 12,"number_of_replicas": 1}},"mappings": {"_source": {"enabled": false    // 對不需要原始數據的場景},"properties": {"product_name": {"type": "text", "index_options": "docs"  // 僅存儲文檔ID},"brand_id": {"type": "keyword","index": false   // 不建索引,僅作為存儲字段},"specs": {"type": "text","norms": false   // 禁用長度歸一化,節省空間}}}
}

三、分片策略:寫入性能的生命線

??3.1 分片數量黃金法則

在這里插入圖片描述

🔍3.2 分片寫入瓶頸

// 分片寫入偽代碼
class IndexShard {void indexDocument(Document doc) {// 1. 寫入事務日志(translog)writeToTranslog(doc); // 2. 刷新到內存緩沖區addToMemoryBuffer(doc);// 3. 周期性刷新到Lucene段if (shouldRefresh()) {refresh(); // 成本高昂的操作}}
}

??寫入優化配置??:

# elasticsearch.yml
index.translog.durability: async     # 異步寫translog
index.refresh_interval: 30s          # 降低刷新頻率
indices.memory.index_buffer_size: 20% # 增加內存緩沖區

? 3.3 分片動態調整

# 擴容后重新分配分片
POST _reindex
{"source": {"index": "products-v1"},"dest": {"index": "products-v2"}
}# 限制節點分片數
PUT _cluster/settings
{"persistent": {"cluster.routing.allocation.total_shards_per_node": 100}
}

??經驗值??:SSD 節點建議單分片不超過 50GB,HDD 不超過 30GB

四、深度分頁:性能黑洞解決方案

🚨4.1 From/Size 的性能災難

在這里插入圖片描述

🧭 4.2 高性能替代方案

🔁方案一:Search After(實時分頁)

GET /products/_search
{"size": 10,"query": {"match": {"category": "手機"} },"sort": [{"price": "desc"},{"_id": "asc"}  // 確保排序唯一性],"search_after": [2999, "prod_123456"] 
}

🔁方案二:PIT(Point In Time)

// Java客戶端操作
OpenPointInTimeRequest pitRequest = new OpenPointInTimeRequest("products").keepAlive(TimeValue.timeValueMinutes(5));
OpenPointInTimeResponse pitResponse = client.openPointInTime(pitRequest, RequestOptions.DEFAULT);SearchRequest searchRequest = new SearchRequest().source(new SearchSourceBuilder().pointInTimeBuilder(new PointInTimeBuilder(pitResponse.getPointInTimeId())).sort(SortBuilders.fieldSort("price").order(SortOrder.DESC)).size(100));

方案對比

方案特點場景適配
Scroll API游標式分頁,保持快照一致報表導出、數據迭代
search_after基于上頁 sort 值定位下一頁無狀態分頁推薦
PIT(Point In Time)7.10+ 引入,輕量快照精準分頁、支持重試

五、相關性算分:從理論到業務定制

🔍5.1 BM25 算法原理

score(q,d) =  IDF(q) * [ TF(q,d) * (k1 + 1) ] / [ TF(q,d) + k1 * (1 - b + b * |d|/avgdl) ]

參數調優??:

PUT /products
{"settings": {"index": {"similarity": {"custom_bm25": {"type": "BM25","b": 0.75,   // 長度歸一化因子"k1": 1.2    // 詞頻飽和度}}}}
}

🎯業務相關性優化

1. 字段加權:

GET /products/_search
{"query": {"multi_match": {"query": "防水相機","fields": ["title^3",    // 標題權重3倍"features^2","description"],"type": "best_fields"}}
}

2. 結合業務數據:

GET /products/_search
{"query": {"function_score": {"query": {"match": {"name": "耳機"}},"functions": [{"filter": {"range": {"sales": {"gte": 1000}}},"weight": 2},{"script_score": {"script": {"source": "Math.log(2 + doc['click_count'].value)"}}}],"score_mode": "sum"}}
}

六、腦裂防護:集群高可用保障

😱6.1 腦裂成因與影響

在這里插入圖片描述

🛡?6.2 防腦裂配置

??配置關鍵參數??:

# elasticsearch.yml 配置# 7.x+版本
discovery.seed_hosts: ["node1:9300", "node2:9300", "node3:9300"]
cluster.initial_master_nodes: ["node1", "node2", "node3"]# 通用設置
cluster.name: prod-search-cluster  # 統一集群名
node.master: true                  # 主節點角色
node.data: false                   # 專用master節點建議關閉data角色

?6.3 節點部署最佳實踐

在這里插入圖片描述
部署建議??:

  1. Master節點數:3/5/7(奇數)
  2. 跨機房部署:每個機房部署獨立數據節點組
  3. 角色隔離:
    • 專用Master:3-5節點
    • 數據節點:承擔data角色
    • 協調節點:client節點分離

七、總結與調優建議清單 ?

🔧7.1 性能調優清單

類別參數/操作推薦值
??索引設計??分片大小10-50GB/分片
副本數量生產環境≥1
??查詢優化??深度分頁使用search_after/PIT
聚合精度設置shard_size
寫入性能?? ??refresh_interval30s-120s
translog模式async
??集群安全??最小主節點discovery.zen.minimum_master_nodes=(N/2+1)
節點角色分離master/data

🗂?7.2 冷熱集群架構

在這里插入圖片描述

🖼?7.3 緊急故障處理

# 1. 快速定位慢查詢
GET _tasks?detailed=true&actions=*search*# 2. 清除緩存(謹慎使用)
POST /products/_cache/clear# 3. 臨時限制分片分配
PUT _cluster/settings
{"transient": {"cluster.routing.allocation.enable": "none"}
}

八、技術附錄

🧨8.1 Java 客戶端配置

public class HighLevelClientExample {public static void main(String[] args) {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(4)  // 優化IO線程.build())).setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder.setConnectTimeout(5000) .setSocketTimeout(60000)));}
}

🛠8.2 索引生命周期管理

PUT _ilm/policy/hot-warm-cold-policy
{"policy": {"phases": {"hot": {"min_age": "0ms","actions": {"rollover": {"max_size": "50gb","max_age": "7d"}}},"warm": {"min_age": "7d","actions": {"shrink": {"number_of_shards": 2},"forcemerge": {"max_num_segments": 1}}},"cold": {"min_age": "30d","actions": {"allocate": {"require": {"data": "cold"}}}},"delete": {"min_age": "365d","actions": {"delete": {}}}}}
}

??最后建議??:生產環境部署至少3節點集群,定期進行性能壓測(使用 Rally 工具)

??討論話題??:你在 Elasticsearch 優化中最有成效的一項配置是什么?
👇 歡迎在評論區分享你的實戰經驗!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89803.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

克魯斯焊接機器人保護氣省氣方案

在現代焊接工藝中,克魯斯焊接機器人扮演著至關重要的角色。隨著制造業對成本控制和可持續發展的日益重視,焊接過程中的保護氣省氣問題成為了焦點。WGFACS節氣裝置為克魯斯焊接機器人的保護氣省氣提供了一種創新且有效的解決方案。克魯斯焊接機器人以其高…

JavaEE——多線程中的哈希表

目錄前言1.HashTable2.ConcurrentHashMap總結前言 在使用多線程前,我們用HashMap類來創建哈希表,但這個類線程不安全,在這篇文章,我們將介紹多線程環境的哈希表,將會講述HashTable, HashMap, ConcurrentHashMap這三個…

MyBatis Plus SQL性能分析:從日志到優化的全流程實戰指南

引言 在Java開發的江湖里,MyBatis Plus(MP)早已是“效率利器”——它用極簡的API封裝了CRUD操作,讓開發者從重復的SQL編寫中解放出來。但隨著項目數據量從“萬級”躍升至“十萬級”“百萬級”,一個尷尬的現實逐漸浮現&…

備忘錄設計模式

備忘錄模式(Memento Pattern)是一種行為設計模式,用于捕獲對象的內部狀態并在需要時恢復該狀態,同時不破壞對象的封裝性。它適用于需要實現撤銷/重做、歷史記錄或狀態快照的場景。核心組件Originator(原發器&#xff0…

【世紀龍科技】智能網聯汽車環境感知系統教學難題的創新實踐?

在職業院校智能網聯汽車專業教學中,環境感知系統的教學長期面臨三大核心挑戰:設備成本高昂導致實訓資源不足、抽象原理難以直觀呈現、傳統教學模式難以滿足產業需求。如何讓學生在有限的教學條件下,深入理解激光雷達、毫米波雷達等核心部件的…

ES vs Milvus vs PG vector :LLM時代的向量數據庫選型指南

互聯網時代,關系型數據庫為王。相應的,我們的檢索方式也是精確匹配查詢為主——查找特定的用戶ID、商品編號或訂單狀態。但AI時代,語義檢索成為常態,向量數據庫成為搜索推薦系統,大模型RAG落地,自動駕駛數據…

磁盤陣列技術的功能與分類

磁盤陣列技術 磁盤陣列是由多臺磁盤存儲器組成的一個快速、大容量、高可靠的外存子系統。現在常見的磁盤陣列稱為廉價冗余磁盤陣列(Redundant Array of Independent Disk,RAID)。目前,常見的 RAID 如下所示。 廉價冗余磁盤陣列 RAID級別 RAID-0是一種不具…

SpringMVC核心注解:@RequestMapping詳解

概述RequestMapping是SpringMVC中最核心的注解之一,用于將HTTP請求映射到MVC和REST控制器的處理方法上。基本功能RequestMapping主要用于:映射URL到控制器類或方法定義請求方法類型(GET、POST等)定義請求參數、請求頭等條件使用位…

【雜談】硬件工程師怎么用好AI工具做失效分析

最近被派到國外出差了,工作任務比較重,所以更新的頻率比較低。但在出差工作的過程中,我發現在失效分析時,有相當多的時間做的是比較重復的工作。比如失效分析肯定要一些證據如圖片、視頻。當我們做多臺設備的失效分析時&#xff0…

MyBatis詳解以及在IDEA中的開發

MyBatis概述 MyBatis是一個優秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。MyBatis避免了幾乎所有的JDBC代碼和手動設置參數以及獲取結果集的過程。 核心特點 優勢: SQL語句與Java代碼分離,便于維護支持動態SQL,靈活性…

LangGraph教程6:LangGraph工作流人機交互

文章目錄 Human-in-the-loop(人機交互) interrupt Warning Human-in-the-loop(人機交互) 人機交互(或稱“在循環中”)工作流將人類輸入整合到自動化過程中,在關鍵階段允許決策、驗證或修正。這在基于 LLM 的應用中尤其有用,因為基礎模型可能會產生偶爾的不準確性。在合規、…

Linux部署Milvus數據庫及Attu UI工具完全指南

一、準備工作1.1 環境要求操作系統:Ubuntu 20.04/Debian 11/CentOS 7硬件配置:至少8GB內存,4核CPU,50GB磁盤空間網絡要求:可訪問互聯網(用于拉取Docker鏡像)1.2 安裝Docker和Docker Compose1.2.…

開疆智能Profinet轉ModbusTCP網關連接康耐視InSight相機案例

相機配置:硬件連接部分可以查詢我的博客:點擊 這里不做說明。在電子表格視圖下,點擊菜單 “傳感器–網絡設置”:選擇工業協議,如圖。保存作業,并按照提示重啟相機。3. 相機的控制/狀態字:上圖中…

BERT技術架構

### **一、整體定位:純編碼器架構**#### **核心設計思想**> **預訓練微調**:> 1. **預訓練**:在海量無標簽文本上學習通用語言規律> 2. **微調**:用少量標注數據適配具體任務(如分類/問答)> **…

Python+ArcGIS+AI蒸散發與GPP估算|Penman-Monteith模型|FLUXNET數據處理|多源產品融合|專業科研繪圖與可視化等

結合Python編程與ArcGIS工具,通過AI輔助方法實現蒸散發與植被總初級生產力估算。學習國際流行的Penman-Monteith模型,掌握數據獲取、處理、分析和可視化全流程,培養生態水文與雙碳領域的實踐應用能力。通過DeepSeek、豆包等AI工具輔助代碼編寫…

elasticsearch+logstash+kibana+filebeat實現niginx日志收集(未過濾日志內容)

單點部署 環境準備 基于Rocky9虛擬機,內存大小為4G yum -y install lrzsz useradd elkf passwd elkf#密碼隨意su - elk rz 導入包,筆者導使用版本為7.17.8下載地址:https://www.elastic.co/downloads/past-releases/ tar -xf elasticsearch-7…

hadoop 集群問題處理

1.1.JournalNode 的作用在 HDFS HA 配置中,為了實現兩個 NameNode 之間的狀態同步和故障自動切換,Hadoop 使用了一組 JournalNode 來管理共享的編輯日志。具體來說,JournalNode 的主要職責包括:共享編輯日志:JournalNo…

LeetCode--46.全排列

解題思路&#xff1a;1.獲取信息&#xff1a;給定一個不含重復數字的數組&#xff0c;返回所有可能的全排列&#xff0c;可以按任意順序返回提示信息&#xff1a;1 < nums.length < 6-10 < nums[i] < 102.分析題目&#xff1a;要獲取到所有可能的全排列我們每次會從…

云徙科技----一面(全棧開發)

一、公司是做什么業務的&#xff1f;二、介紹一下自己會用的&#xff0c;熟悉的技術棧&#xff1f;三、“在 Spring 應用中&#xff0c;當你發起一個 RESTful API 請求時&#xff08;例如 GET /api/users/1&#xff09;&#xff0c;計算機系統是如何知道這個請求的&#xff1f;…

我是怎么設計一個訂單號生成策略的(庫存系統)

我是怎么設計一個訂單號生成策略的&#xff08;庫存系統&#xff09;一、背景 最近我在做一套自研的庫存管理系統&#xff0c;其中有一個看似簡單、實則很關鍵的功能&#xff1a;訂單號生成策略。 訂單號不僅要全局唯一&#xff0c;還要有一定的可讀性和業務含義&#xff0c;比…