es 里的Filesystem Cache 理解

文章目錄

      • 背景
        • 問題1,Filesystem Cache 里放的是啥
        • 問題2,哪些查詢它們會受益于文件系統緩存
        • 問題3 查詢分析

背景

對于es 優化來說常常看到會有一條結論給,給 JVM Heap 最多不超過物理內存的 50%,且不要超過 31GB(避免壓縮指針失效)。剩下的內存盡量留給操作系統做文件系統緩存。es查詢重度依賴
Filesystem Cache。

問題1,Filesystem Cache 里放的是啥

文件系統緩存保存的是什么?
文件系統緩存由操作系統管理,而不是 Elasticsearch。
它緩存的是從磁盤讀取的文件內容,比如 Lucene 構建的倒排索引文件(segment files)。
這些文件包括:
.fnm (field names)
.tim / .tip (term index and dictionary)
.doc / .pos / .pay (document values, positions, payloads)
.dvd / .dvm (doc values)
等等。
這些數據構成了 Elasticsearch 實現快速全文檢索的核心結構 —— 倒排索引(Inverted Index)

問題2,哪些查詢它們會受益于文件系統緩存

以下是一些典型的查詢類型和場景,它們會受益于文件系統緩存:
🔹1. Term 查詢 / Term-level 查詢
示例:精確匹配某個字段值

{"query": {"term": {"status": "published"}}
}

解釋:
term 查詢會查找包含特定 term 的文檔。
Lucene 使用 .tim(Term Index) 和 .tip(Term Dictionary) 文件快速定位 term。
如果這些文件已經在文件系統緩存中,則完全不需要磁盤 I/O。
🔹2. Terms 查詢
示例:匹配多個枚舉值

{"query": {"terms": {"category": ["books", "electronics", "movies"]}}
}

解釋:
多個 term 的組合查詢。
每個 term 都會在倒排索引中查找對應的文檔列表。
只要 .tim, .tip, .doc, .pos 等文件都在緩存中,性能非常高。
🔹3. Range 查詢(數值或時間范圍)
示例:查詢某段時間內的訂單

{"query": {"range": {"timestamp": {"gte": "2024-01-01","lt": "2025-01-01"}}}
}

解釋:
如果字段是 keyword 或已經構建了 doc values(.dvm, .dvd),Lucene 會利用排序結構進行快速范圍掃描。
如果相關 segment 的 .dvd 文件在緩存中,范圍查詢非常高效。
🔹4. Filter 上下文中的查詢(Query in Filter Context)
示例:
{

  "query": {"bool": {"filter": [{ "term": { "status": "published" } },{ "range": { "price": { "gte": 100, "lt": 500 } } }]}}
}

解釋:
filter 上下文不計算相關度分數,只關心是否匹配。
Lucene 會使用 bitset 來加速 filter 查詢,如果索引文件已在緩存中,速度極快。
filter 查詢非常適合利用緩存,因為結果可重復使用(適合 cache)。
🔹5. 聚合查詢(Aggregations)
示例:按 category 分組統計數量

{"size": 0,"aggs": {"categories": {"terms": { "field": "category.keyword" }}}
}

解釋:
聚合操作需要遍歷大量文檔,讀取字段值。
如果字段是 keyword 類型,Lucene 使用全局序號(global ordinals)和 .gob 文件進行處理。
如果這些文件在緩存中,聚合速度非常快,否則會觸發大量磁盤讀取。
🔹6. Doc value 字段查詢
示例:

{"query": {"range": {"price": {"gte": 100,"lt": 500}}}
}

解釋:
如果 price 字段開啟了 doc_values(默認開啟),Lucene 使用 .dvd 和 .dvm 文件來存儲列式數據。
這些文件會被操作系統緩存在內存中,所以范圍查詢、排序、聚合等都非常快。
🔹7. 前綴查詢(Prefix Query)
示例:

{"query": {"prefix": {"name": "elasti"}}
}
問題3 查詢分析
  • 如果_source 是true的話,要先查系統緩存,找到文檔ID ,再查磁盤找到原始文件
  • 如果返回的是部分字段?
    下面我們詳細解釋每種方式的工作原理。

🔍 一、使用 _source filtering(源過濾)
這是最常見的方法,適用于你只想返回原始文檔中的某些字段。

示例:
json

{"_source": {"includes": ["title", "author"]},"query": {"term": {"status": "published"}}
}

工作流程:
Elasticsearch 仍然會從 .source 文件中加載整個原始文檔。
然后在內存中進行字段過濾,只保留你需要的字段。
最終只返回這些字段給客戶端。
💡 關鍵點:
即使你只要幾個字段,Elasticsearch 仍需要加載完整 _source。
如果 .source 文件不在文件系統緩存中,就會觸發磁盤 I/O。
所以:雖然減少了網絡傳輸量,但沒有減少磁盤訪問。
🔍 二、使用 store: true 的 stored fields(存儲字段)
如果你只需要少量字段,并希望快速獲取它們而不需要加載整個 _source,可以在 mapping 中為某些字段設置 store: true。

