在動手編碼前,必須建立正確的 ES 認知體系,以下 15 條經驗法則關係到系統穩定性:
TransportClient/RestHighLevelClient 線程安全,全局單例,禁忌頻繁創建from + size > 10000 會導致集群 OOM,必須使用 search_after 或 Scroll APIupdate 底層是「標記刪除舊文檔 + 寫入新文檔」hash(_id) % primary_shards,自定義 routing 需謹慎<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.17.12</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>4.4.5</version>
</dependency>
{
String[] hp = h.split(":");
return new HttpHost(hp[0], Integer.parseInt(hp[1]), "http");
})
.toArray(HttpHost[]::new);
return new RestHighLevelClient(
RestClient.builder(httpHosts)
.setRequestConfigCallback(b -> b
.setConnectTimeout(5000)
.setSocketTimeout(60000))
.setHttpClientConfigCallback(b -> b
.setMaxConnTotal(200)
.setMaxConnPerRoute(100))
);
}
}
原生 REST High Level Client 進階操作
1. 索引管理
2. 文檔 CRUD
3. 高亮與建議
").postTags("") .requireFieldMatch(false); source.highlighter(highlight); // 搜索建議 SuggestionBuilder suggestion = SuggestBuilders.completionSuggestion("suggest_field") .prefix("key") .skipDuplicates(true) .size(10); source.suggest(suggestion); 生產環境優化清單
| 維度 | 優化措施 |
|---|---|
| 寫入性能 | 批量提交、調大 refresh_interval、使用 bulk processor、關閉副本後重開 |
| 查詢性能 | 合理分片、字段類型優化、禁用 _source 僅返回需求字段、使用 Filter Context 替代 Query Context |
| 穩定性 | 熔斷配置、慢查詢日誌、JVM 堆內存 50% 以下、禁用 Swap |
| 運維 | ILM 索引生命周期管理、定期 Force Merge、監控告警體系 |
Elasticsearch 作為搜索中間件,其價值在於「全文檢索、日誌分析、指標聚合」三大核心場景。Spring 整合 ES 的最佳路徑是:優先使用 Spring Data Elasticsearch Repository 完成 80% 標準操作,複雜查詢、批量寫入、索引管理等底層控制場景下沉到 RestHighLevelClient。牢記前文 15 條避坑指南,方能在生產環境駕馭這頭「野獸」。