Elasticsearch原理篇

Elasticsearch原理篇

  • 寫在前面:用之于手,先明于心
    • 一、傳統數據庫的瓶頸:當數據量成為負擔
      • 1. 千萬級數據下的性能衰減
      • 2. 分頁查詢的“深水陷阱”
      • 3. 關聯查詢的擴展難題
      • 4. 全文檢索能力薄弱
    • 二、Elasticsearch 的優勢:為搜索而生的分布式引擎
      • 1. 倒排索引 + 緩存機制,實現毫秒級響應
      • 2. 分布式架構,天然支持水平擴展
      • 3. 開箱即用的 RESTful API,開發友好
      • 4. 強大的全文檢索與相關性計算
      • 5. 實時性與近實時搜索(NRT)
      • 6. 多樣化應用場景支持
    • 三、結語:選型的本質是權衡
  • 深入原理:執簡御繁,溯本求源
    • 一、搜索引擎基本原理
      • 1. 文本分析(Text Analysis):從文本到詞條
      • 2. 索引構建:倒排索引是核心
        • 什么是倒排索引?
        • 倒排索引的優勢
      • 3. 數據采集與寫入流程
      • 4. 查詢與檢索:高效召回與排序
      • 總結
    • 二、ES 索引分片
      • 1. ES 集群
      • 2. 索引分片機制
      • 3. 索引分片恢復機制

寫在前面:用之于手,先明于心

“工欲善其事,必先利其器;然利其器者,必先明其道。”

在技術選型中,我們常常面臨這樣的問題:為什么選擇 Elasticsearch(ES)?它究竟解決了什么痛點?又是否真的適合當前的業務場景?

要回答這些問題,不能僅憑“別人用了都說好”,而應從兩個維度深入思考:

  1. 傳統數據庫的局限性
  2. Elasticsearch 的核心優勢

唯有理解“為何而用”,才能真正做到“用之有效”。


一、傳統數據庫的瓶頸:當數據量成為負擔

隨著業務發展,數據量迅速增長,傳統關系型數據庫(如 MySQL、PostgreSQL)在面對海量數據時逐漸暴露出其固有局限:

1. 千萬級數據下的性能衰減

  • 當單表數據量達到千萬甚至億級時,即使有索引,查詢延遲也會顯著上升。
  • B+樹索引雖高效,但在復雜條件查詢或模糊匹配(如 LIKE '%keyword%')時效率低下。
  • 隨著數據增長,索引體積膨脹,磁盤 I/O 成為瓶頸。

2. 分頁查詢的“深水陷阱”

  • 使用 LIMIT offset, size 實現分頁時,offset 越大,數據庫需要跳過越多記錄,性能急劇下降。
  • 例如:LIMIT 1000000, 20 并非只查20條,而是先掃描前100萬條再取結果,代價高昂。

3. 關聯查詢的擴展難題

  • 多表 JOIN 操作在大數據量下成本極高,尤其跨庫 JOIN 幾乎不可行。
  • 垂直拆分后,傳統 SQL 難以跨節點聚合數據,分布式事務復雜度陡增。

4. 全文檢索能力薄弱

  • 原生全文搜索功能有限(如 MySQL 的 FULLTEXT),不支持復雜的分詞、相關性評分、模糊匹配等高級語義搜索需求。
  • 中文分詞支持差,難以滿足搜索場景下的用戶體驗要求。

二、Elasticsearch 的優勢:為搜索而生的分布式引擎

Elasticsearch 正是在上述背景下應運而生——它不是要取代傳統數據庫,而是在特定場景下提供更優解。其核心優勢體現在以下幾個方面:

1. 倒排索引 + 緩存機制,實現毫秒級響應

  • 采用 倒排索引(Inverted Index) 結構,將“文檔 → 詞項”的映射反轉為“詞項 → 文檔列表”,極大提升關鍵詞檢索速度。
  • 結合 Lucene 的底層優化多級緩存(Query Cache、Request Cache、Filesystem Cache),對高頻查詢實現近乎實時的響應。

2. 分布式架構,天然支持水平擴展

  • 數據自動分片(Sharding)并分布到多個節點,支持 PB 級數據存儲。
  • 增加節點即可線性提升查詢吞吐與寫入能力,輕松應對高并發場景。