示例 mapping:
json

{"mappings": {"properties": {"title": { "type": "text", "store": true },"author": { "type": "keyword", "store": true },"content": { "type": "text" }  // 默認不存儲}}
}

查詢時:
json

{"stored_fields": ["title", "author"],"source": false,"query": {"term": {"status": "published"}}
}

工作流程:
Elasticsearch 從 Lucene 的 .fdt / .fdx 文件中讀取存儲字段(stored fields)。
這些文件是獨立于 _source 的。
如果這些文件在文件系統緩存中,查詢速度非常快。
💡 關鍵點:
沒有加載 _source,所以節省了內存和磁盤 I/O。
更適合“高頻訪問 + 字段少”的場景。
缺點是:占用更多磁盤空間 ,因為每個字段都單獨存儲了一份。
🔍 三、使用 docvalue_fields(適合聚合/排序)
對于 keyword 類型或數值類型字段,Lucene 使用 doc values 來支持高效的排序和聚合。

示例:

{"docvalue_fields": ["price", "publish_date"],"source": false,"query": {"term": {"status": "published"}}
}

工作流程:
Elasticsearch 從 .dvd, .dvm 文件中讀取字段值。
這些文件也是列式存儲,非常適合批量讀取。
如果這些文件在緩存中,性能非常高。
💡 關鍵點:
完全不依賴 _source。
對聚合、排序、范圍查詢非常有用。
不適合返回大量文本內容(如文章正文)。

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

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

相關文章

存儲器:DDR和獨立顯卡的GDDR有什么區別?

本文來簡要對比DDR(Double Data Rate SDRAM)和GDDR(Graphics Double Data Rate SDRAM)的區別,重點說明它們在設計、性能和應用上的差異: 1. 設計目標與架構 DDR:通用型DRAM,設計為…

【Electron】electron-vue 借助 element-ui UI 庫助力桌面應用開發

前面文章我們講過 electron 讓可以用 HTML、JS、CSS 開發桌面應用程序。而 electron-vue 是一個結合了 electron 與 vue 的套件。這樣我們就能方便地使用 vue 快速開發桌面應用。但是,vue 只是在 js 這層面做了大量的便捷的操作。對 UI 并未過多涉及。此時如果您在開…

Linux/AndroidOS中進程間的通信線程間的同步 - 消息隊列

本文介紹消息隊列,它允許進程之間以消息的形式交換數據。數據的交換單位是整個消息。 POSIX 消息隊列是引用計數的。只有當所有當前使用隊列的進程都關閉了隊列之后才會對隊列進行標記以便刪除。POSIX 消息有一個關聯的優先級,并且消息之間是嚴格按照優…

深入理解進程與線程、進程池與線程池:企業級開發實戰指南

簡介 并發編程是現代軟件開發的核心能力,而進程與線程、進程池與線程池是實現高效并發的關鍵技術。 本文將從基礎概念出發,深入解析它們的工作原理、優勢及適用場景,并提供Python、Java、C#等主流語言的實戰代碼,幫助開發者掌握企業級并發編程的最佳實踐。 一、進程與線程…

解鎖 LLM 推理速度:深入 FlashAttention 與 PagedAttention 的原理與實踐

寫在前面 大型語言模型 (LLM) 已經滲透到我們數字生活的方方面面,從智能問答、內容創作到代碼輔助,其能力令人驚嘆。然而,驅動這些強大模型的背后,是對計算資源(尤其是 GPU)的巨大需求。在模型推理 (Inference) 階段,即模型實際對外提供服務的階段,速度 (Latency) 和吞…

Go使用Gin寫一個對MySQL的增刪改查服務

首先用SQL創建一個包含id、name屬性的users表 create table users (id int auto_incrementprimary key,name varchar(255) null );查詢所有用戶信息: func queryData(db *sql.DB, w http.ResponseWriter) {rows, err : db.Query("SELECT * FROM users"…

鍵盤彈起導致頁面上移

問題:聊天頁面,如果輸入框設置了adjust-position屬性為true,會導致鍵盤彈起時,整個頁面上移,頂部導航欄也會跟著上移。 我想要的效果:鍵盤彈起時,頁面內容上移,頂部導航欄保持不動 …

機器視覺的手機FPC油墨絲印應用

在現代智能手機制造過程中,精密的組件裝配和質量控制是確保產品性能和用戶體驗的關鍵。其中,柔性印刷電路板(FPC)的油墨絲印工藝尤為關鍵,它不僅影響到電路板的美觀,更直接關系到電路的導電性能和可靠性。而…

ChromeDriverManager的具體用法

ChromeDriverManager 是 webdriver_manager 庫的一部分,它用于自動管理 ChromeDriver 的下載和更新。使用 ChromeDriverManager 可以避免手動下載 ChromeDriver 并匹配系統中安裝的 Chrome 瀏覽器版本。以下是 ChromeDriverManager 的基本用法: 步驟 1…

RPC、gRPC和HTTP的區別

RPC 只是一種屏蔽遠程過程調用的設計,它與HTTP不是對立的,兩者不是一個層面的概念。 RPC底層通信可以使用TCP實現(如Thrift),也可以使用HTTP實現(如gRPC),其本身并無限制。 1. 概念…

安裝Pod網絡插件時pod狀態變為ImagePullBackOff

本文摘自于我的免費專欄《Kubernetes從0到1(持續更新)》請多關注 文章目錄 先看案發現場解決過程如下原因剖析解決方法 先看案發現場 原因是在下載Pod網絡插件的時候pod始終為ImagePullBackOff wget https://raw.githubusercontent.com/coreos/flannel…

藍橋杯第十六屆c組c++題目及個人理解

本篇文章只是部分題目的理解&#xff0c;代碼和思路僅供參考&#xff0c;切勿當成正確答案&#xff0c;歡迎各位小伙伴在評論區與博主交流&#xff01; 題目&#xff1a;2025 題目解析 核心提取 要求的數中至少有1個0、2個2、1個5 代碼展示 #include<iostream> #incl…

使用mermaidchart 顯示graph LR

使用mermaidchart 顯示graph LRMermaid Chart - Create complex, visual diagrams with text. A smarter way of creating diagrams.

基于計算機視覺的試卷答題區表格識別與提取技術

基于計算機視覺的試卷答題區表格識別與提取技術 摘要 本文介紹了一種基于計算機視覺技術的試卷答題區表格識別與提取算法。該算法能夠自動從試卷圖像中定位答題區表格&#xff0c;執行圖像方向矯正&#xff0c;精確識別表格網格線&#xff0c;并提取每個答案單元格。本技術可…

SpringAI實現AI應用-自定義顧問(Advisor)

SpringAI實戰鏈接 1.SpringAl實現AI應用-快速搭建-CSDN博客 2.SpringAI實現AI應用-搭建知識庫-CSDN博客 3.SpringAI實現AI應用-內置顧問-CSDN博客 4.SpringAI實現AI應用-使用redis持久化聊天記憶-CSDN博客 5.SpringAI實現AI應用-自定義顧問&#xff08;Advisor&#xff09…

【HarmonyOS 5】App Linking 應用間跳轉詳解

目錄 什么是 App Linking 使用場景 工作原理 如何開發 1.開通 App Linking 2.確定域名 3.服務端部署 applinking.json 文件 4.AGC綁定域名 5.項目配置 6.組裝聚合鏈接 7.解析聚合鏈接中的參數 其他 如何獲取應用ID 什么是 App Linking App Linking 是一款創建跨…

什么是變量提升?(形象的比喻)

當然&#xff01;可以用幾個生活中的比喻來形象地解釋變量提升&#xff1a; ??1. 書架的占位符?? 想象你有一個書架&#xff0c;但還沒放書。 ? 變量提升&#xff08;var&#xff09;&#xff1a; 你先在書架上貼了一個標簽&#xff08;比如寫“我的書”&#xff09;&…

C++面向對象編程入門:從類與對象說起(一)

C語言是面向過程&#xff0c;關注的是過程&#xff0c;分析出求解問題的步驟&#xff0c;通過函數調用逐步解決問題&#xff0c;而C面向的是對象&#xff0c;關注的是對象&#xff0c;將一件事拆解成多個對象&#xff0c;靠對象之間互交完成。 目錄 類的定義 類的兩種定義 …

uniapp tabBar 中設置“custom“: true 在H5和app中無效解決辦法

uniapp小程序自定義底部tabbar&#xff0c;但是在轉成H5和app時發現"custom": true 無效&#xff0c;原生tabbar會顯示出來 解決辦法如下 在tabbar的list中設置 “visible”:false 代碼如下&#xff1a;"tabBar": {"custom": true,//"cust…

SpringBoot學生操行評分系統源碼設計開發

概述 基于SpringBoot框架開發的學生操行評分系統完整項目&#xff0c;該系統采用主流技術棧開發&#xff0c;包含完善的評分管理功能模塊&#xff0c;是學校管理、教育培訓機構理想的數字化解決方案&#xff0c;非常適合作為設計參考或二次開發基礎項目。 主要內容 5.1 管理…