1.1 Elasticsearch-倒排索引 5 分钟图解

在这里插入图片描述
1.1 Elasticsearch-倒排索引 5 分钟图解
(接上文《从 0 到 1 搭建日志检索平台》)

一图胜千言,先上图,再拆解。
把下面 5 张脑图连起来,就是倒排索引的“一生”——从文档进站到关键词秒回,全程 5 分钟看懂。

图 1:正排 vs 倒排——把“书”撕成“字条”
正排索引:
doc → [term₁, term₂ …]
就像把每本书的目录复印下来,想找“Elasticsearch”必须逐本翻。

倒排索引:
term → [doc₁, doc₂ …]
把书撕成字条,按字母顺序插回卡片柜;给定关键词,直接抽出所有出现过它的纸条。Elasticsearch 的检索速度之所以快,本质上是“空间换时间”——磁盘多存一张大表,换来内存里 O(1) 的定位。

图 2:Analyzer 三段式——字符过滤器、分词器、Token 过滤器
文档进站第一步:Analyzer 流水线。

  1. 字符过滤器:去 HTML 标签、统一全半角。
  2. 分词器:按空格、标点、中文词典切词。
  3. Token 过滤器:小写化、去停用词、同义词注入。
    输出:Token Stream(词元队列),每个 token 带着原始位置、偏移量、payload。

图 3:倒排表 + Term Dictionary + Term Index——三层跳表
内存放不下全部 term,ES 把词典拆成两层:
Term Dictionary:有序 term 数组,磁盘常驻,FST 压缩前缀。
Term Index:对 Dictionary 再建“前缀树”索引,常驻内存,前缀匹配一次定位 4 KB Block。
Posting List:每个 term 对应的 docId 列表,采用 RoaringBitmap 压缩,64 k 一个 Container,既压缩又支持快速位运算。
三层结构保证:
• 内存只放“前缀树”,几十 MB 即可索引 TB 级数据;
• 磁盘连续读,4 KB Block 直接入缓存;
• 倒排链交、并、差集用位运算,百万 doc 毫秒级。

图 4:Segment 不可变——LSM-Tree 的“只追加”哲学
Elasticsearch 每次 refresh 生成一个新 segment(Lucene 倒排表文件组),文件一旦写死就不可更改。
好处:

  1. 并发无锁,查询线程访问旧 segment,写入线程生成新 segment;
  2. 缓存友好,倒排表、列存 DocValues 均可压缩为紧凑数组;
  3. 版本隔离,快照恢复直接拷贝文件即可。
    代价:删除只是打“墓碑”,更新=删除+插入,后台 merge 线程定期把多路 segment 归并,回收垃圾。

图 5:查询路径——从 keyword 到 doc 只需 3 次指针跳跃

  1. 关键词先走 Term Index 前缀树,定位到 Dictionary Block;
  2. 把 Block 载入内存,二分找到目标 term,拿到指向 Posting List 的“文件指针 + 偏移”;
  3. 读 Posting RoaringBitmap,交/并/差后得到 docId 结果集,再走正排拿 _source。
    全程零随机写、少量随机读、大量顺序读,磁盘 I/O 被压到最低。

5 分钟回顾

  1. 倒排 = 撕书成条,关键词→文档列表;
  2. 三段式 Analyzer 把文本变成标准 token;
  3. FST + RoaringBitmap 让词典和倒排链都压缩到可常驻内存;
  4. 不可变 segment 实现无锁并发,后台 merge 保持碎片率 < 10%;
  5. 查询三次指针跳跃,毫秒级返回。

下一节,我们把这张图落地:亲手写一条 PUT 请求,看 Lucene 如何在磁盘上生成 .tim、.tip、.doc、.pos 四件套,并用 Luke 打开验证。
更多技术文章见公众号: 大城市小农民

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔丹搞IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值