Elasticsearch的理解與使用

????????在大數據與云計算時代,“高效檢索” 與 “實時分析” 成為業務突破的關鍵能力。Elasticsearch(簡稱 ES)作為一款開源分布式搜索與分析引擎,憑借其低延遲、高可擴、強靈活的特性,已成為日志分析、全文檢索、業務監控等場景的 “標配工具”。本文將從 ES 的核心本質出發,深入剖析其架構原理,再通過完整的 Java 代碼實現核心功能,幫助開發者從 “認知” 到 “落地” 全面掌握 ES。

一、Elasticsearch 本質認知:它到底是什么?

1. 定位與核心價值

ES 并非傳統數據庫,而是一款 **“搜索 + 分析” 一體化引擎 **,核心解決 “從海量非結構化 / 半結構化數據中快速找到目標信息” 的問題。與傳統數據庫(如 MySQL)相比,其優勢體現在:

  • 全文檢索能力:支持中文、英文等多語言分詞,可實現模糊匹配、短語搜索、權重排序(如 “搜索‘蘋果手機’時,優先展示銷量高的商品”)。
  • 分布式天然適配:數據自動分片存儲,集群可輕松擴展至數百節點,承載 PB 級數據。
  • 實時性:數據寫入后秒級可檢索,延遲通常低于 100ms,滿足日志監控、實時推薦等場景。
  • 多維度分析:無需依賴 Hadoop 等工具,通過聚合功能即可實現 “按地區統計訂單量”“計算商品價格分布” 等分析需求。

2. 核心概念與傳統數據庫對比

ES 的術語體系是理解其設計思想的關鍵,通過與 MySQL 類比可快速掌握:

Elasticsearch 概念

傳統數據庫(MySQL)

核心作用

Index(索引)

數據庫(Database)

存儲一類結構相似的數據(如 “商品索引”“用戶日志索引”),索引名需小寫,無特殊字符

Document(文檔)

數據行(Row)

索引的最小數據單元,以 JSON 格式存儲(如{"id":"1001","name":"iPhone 15","price":7999})

Field(字段)

數據列(Column)

文檔的屬性(如 “name”“price”),支持多種類型(text、keyword、integer、date 等)

Mapping(映射)

表結構(Schema)

定義字段的類型、分詞器、是否可搜索等規則(如 “將‘name’設為 text 類型,使用 IK 分詞器”)

Shard(分片)

無直接對應

將索引拆分后的小分片,分布式存儲在不同節點,實現水平擴展(解決單節點存儲上限問題)

Replica(副本)

主從復制(Slave)

分片的備份,用于高可用(分片故障時自動切換)和讀寫分離(副本承擔讀請求)

注意:ES 7.x 后已廢棄Type(類型)(原對應 MySQL 的 Table),原因是 “同一索引下不同 Type 的字段可能沖突,導致分片存儲效率低下”,建議通過不同索引區分數據類型(如 “商品索引” 和 “訂單索引” 分開創建)。

二、Elasticsearch 架構原理:分布式背后的邏輯

ES 的強大源于其分布式架構設計,理解底層邏輯能幫助開發者在實際項目中避免 “踩坑”(如分片數量不合理導致性能瓶頸)。

1. 集群的核心組成:節點(Node)

一個 ES 集群由多個節點組成,每個節點是一臺運行 ES 服務的服務器,按功能可分為 4 類:

  • Master 節點:集群 “管理者”,負責創建索引、分片分配、節點加入 / 退出等管理操作,不承擔數據存儲和查詢壓力。建議部署 3 個節點(避免單點故障,通過選舉機制實現高可用)。
  • Data 節點:集群 “數據載體”,負責數據的存儲(分片)、索引寫入和查詢請求處理。根據數據量和查詢壓力橫向擴展(如 “從 3 個 Data 節點擴展到 5 個,提升查詢吞吐量”)。
  • Coordinating 節點:“請求入口”,接收客戶端請求后,將請求分發到相關 Data 節點,匯總結果后返回給客戶端。可由 Master 或 Data 節點兼任,高并發場景建議單獨部署。
  • Ingest 節點:數據 “預處理管道”,負責數據寫入前的清洗(如 “過濾日志中的敏感字段”“將日期格式從‘yyyy-MM-dd’轉為‘timestamp’”)。