3. 開箱即用的 RESTful API,開發友好

  • 提供標準 HTTP 接口,支持 JSON 格式交互,無需驅動即可集成。
  • 支持多種客戶端(Java、Python、Node.js 等),學習成本低,上手快。

4. 強大的全文檢索與相關性計算

  • 內置豐富分析器(Analyzer),支持中文分詞(如 IK、jieba)、拼音、同義詞擴展等。
  • 基于 TF-IDF 或 BM25 算法計算文檔相關性得分(_score),實現智能排序。

5. 實時性與近實時搜索(NRT)

  • 數據寫入后通常在 1 秒內即可被搜索到,滿足大多數業務對“實時可見”的需求。

6. 多樣化應用場景支持

  • 不僅限于搜索,還可用于:
    • 日志分析(ELK Stack)
    • 指標監控
    • 數據聚合與報表
    • 推薦系統中的特征檢索
    • 元數據管理與數據發現(如 OpenMetadata 背后依賴 ES)

三、結語:選型的本質是權衡

Elasticsearch 并非銀彈。它的優勢在于高并發讀、復雜查詢、全文檢索和橫向擴展能力,但也有其短板,例如:

  • 不支持強事務
  • 實時寫入一致性弱于傳統數據庫
  • 數據更新代價較高(近實時而非實時)

因此,真正的技術選型,不是盲目追新,而是理解問題本質,匹配合適工具

正如開篇所言:“用之于手,先明于心。”
只有真正理解了“為什么用 ES”,才能在架構設計中游刃有余,讓技術為業務賦能,而非成為負擔。


深入原理:執簡御繁,溯本求源

一、搜索引擎基本原理

搜索引擎的核心能力在于快速、準確地從海量非結構化或半結構化文本中檢索出相關結果。這一過程的背后,依賴于一套精密協作的底層機制。其基本工作原理主要包括三個關鍵模塊:文本分析(Analysis)索引構建(Indexing)查詢檢索(Search)

1. 文本分析(Text Analysis):從文本到詞條

在數據被索引之前,首先需要經過 文本分析模塊 的處理。該模塊負責將原始文本(如文檔內容、字段值等)轉換為具有實際語義意義的 詞條(Terms/Tokens),這一過程通常包括:

  • 分詞(Tokenization):將連續文本切分為獨立的詞項。例如,中文可能使用 IK、jieba 等分詞器進行切分。
  • 標準化(Normalization):統一大小寫、去除標點、處理全角/半角字符等。
  • 詞干提取或詞形還原(Stemming/Lemmatization):將單詞還原為其詞根形式(如 “running” → “run”),提升召回率。

? 文本分析的結果直接影響搜索的準確性和召回率。不同的字段可以配置不同的分析器,以滿足精確匹配、模糊搜索等多樣化需求。


2. 索引構建:倒排索引是核心

經過分析后的詞條,由 索引存儲模塊 負責組織并寫入索引結構中。搜索引擎區別于傳統數據庫的關鍵在于其采用 倒排索引(Inverted Index) 作為核心數據結構。

什么是倒排索引?

傳統數據庫使用“文檔 → 詞項”的正向映射(如:文檔1包含“搜索 引擎”),而倒排索引則構建“詞項 → 文檔列表”的反向映射:

Term(詞條)Document IDs(文檔ID)
搜索[1, 3, 5]
引擎[1, 2]
Elasticsearch[2, 4]

當用戶搜索“搜索引擎”時,系統只需查找“搜索”和“引擎”對應的文檔列表,取其交集 [1],即可快速定位匹配文檔。

倒排索引的優勢
  • 避免全表掃描,極大提升查詢效率。
  • 支持復雜的布爾查詢(AND/OR/NOT)、短語匹配、模糊搜索等高級功能。
  • 結合 TF-IDFBM25 算法,可對結果進行相關性評分排序。

3. 數據采集與寫入流程

數據采集模塊(或稱為數據攝入模塊)負責從各種數據源(如數據庫、日志文件、API 接口等)抽取原始數據,并將其傳遞給索引模塊。整個寫入流程通常包括:

  1. 數據抽取(Extract)
  2. 文本分析(Analyze)
  3. 構建倒排索引結構
  4. 寫入存儲(通常基于 Lucene 的 Segment 機制)
  5. 可選:寫入副本、刷新(refresh)以支持近實時搜索

? Elasticsearch 在此基礎上實現了分布式索引機制,將數據自動分片(Shard)并分布到多個節點,進一步提升了系統的可擴展性與容錯能力。


