【Elasticsearch】更新操作原理

Elasticsearch 的更新操作(如 `_update` 和 `_update_by_query`)在底層實現上有一些復雜的原理,這些原理涉及到 Elasticsearch 的數據存儲機制、索引機制以及事務日志(Translog)的使用。以下是 Elasticsearch 更新操作的主要原理:

1. 文檔的存儲和索引

在 Elasticsearch 中,文檔是以 JSON 格式存儲的,并且每個文檔都有一個唯一的 `_id`。這些文檔被存儲在索引中,索引由多個分片(Shards)組成,每個分片是一個獨立的 Lucene 索引。

2. 更新操作的基本流程

當執行更新操作時,Elasticsearch 會按照以下步驟處理:

a. 查找文檔

- Elasticsearch 首先根據提供的 `_id` 在索引中查找目標文檔。

- 如果文檔不存在,更新操作的行為取決于是否設置了 `doc_as_upsert` 參數:

? - 如果設置了 `doc_as_upsert`,則會插入一個新的文檔。

? - 如果沒有設置 `doc_as_upsert`,則更新操作會失敗。

b. 讀取舊文檔

- 如果文檔存在,Elasticsearch 會讀取舊文檔的內容。

c. 應用更新

- Elasticsearch 將更新內容(如通過 `_update` API 提供的 `doc` 部分)應用到舊文檔上。

- 如果是部分更新(如 `_update`),Elasticsearch 會將新的字段值合并到舊文檔中。

- 如果是全量替換(如 `PUT`),Elasticsearch 會用新的 JSON 數據完全替換舊文檔。

d. 寫入新文檔

- 更新后的文檔會被重新索引,生成一個新的 Lucene segment。

- 舊文檔會被標記為刪除(但不會立即從磁盤中刪除)。

e. 事務日志(Translog)

- 更新操作會被記錄在事務日志(Translog)中,以確保操作的持久性。

- 事務日志是一個持久化的日志文件,用于記錄所有對索引的寫操作(包括插入、更新和刪除)。

f. 刷新和提交

- 當事務日志達到一定大小或時間間隔時,Elasticsearch 會執行 `_flush` 操作:

? - 將內存中的數據和事務日志中的操作持久化到磁盤。

? - 清空事務日志。

- 在 `_flush` 操作之前,Elasticsearch 會先執行 `_refresh` 操作,確保數據在文件系統緩存中可用,從而可以被搜索到。

3. 并發控制

Elasticsearch 使用樂觀并發控制機制來處理并發更新:

- 每個文檔都有一個序列號(`seq_no`)和一個主版本號(`primary_term`)。

- 在更新操作時,可以指定 `if_seq_no` 和 `if_primary_term` 參數,以確保只有在文檔的序列號和主版本號匹配時才執行更新。

- 如果序列號或主版本號不匹配,更新操作會失敗,從而避免覆蓋其他用戶的更改。

4. 批量更新

對于批量更新操作(如 `_update_by_query`),Elasticsearch 會按照以下步驟處理:

- 執行查詢,找到需要更新的文檔集合。

- 對每個文檔應用更新邏輯。

- 逐個更新文檔,每個文檔的更新過程與單個文檔更新類似。

- `_update_by_query` 操作會使用內部的重試機制來處理并發沖突。

5. 性能優化

- 內存管理:Elasticsearch 會將更新操作的結果暫存到內存中,以提高性能。

- 批量處理:對于批量更新操作,Elasticsearch 會盡量減少對磁盤的寫入次數,通過批量處理來優化性能。

- 異步處理:某些更新操作(如 `_flush` 和 `_refresh`)是異步執行的,以減少對請求的阻塞。

總結

Elasticsearch 的更新操作涉及多個步驟,包括查找文檔、讀取舊文檔、應用更新、寫入新文檔、記錄事務日志、刷新和提交等。通過這些機制,Elasticsearch 確保了更新操作的高效性、一致性和持久性。同時,通過樂觀并發控制機制,Elasticsearch 能夠有效處理并發更新,避免數據沖突。

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

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

相關文章

【C++】紅黑樹的實現

目錄 前言 一、紅黑樹的概念 二、紅黑樹的實現 三、紅黑樹的查找 四、紅黑樹的驗證 五、紅黑樹的刪除 總結 前言 本文講解紅黑樹,主要講解插入部分的實現,建議在理解了AVL樹的旋轉后再來學習紅黑樹,因為紅黑樹也涉及旋轉,并…

IPv4地址的主要配置項介紹