2. 分片機制:分布式存儲的核心

ES 通過分片(Shard) 實現數據的分布式存儲,分為 “主分片” 和 “副本分片”:

  • 主分片(Primary Shard):索引創建時指定的分片數量(一旦創建不可修改),用于數據寫入和核心查詢(如 “創建商品索引時,設置 3 個主分片”)。
  • 副本分片(Replica Shard):主分片的備份,數量可動態調整(如 “為 3 個主分片各創建 1 個副本,共 6 個分片”),與主分片不在同一節點(避免節點宕機導致數據丟失)。

分片分配示例

3 個 Data 節點,創建 “商品索引”(3 個主分片,1 個副本),最終分片分布如下:

  • 節點 1:主分片 P0、副本分片 R1
  • 節點 2:主分片 P1、副本分片 R2
  • 節點 3:主分片 P2、副本分片 R0

此時:

  • 寫入數據:客戶端請求先到 Coordinating 節點,根據文檔 ID 哈希值路由到對應主分片(如 “文檔 ID=1001” 路由到 P0),寫入成功后同步到副本 R0。
  • 查詢數據:Coordinating 節點將請求分發到主分片或副本分片(如 “查詢‘iPhone 15’時,同時查詢 P0、P1、P2 的副本,并行返回結果”),提升讀性能。

3. 數據寫入與檢索流程

(1)數據寫入流程(以 “新增商品文檔” 為例)
  • 客戶端通過 Java 代碼(High Level REST Client)向 Coordinating 節點發送寫入請求。
  • Coordinating 節點計算文檔 ID 的哈希值,確定應寫入的主分片(如 P0)。
  • 主分片 P0 驗證文檔格式(是否符合 Mapping 規則,如 “price” 是否為數值類型),寫入數據并生成倒排索引(全文檢索的核心結構,后文詳解)。
  • 主分片 P0 將數據同步到副本分片 R0。
  • 副本 R0 同步完成后,主分片 P0 向 Coordinating 節點返回 “寫入成功”,最終反饋給客戶端。
(2)數據檢索流程(以 “搜索‘蘋果手機’為例)
  • 客戶端發送查詢請求到 Coordinating 節點。
  • Coordinating 節點將查詢請求分發到所有主分片 / 副本分片(如 P0、P1、P2 及其副本)。
  • 各分片執行查詢,返回匹配的文檔 ID 和相關性得分(Score,根據 “關鍵詞出現頻率”“文檔熱度” 等計算)。
  • Coordinating 節點匯總所有分片的結果,按得分排序,取前 N 條(如前 20 條),再向對應分片請求完整文檔數據。
  • 分片返回完整文檔,Coordinating 節點整理結果并返回給客戶端。

4. 全文檢索核心:倒排索引

ES 之所以能實現高效全文檢索,核心在于倒排索引(Inverted Index) 結構,與傳統數據庫的 “正排索引”(按文檔 ID 存儲數據)相反:

  • 正排索引:文檔 ID → 文檔內容(如 “文檔 1001 → 我買了一部蘋果手機”),適合按 ID 查詢,但無法快速匹配 “包含‘手機’的文檔”。
  • 倒排索引:關鍵詞 → 包含該關鍵詞的文檔 ID 列表(如 “手機 → 文檔 1001、文檔 1003、文檔 1005”),直接通過關鍵詞定位文檔,檢索效率提升 10 倍以上。

倒排索引的構成

  • 詞典(Dictionary):存儲所有去重后的關鍵詞(如 “蘋果”“手機”“華為”),通常以 B + 樹結構存儲,便于快速查找。
  • postings 列表(Postings List):記錄每個關鍵詞對應的文檔 ID、出現位置(如 “‘手機’在文檔 1001 的第 3 個字符處出現”)、出現頻率(如 “‘手機’在文檔 1001 中出現 2 次”),用于計算文檔與查詢的相關性(Score)。

三、Elasticsearch 核心功能 Java 實戰

????????ES 官方提供多種客戶端(如 Transport Client、High Level REST Client),其中High Level REST Client(7.x + 推薦) 基于 HTTP 協議,支持所有 ES 功能,且與 ES 版本兼容性好。以下實戰基于 ES 7.17.0 版本,通過 Java 代碼實現全文搜索、聚合分析、數據同步、集群監控等核心功能。

1. 環境準備