4. 查詢與檢索:高效召回與排序

當用戶發起查詢請求時,搜索引擎會:

  • 對查詢語句進行同樣的文本分析;
  • 在倒排索引中查找匹配的詞條;
  • 獲取對應的文檔列表;
  • 計算相關性得分(_score);
  • 返回排序后的結果。

整個過程通常在毫秒級完成,即使面對億級數據也能保持高性能。


總結

搜索引擎的基本原理可概括為:

“分析為基,倒排為核,索引為器,檢索為用。”

通過文本分析將非結構化信息轉化為可索引的詞條,再利用倒排索引實現“以詞查文”的高效反向查找,最終達成快速、精準的全文檢索能力。這也是 Elasticsearch 能在海量數據場景下脫穎而出的根本原因。


后續待補充

二、ES 索引分片

1. ES 集群

2. 索引分片機制

3. 索引分片恢復機制

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

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

相關文章

《我是如何用C語言寫工控系統的漏洞和Bug》連載(1)內容大綱

第一部分:導論與基礎 第1章 引言 1.1 工控系統的獨特性和重要性 實時性、可靠性、長生命周期的要求與IT系統的差異:后果不再是信息泄露,而是物理世界的中斷與破壞 1.2 為什么C語言依然是工控領域的主流? 性能、底層硬件操作、歷史…

.Net程序員就業現狀以及學習路線圖(三)

一、.Net程序員就業現狀分析 1. 市場需求與薪資水平 ?市場需求兩極分化?:2025年數據顯示,.Net開發崗位全國占比約0.009%,主要集中在深圳、上海等一線城市 2 3。高端崗位(云原生/AI集成方向)年薪可達36-60萬&#xff…

云計算學習100天-第40天 -普羅米修斯1

目錄 Prometheus 概述—— 安裝prometheus 案例 環境說明 實驗步驟 一、prometheus服務器配置時間同步 二、安裝Prometheus服務器 配置文件說明 三、編寫服務啟動文件并啟動服務 四、訪問web頁面 Prometheus 概述—— Prometheus是一個開源系統監控和警報工具包&a…

高效文本處理:cut、sort、uniq 和 tr 命令詳解與實戰

前言 🔪 一、cut —— 按列或字符截取 常用選項: 示例: 🔄 二、sort —— 排序(默認按行首字符升序) 常用選項: 示例: 🧼 三、uniq —— 去除連續重復行 常用選項…

時序數據庫選型指南:Apache IoTDB為何成為工業物聯網首選?

引言:時序數據管理的時代挑戰 隨著工業4.0和物聯網技術的快速發展,全球時序數據呈現爆炸式增長。據IDC預測,到2025年,全球物聯網設備產生的數據量將達到79.4ZB,其中超過60%為時序數據。這類數據具有顯著特征&#xff…

Ubuntu查看開機以來修改的文件

獲取本次開機時間 uptime -s獲取開機時間之后修改的文件 find /home -type f -newermt "2025-09-03 18:10:12"解讀:-type f意為只查找類型為“普通文件”(file),不包括目錄、鏈接等。newermt 代表“修改時間比指定時間新…

差分隱私在運營指標:ABP 的 DP 計數器與噪聲預算

🚦 差分隱私在運營指標:ABP 的 DP 計數器與噪聲預算 📚 目錄🚦 差分隱私在運營指標:ABP 的 DP 計數器與噪聲預算0. TL;DR 🚀📈 一圖看懂(寫入→發布→預算→加噪)1. 背景…

洛谷 P1077 [NOIP 2012 普及組] 擺花-普及-

P1077 [NOIP 2012 普及組] 擺花 題目描述 小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共 mmm 盆。通過調查顧客的喜好,小明列出了顧客最喜歡的 nnn 種花,從 111 到 nnn 標號。為了在門口展出更多種花&…

時序數據庫選型指南:為何Apache IoTDB成為工業物聯網首選