1. IPv4 主要配置項 (1) IP 地址(IP Address) 作用:唯一標識網絡中的設備(如 192.168.1.100)。分類: 靜態 IP:手動配置,適用于服務器、打印機等固定設備。動態 IP(DHCP…

nginx 基于IP和用戶的訪問

nginx的下載 yum install nginx.x86_64 -y 啟動服務 systemctl enable --now nginx.service 查看服務目錄 [rootwebserver ~]# rpm -ql nginx /usr/bin/nginx-upgrade /usr/lib/systemd/system/nginx.service /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx…

Debian操作系統全面解析:從起源到應用

Debian 操作系統全面解析:從起源到應用 在開源操作系統的廣袤天地中,Debian 占據著極為重要的地位。它憑借自身諸多突出特性,吸引了全球無數用戶與開發者的目光,從個人桌面應用到大型服務器部署,從普通辦公場景到專業科研領域,Debian 都展現出了強大的適應性與可靠性,為…

【springMVC】springMVC學習系列一:springMVC的組件

系列文章目錄 前言 spring mvc 它解決了什么問題呢? 1.URL映射 2. 表單參數映射 3. 調用目標Control 4. 數據模型映射 5. 視圖解析 6. 異常處理 上述解決在spring mvc 中都體現在如下組件當中 HandlerMapping: url與控制器的映謝 HandlerAdapter&#…

【Vue Vapor Mode :技術突破與性能優化的可能性】

Vue Vapor Mode :技術突破與性能優化的可能性 前言 作為一名有著Vue 2經驗和Vue 3經驗的開發者,你一定深刻體會過Vue從Options API到Composition API的演進,也感受過Vue 3在性能上相比Vue 2的顯著提升。現在,Vue團隊正在開發一個…

MySQL數據庫零基礎入門教程:從安裝配置到數據查詢全掌握【MySQL系列】

第1章:認識MySQL 1.1 什么是MySQL? MySQL是一種開源的關系型數據庫管理系統(RDBMS),由瑞典MySQL AB公司開發,現由Oracle公司維護。它使用結構化查詢語言(SQL)進行數據庫的管理和操…

AXI3、AXI4 和 AXI5 的詳細差異對比

AXI3、AXI4 和 AXI5 的詳細差異對比 摘要:AXI (Advanced eXtensible Interface) 是 ARM 公司提出的高性能片上總線協議,廣泛用于 SoC (System on Chip) 設計中,以實現高效的數據傳輸和系統互連。AXI 協議隨著版本的迭代不斷演進,從…

向量數據庫該如何選擇?Milvus 、ES、OpenSearch 快速對比:向量搜索能力與智能檢索引擎的應用前景

? 1.milvus VS ES Milvus 的亮點 功能性:Milvus 不僅支持基本的向量相似性搜索,還支持稀疏向量、批量向量、過濾搜索和混合搜索功能等高級功能。 靈活性:Milvus 支持多種部署模式和多個 SDK,所有這些都在一個強大的集成生態系…

SQL進階之旅 Day 4:子查詢與臨時表優化

文章標題 【SQL進階之旅 Day 4】子查詢與臨時表優化 文章內容 開篇:SQL進階之旅的第4天 在“SQL進階之旅”系列中,第4天的主題是子查詢與臨時表優化。這是SQL開發中不可或缺的一部分,尤其在處理復雜查詢時,合理使用子查詢和臨…

Python學習(2) ----- Python的類型

在 Python 中,一切皆對象,每個對象都有類型。下面是 Python 中的常見內置類型分類和示例: 🟡 1. 數字類型(Numeric Types) 類型說明示例int整數5, -42float浮點數3.14, -0.5complex復數1 2j a 10 …

跨協議協同智造新實踐:DeviceNet-EtherCAT網關驅動汽車焊接裝配效能躍遷

在汽車制造領域,機器人協作對于提升生產效率與產品質量至關重要。焊接、裝配等關鍵環節,需要機器人與各類設備緊密配合。JH-DVN-ECT疆鴻智能的devicenet從站轉ethercat主站協議網關,成為實現這一高效協作的得力助手,尤其是在連接歐…

nginx之proxy_buffering的作用

Nginx 的緩沖機制是為了讓后端能更快釋放資源,而不是卡在慢客戶端上,從而提升整體性能和并發能力。 現實中客戶端和后端服務器之間的傳輸速率可能差異很大。Nginx 的緩沖機制正是為了解決這個不匹配問題。 假設沒有緩沖(即 proxy_buffering…

數據庫相關問題

1.保留字 1.1錯誤案例(2025/5/27) 報錯: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near condition, sell…

GO 語言進階之 進程 OS與 編碼,數據格式轉換

更多個人筆記見: github個人筆記倉庫 gitee 個人筆記倉庫 個人學習,學習過程中還會不斷補充~ (后續會更新在github上) 文章目錄 進程信息OS操作基本例子 編碼相關HASH 哈希Base64 encoding 基礎64編碼 數據格式轉換和處…

如何用Spring Cache實現對Redis的抽象

我們在進行Java項目開發時候,經常會用到Redis緩存例如數據庫里的一些信息、手機驗證碼之類的,正常寫法就會像去連mysql一樣,這種硬編碼的方式肯定是非常不合適的。 Autowireprivate UserMapper userMapper;Autowireprivate StringCommand str…

CMake指令:file()

目錄 1.簡介 2.常用子命令(COMMAND) 2.1.COPY - 復制文件或目錄 2.2.RENAME - 重命名文件或目錄 2.3.REMOVE - 刪除文件或目錄 2.4.MAKE_DIRECTORY - 創建目錄 2.5.READ - 讀取文件內容 2.6.WRITE - 寫入文件內容 2.7.GLOB - 按模式匹配文件 2…

使用VuePress開發日志

結合官方教程,補充一些細節。 快速上手 | VuePress中文文檔 | VuePress中文網 VuePress使用步驟 創建并進入一個新目錄 mkdir vuepress-starter && cd vuepress-starter使用你喜歡的包管理器進行初始化 yarn init # npm init將 VuePress 安裝為本地依賴 …

隨手記錄7

2025年5月26日~2025年6月01日 周一:沒做 周二:芹菜炒雞蛋香腸 周三: 周四: 周五: 周六: 周日:

【無標題】使用JEasyOpc開發OPCDA采集中間件

使用JEasyOpc開發OPCDA采集中間件 1.JEasyOpc下載2.修改JEasyOpc源碼及打包安裝3.Pom 引入jeasy2.3.2.jar4.maven pom 配置打包5.cmd執行(手動指定 main主程序入口)6.EXE4J打包jar包,生成exe可執行文件 1.JEasyOpc下載 jeasyopc源碼下載&…