当前位置: 首页 > news >正文

Elasticsearch介绍

Elasticsearch(ES)的工作原理可以高度概括为“分布式、倒排索引、近实时搜索”

1. 核心基石:倒排索引(Inverted Index)

这是ES搜索飞快的根本原因。不同于传统数据库(正排索引:ID -> 内容),倒排索引是内容 -> ID

  • 例子:你有三篇文档。

    • 文档1:"苹果好吃"

    • 文档2:"香蕉好吃"

    • 文档3:"苹果营养"

  • 倒排索引构建

    • 苹果-> [文档1, 文档3]

    • 好吃-> [文档1, 文档2]

    • 营养-> [文档3]

  • 查询时:当你搜索“苹果”,ES直接命中索引,瞬间返回文档1和3,不需要扫描所有数据


2. 数据写入流程(Index / Write)

ES写入并不是直接写磁盘,而是走Memory Buffer -> Filesystem Cache -> Segment -> Commit的路线,这是它近实时(Near Real-Time)的关键。

  1. 写入内存缓冲区(Buffer):数据到达时,先写入Transaction Log(防止宕机丢数据),同时将原始JSON文档放入内存Buffer中,此时数据不可被搜索

  2. Refresh(刷新):默认每隔1秒,ES会执行Refresh操作,将Buffer中的数据冲刷到操作系统的文件缓存(Filesystem Cache)中,并生成一个新的分段(Segment)

    • 关键点:此时数据已经可以搜索,但尚未落盘(Fsync)。这就是ES被称为“近实时”(延迟1秒)的原因。

  3. Flush(冲刷):当Translog太大或每隔30分钟,ES会执行Flush。将所有内存中的Segment刷入磁盘,并清空Translog。此时数据才算真正持久化。


3. 数据读取流程(Search / Read)

ES的读取分为Query Phase(查询阶段)Fetch Phase(取回阶段),且利用分片(Shard)并行工作。

假设你有3个节点,索引被分为2个主分片(Primary)和2个副本分片(Replica)。

  • Query Phase:协调节点(Coordinating Node)收到搜索请求,会将请求广播给所有分片(主或副本)。每个分片在本地利用倒排索引找到匹配的文档ID,但只返回文档ID和评分给协调节点。协调节点对全局所有ID进行合并排序。

  • Fetch Phase:协调节点根据排好序的ID列表,再次请求各个分片,获取文档的完整原始_source数据,返回给客户端。


4. 核心底层数据结构

为了让倒排索引更快,ES使用了以下核心编码技术:

  • FST(Finite State Transducer,有限状态转换器):用于存储词典(Term Dictionary),内存占用极小,查询速度极快(O(1)级别)。

  • 跳跃表(Skip List):用于在多个Posting List(文档ID列表)之间快速求交集(AND)或并集(OR)。

  • BKD Tree:用于数值类型地理位置的范围查询(Range Query),而非倒排索引。


5. 分布式架构原理(去中心化)

  • Master Node(主节点):只负责管理集群状态(创建索引、分配分片),不参与数据读写,防止脑裂。

  • 数据节点(Data Node):负责存储数据和执行实际的搜索计算。

  • 路由算法:当你写入一条数据时,ES通过公式shard_num = hash(_routing) % number_of_primary_shards决定该数据去哪个分片,保证同一文档永远在固定分片,方便查询时定位。


6. 你必须要知道的“坑”(面试重点)

  • 删除不是真删除:ES的删除只是给文档打上deleted标记,在Segment Merge时才会物理清除,所以频繁删除会导致性能下降。

  • Segment是不可变的:一旦写磁盘就永不改变。ES通过后台Merge进程将多个小Segment合并成大Segment,释放被标记删除的空间,这也是写性能高的原因(没有锁竞争)。


一句话总结

Elasticsearch 通过“倒排索引”实现快速匹配,通过“内存Buffer + 每秒Refresh”实现近实时搜索,通过“分片 + 副本”实现高可用和水平扩展,通过“Segment合并”实现后台异步持久化。

http://www.jsqmd.com/news/1078685/

相关文章:

  • IntelliJ IDEA离线安装全攻略(含JetBrains Toolbox替代方案):无网络环境下的3种纯净部署路径,企业IT管理员已批量验证
  • AI 大模型 API 调用报错怎么查?先从错误码看起
  • 最新用 AI 学量化表达,别脱离 Python 和 API 流程
  • RAG的另类思考
  • 计算机岗位100篇___大模型应用开发工程师
  • Leader 考核实习生:“你怎么配置 Claude Code?” 我挠头:“多写 Skills?” 她摇头:“明天别来了!”
  • HIP 编译器优化详解,ROCm 7.x 如何提升大模型推理效率
  • 最新量化开发提效,AI 先检查代码逻辑和流程缺口
  • API 接口可达性检测指南:Postman 能通、全国用户不通的真相
  • AI会成为跟编辑器一样新的一个中间层
  • aeneas:音频和文字自动对齐,支持38种语言
  • Redis 缓存穿透与雪崩问题解决方案
  • 【设计文档+源码+数据集】基于YOLOv8+Flask的罂粟识别系统
  • 小chunk和大段落,SproutRAG用注意力组起来了
  • 最新量化工具怎么选,先看自己的能力短板
  • 河南省人工智能专业综合实力排名2026 最新
  • 构建个人数字身份标识系统:从jfm608实践看统一管理与安全防护
  • 有限域与模逆元:破解Diffie-Hellman的基础数学
  • 【共创季稿事节】 鸿蒙原生 ArkTS 布局探秘:Scroll + Snap 分页对齐滚动深度解析
  • 关于的将本地项目发布到互联网上的相关的内容及链接,内容不全面,供个人用
  • 深入理解 Java 反射机制:赋予程序“自省”与“动态”的能力
  • 社区贡献者故事,我在 Github 上为 ROCm 生态修复的那些 Bug
  • Transformer架构拆解:从张量形状到可运行代码的实操指南
  • 【存档】MTP技术理论学习路线
  • 五大热门工科专业,90%的家长都在用错误的方式排序
  • 三步构建缠论量化系统:从理论到实战的完整指南
  • SEO搜索引擎优化深度指南,从0到1完全解析
  • 502/503 与源站过载:CDN 绿、源站红时的判断与修复路径
  • 解锁养老新方式:AI 当私人医生,守护长辈健康
  • I2C通信中的ACK与NACK详解