引言:時序數據管理的挑戰與機遇 在工業4.0與物聯網技術深度融合的今天,全球設備產生的時序數據量正以指數級增長。據IDC預測,到2025年物聯網設備產生的數據將達79.4ZB,其中60%為時序數據。這類數據具有高頻采集(毫秒級…

【C++】C++入門—(中)

前言:上一篇文章我們介紹了C入門的一些基礎的語法,將了命名空間,缺省參數等。這篇文章我們就來介紹剩余的語法。 文章目錄一,函數重載二,引用2.1引用的概念和定義2.2引用的特性2.3引用的引用場景2.3.1做函數形參&#…

嵌入式Linux驅動開發:i.MX6ULL按鍵中斷驅動(非阻塞IO)

嵌入式Linux驅動開發:i.MX6ULL按鍵中斷驅動(非阻塞IO) 概述 本文檔詳細介紹了在i.MX6ULL開發板上實現按鍵中斷驅動的完整過程。該驅動程序實現了非阻塞IO操作,允許用戶空間應用程序通過poll系統調用高效地監控按鍵狀態變化&…

從 @Schedule 到 XXL-JOB:分布式定時任務的演進與實踐

從Schedule到XXL-JOB:分布式定時任務的演進與實踐 在分布式系統中,定時任務是常見需求(如數據備份、報表生成、緩存刷新等)。Spring框架的Schedule注解雖簡單易用,但在集群環境下存在明顯局限;而XXL-JOB作為…

阿里云營業執照OCR接口的PHP實現與技術解析:從簽名機制到企業級應用

一、阿里云營業執照OCR接口的核心技術架構 阿里云OCR服務基于深度學習模型和大規模數據訓練,針對中國營業執照的版式特征(如統一社會信用代碼位置、企業名稱排版、經營范圍換行規則等)進行了專項優化,識別準確率可達98%以上。其接口調用遵循RESTful API設計規范,采用HMAC…

AI人工智能大模型應用如何落地

AI人工智能大模型應用落地需要經過以下步驟: 明確應用場景和目標:首先需要明確AI大模型在哪個領域、解決什么問題。例如,在智能客服領域,AI大模型可以用于提高客戶服務的效率和質量;在醫學領域,AI大模型可以…

手寫Muduo網絡庫核心代碼2--Poller、EPollPoller詳細講解

Poller抽象層代碼Muduo 網絡庫中的 Poller 抽象層是其事件驅動模型的核心組件之一,負責統一封裝不同 I/O 復用機制(如 epoll、poll),實現事件監聽與分發。Poller 抽象層的作用統一 I/O 復用接口Poller 作為抽象基類,定…

基于MCP架構的OpenWeather API服務端設計與實現

隨著微服務和模塊化架構的發展,越來越多的系統傾向于采用可插拔、高內聚的設計模式。MCP(Modular, Collaborative,Pluggable)架構正是這樣一種強調模塊化、協作性和擴展性的設計思想。它允許開發者以“組件”方式組合功能,提升系統的靈活性與可維護性。 …

從“疊加”到“重疊”:Overlay 與 Overlap 雙引擎驅動技術性能優化

在技術領域,“Overlay”和“Overlap”常因拼寫相似被混淆,但二者實則代表兩種截然不同的優化邏輯:Overlay 是“主動構建分層結構”,通過資源復用與隔離提升效率;Overlap 是“讓耗時環節時間交叉”,通過并行…

【Vue2 ?】 Vue2 入門之旅(六):指令與過濾器

前一篇我們學習了組件化開發。本篇將介紹 指令與過濾器&#xff0c;這是 Vue 模板語法的重要擴展&#xff0c;讓頁面渲染更加靈活。 目錄 常見內置指令自定義指令過濾器小結 常見內置指令 Vue 提供了豐富的內置指令&#xff0c;常見的有&#xff1a; <div id"app&qu…

【隨筆】【Debian】【ArchLinux】基于Debian和ArchLinux的ISO鏡像和虛擬機VM的系統鏡像獲取安裝

一、Debian Debian -- Debian 全球鏡像站 阿里巴巴開源鏡像站-OPSX鏡像站-阿里云開發者社區 debian-cd-current-amd64-iso-cd安裝包下載_開源鏡像站-阿里云 清華源&#xff1a; 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror USTC Open Source Software Mirror 二、…

如何用 Kotlin 在 Android 手機開發一個文字游戲,并加入付費機制?

Kotlin 開發 Android 文字游戲基礎框架使用 Android Studio 創建項目&#xff0c;選擇 Kotlin 作為主要語言。基礎游戲邏輯可通過狀態機和文本解析實現&#xff1a;class GameEngine {private var currentScene: Scene loadStartingScene()fun processCommand(input: String):…