(1)Maven 依賴配置

在pom.xml中引入 ES 客戶端及相關依賴(版本需與 ES 集群一致):

<dependencies><!-- Elasticsearch High Level REST Client --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.17.0</version></dependency><!-- Elasticsearch 核心依賴 --><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.17.0</version></dependency><!-- JSON 解析(用于文檔序列化/反序列化) --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.32</version></dependency><!-- 日志依賴(用于調試) --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.36</version><scope>test</scope></dependency></dependencies>
(2)ES 客戶端初始化(單例模式)

客戶端創建成本較高,建議通過單例模式復用,避免頻繁創建銷毀連接:

import org.apache.http.HttpHost;import org.apache.http.auth.AuthScope;import org.apache.http.auth.UsernamePasswordCredentials;import org.apache.http.client.CredentialsProvider;import org.apache.http.impl.client.BasicCredentialsProvider;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestHighLevelClient;import java.io.IOException;/*** ES客戶端工具類(單例模式)*/public class EsClientUtils {// 單例客戶端實例private static RestHighLevelClient client;// ES集群節點(多個節點用逗號分隔)private static final String ES_NODES = "192.168.1.100:9200,192.168.1.101:9200";// ES賬號密碼(若未開啟認證,可刪除相關代碼)private static final String USERNAME = "elastic";private static final String PASSWORD = "123456";// 私有構造器(防止外部實例化)private EsClientUtils() {}/*** 獲取ES客戶端實例*/public static RestHighLevelClient getClient() {if (client == null) {synchronized (EsClientUtils.class) {if (client == null) {// 1. 解析ES節點String[] nodes = ES_NODES.split(",");HttpHost[] httpHosts = new HttpHost[nodes.length];for (int i = 0; i < nodes.length; i++) {String[] hostPort = nodes[i].split(":");httpHosts[i] = new HttpHost(hostPort[0], Integer.parseInt(hostPort[1]), "http");}
// 2. 配置賬號密碼認證(若未開啟認證,可省略)CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(USERNAME, PASSWORD));// 3. 構建客戶端client = new RestHighLevelClient(RestClient.builder(httpHosts).setHttpClientConfigCallback(httpClientBuilder ->httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)));}}}return client;}/*** 關閉客戶端*/public static void closeClient() throws IOException {if (client != null) {client.close();}}}

2. 索引與映射操作(基礎必備)

在寫入數據前,需先創建索引并定義映射(類似 MySQL 中 “先建表,再插入數據”)。以下代碼實現 “創建商品索引(product)”,并定義字段映射規則:

import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.xcontent.XContentBuilder;import org.elasticsearch.common.xcontent.json.JsonXContent;import java.io.IOException;/*** 索引與映射操作示例*/public class EsIndexDemo {// 索引名稱private static final String INDEX_NAME = "product";/*** 創建索引并定義映射* 需求:* 1. 主分片數3,副本數1(適合3個Data節點的集群)* 2. 字段映射:* - id:keyword類型(不分詞,用于精確匹配)* - name:text類型(分詞,使用IK中文分詞器)* - brand:keyword類型(不分詞,用于分組統計)* - price:double類型(用于范圍查詢、排序)* - sales:integer類型(用于排序、聚合)* - create_time:date類型(用于時間范圍查詢)*/public static void createIndexWithMapping() throws IOException {RestHighLevelClient client = EsClientUtils.getClient();// 1. 構建創建索引請求CreateIndexRequest request = new CreateIndexRequest(INDEX_NAME);// 2. 設置索引參數(分片、副本等)request.settings(Settings.builder().put("number_of_shards", 3) // 主分片數.put("number_of_replicas", 1) // 副本數.put("refresh_interval", "1s") // 刷新間隔(數據寫入后1秒可檢索));// 3. 定義映射規則XContentBuilder mappingBuilder = JsonXContent.contentBuilder();mappingBuilder.startObject().startObject("properties")// id字段:keyword類型(不分詞).startObject("id").field("type", "keyword").endObject()// name字段:text類型,使用IK分詞器(需提前在ES安裝IK插件).startObject("name").field("</doubaocanvas>

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

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

相關文章

利用FFmpeg自動批量處理m4s文件

緩存了一些視頻m4s文件&#xff0c;只能用指定的軟件打開&#xff0c;網上查了一下&#xff0c;需要去掉m4s文件開頭的9個0&#xff0c;還要用FFmpeg將兩個文件合并成一個文件。 經仔細研究緩存目錄和其中文件&#xff0c;發現以下特點&#xff1a;“緩存目錄”中有很多“數字文…

MLLM學習~M3-Agent Prompt學習

Prompt “輸入→處理→輸出→評估” 全流程 Prompt 并非孤立存在&#xff0c;形成了完整的視頻理解鏈路&#xff1a; 視頻原始數據&#xff08;語音 / 圖像&#xff09;→ 模塊 1&#xff08;提取語音 綁定人物 ID&#xff09;→ 模塊 2&#xff08;生成情景記憶描述&#xff…

Ubuntu 20.04安裝顯卡驅動、CUDA、Miniconda和Pytorch(2025.06最新)-Ubuntu從零搭建深度學習環境

文章目錄一、安裝顯卡驅動1.1 查看顯卡型號1.2 根據顯卡型號選擇驅動1.3 獲取下載鏈接1.4 查看下載的顯卡驅動安裝文件1.5 更新軟件列表和安裝必要軟件、依賴1.6 卸載原有驅動1.7 禁用默認驅動1.8 安裝lightdm顯示管理器1.9 停止顯示服務器1.10 在文本界面中&#xff0c;禁用X-…

PyCharm 連接 AutoDL 遠程服務器

實驗室的電腦性能不行了&#xff0c;所以想著租一臺服務器&#xff0c;然后還想使用PyCharm在本地編程&#xff0c;因此就查找相關資料&#xff0c;這里記錄一下配置過程&#xff0c;方便以后查閱。 PyCharm 連接 AutoDL 遠程服務器PyCharm 連接服務器上傳數據集到服務器運行代…

Spark廣播變量HttpBroadcast和TorrentBroadcast對比

HttpBroadcast會在driver端的BlockManager里面存儲廣播變量對象&#xff0c;并且將該廣播變量序列化寫入文件中去。所有獲取廣播數據請求都在driver端&#xff0c;所以存在單點故障和網絡IO性能問題。 TorrentBroadcast會在driver端的BlockManager里面存儲廣播變量對象&#xf…

新手向:C語言、Java、Python 的選擇與未來指南

語言即工具&#xff0c;選對方向比埋頭苦學更重要你好&#xff0c;編程世界的新朋友&#xff01;當你第一次踏入代碼的宇宙&#xff0c;面對形形色色的編程語言&#xff0c;是否感到眼花繚亂&#xff1f;今天我們就來聊聊最主流的三種編程語言——C語言、Java 和 Python——它們…

收集飛花令碎片——C語言關鍵字typedef

在C語言的指針章節中&#xff0c;我們講到函數指針模塊 在函數指針中&#xff0c;有一個重要的關鍵字&#xff1a;typedef typedef關鍵字作用基本語法重難點&#xff1a;對數組指針與函數指針的重命名數組指針重命名一維數組指針重命名遍歷二維數組函數指針重命名作用 typedef是…

基于Spring Boot的家政服務管理系統+論文示例參考

1.項目介紹 系統角色&#xff1a;管理員、家政服務、服務人員功能模塊&#xff1a;用戶管理、服務人員、服務類型、家政服務、服務預約、接單信息、服務記錄、評價信息、反饋投訴等技術選型&#xff1a;SpringBoot&#xff0c;Vue等測試環境&#xff1a;idea2024&#xff0c;jd…

AI助力HTML5基礎快速入門:從零開始理解網頁結構

前言 作為一名前端開發初學者&#xff0c;理解HTML的基本結構是你踏入Web開發世界的第一步。HTML&#xff08;超文本標記語言&#xff09;是構建網頁的基礎&#xff0c;就像蓋房子需要先搭建好框架一樣&#xff0c;學習HTML就是學習如何構建網頁的基本骨架。今天&#xff0c;我…

實現調用libchdb.a靜態連接庫中的未公開導出函數

前文寫了調用libchdb.so動態連接庫中的未公開導出函數的方法&#xff0c;不久前chdb發布了3.6版&#xff0c;其中提供了靜態鏈接庫。 嘗試編譯一個不依賴龐大動態連接庫libchdb.so的程序&#xff0c;獲得了成功&#xff0c;以下是操作步驟。 1.下載chdb靜態連接庫 wget https:…

HTTPS 端口號詳解 443 端口作用、iOS 抓包方法、常見 HTTPS 抓包工具與網絡調試實踐

在現代互聯網中&#xff0c;幾乎所有移動應用和網站都使用 HTTPS 協議 來保障數據安全。而 HTTPS 的默認端口就是 443。相比 HTTP 的 80 端口&#xff0c;443 不僅增加了 SSL/TLS 加密&#xff0c;還涉及到證書驗證和加密握手&#xff0c;這使得開發者在進行 HTTPS 抓包 時面臨…

【Python系列PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘pyqt5’問題

【Python系列PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘pyqt5’問題 摘要 在日常Python開發中&#xff0c;使用PyCharm控制臺執行pip install時經常會遇到ModuleNotFoundError: No module named pyqt5等類似報錯。這類報錯不僅…

“可信資產IPO +數鏈金融RWA” 鏈改2.0六方共識(深圳)

“可信資產IPO 數鏈金融RWA”鏈改2.0六方共識【2025年8月30日 深圳】全球數鏈金融的建設者、創新者與決策者&#xff1a;我們——來自“生態、項目、資金、合規、技術、行業”六方領域的實踐者&#xff0c;在鏈改1.0的基礎上于深圳達成鏈改2.0時代核心共識&#xff1a;以“可信…

華為云 GaussDB:金融級高可用數據庫,為核心業務保駕護航

一、文檔概述在數字化浪潮席卷全球的當下&#xff0c;數據已成為企業發展的核心戰略資產&#xff0c;而數據庫作為數據存儲、管理與交互的核心載體&#xff0c;其穩定性、可靠性與安全性直接決定了企業業務的連續性與競爭力。尤其在對數據準確性、業務連續性要求近乎苛刻的金融…

Docker快速入門手冊

文章目錄一、安裝驗證是否安裝成功二、Docker命令鏡像容器數據卷管理網絡模式三、Dockerfile推送至鏡像倉庫阿里云ECI彈性容器部署阿里云Serverless應用引擎SAE部署阿里云FC函數部署容器四、Docker Compose::: tip 簡介Docker是一種開源的應用容器引擎&#xff0c;讓開發者能夠…

Golang并發編程及其高級特性

并發編程模型 線程模型&#xff1a;Go的GoroutineGoroutine&#xff08;M:N 模型&#xff09; package mainimport ("fmt""runtime""sync""time" )func main() {// 查看當前機器的邏輯CPU核心數&#xff0c;決定Go運行時使用多少OS線程…

弧形導軌如何提升新能源汽車的能效和續航里程?

弧形導軌在新能源汽車中的應用主要集中在電池生產線和自動化裝配線等領域&#xff0c;通過提高生產效率和精度&#xff0c;間接提升新能源汽車的能效和續航里程。高精度裝配&#xff1a;在新能源汽車的電池生產線中&#xff0c;弧形導軌用于高精度的自動化裝配設備&#xff0c;…

考研擇校考慮因素和備考流程

考研擇校一、選擇專業二、選擇學校三、考研計劃安排一、選擇專業 1、了解自己的未來工作規劃&#xff08;這里肯定沒有啥規劃&#xff09;&#xff1b; 2、連接考研的相關幾個專業哪個好就業&#xff08;公務員和找工作&#xff09;&#xff1b; 3、知乎、小紅書、deepseek都可…

1.13 Memory Profiler Package - Unity Objects(unity對象頁簽)

1.Unity Objects(Unity對象頁簽)簡介 2.界面功能參數1.Unity Objects(Unity對象頁簽)簡介 Unity Objects用于快速定位unity對象內存占用的類型和具體實例a.查找內存占用最大的資源, 判斷這些資源是否可以壓縮或延遲加載b.查找重復加載的資源c.查看運行時創建但是沒有釋放的資源…

Android真機-安裝Reqable證書-抓SSL包

使用Reqable的自動安裝系統證書無法正常抓包&#xff0c;所以就有了這篇文章超簡單的安裝方式 - 記得確保手機已擁有root權限一、從Reqable導出公鑰證書無需使用OpenSSL 將 .pem 文件轉換為 .0 格式注意是 .0 格式的這個證書二、推送證書到手機adb root adb remount adb push 證…