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.mzph.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 管理…