主题
Elasticsearch 学习路线:从倒排索引到集群运维
按「先理解存和查,再理解写和评分,最后理解聚合、集群与生产」的顺序排列。 生产检查项单独放在 99-生产检查清单,正文讲机制。
学习顺序
L1: ES 怎么存、怎么查
→ 01-架构与核心概念 集群/节点/分片/副本、容量测算
→ 02-倒排索引与分词 Term Dictionary → FST → Posting List、ik 分词
L2: 写入和查询怎么走
→ 03-写入与索引过程 Buffer → Refresh → Segment → Flush/Merge、Translog
→ 04-查询与相关性评分 Query vs Filter、BM25、profile、深分页
L3: 聚合和集群
→ 05-聚合分析 Bucket/Metric/Pipeline、doc_values
→ 06-集群管理与分片 Master 选举、分片分配、磁盘水位、allocation explain
L4: 生产上容易踩什么
→ 07-ES生产踩坑 Master 稳定性、Mapping 爆炸、磁盘只读、深分页、bulk 队列
→ 09-监控指标与告警 队列/堆/磁盘/分片状态、雪崩链、告警与处置顺序
L5: 向量与混合检索
→ 08-ES与AI dense_vector/kNN、semantic_text、RRF、过滤召回旧的
07-性能优化.md已并入07-ES生产踩坑.md;写入/查询调优内容不再单独成篇。
核心链路
写入:Document
→ Coordinating Node 路由
→ Primary Shard:写 Lucene Buffer + Translog(WAL)
→ 同步复制到 Replica Shard
→ Refresh(默认 1s):Buffer → 新 Segment,可搜索但未持久化
→ Flush:Lucene Commit,Segment fsync,Translog 截断
→ 后台 Merge:合并小 Segment,清理删除标记
查询:Query → 各 Shard 检索 → Coordinating Node 归并 → BM25 算分 → 返回ES 最核心的设计是 Segment 不可变 + 后台 Merge:不可变意味着读不需要锁,并发读性能高;代价是更新等于「标记旧文档 + 写新文档」,删除也要等 Merge 才真正回收空间。
向量检索沿用同一套结构:dense_vector 存在段里,kNN 走 HNSW 图;混合检索的差异在于 BM25 与向量各自召回,再用 RRF 融合。
一句话定位
ES 的强项不是「向量检索最快」,而是全文检索、过滤、聚合、向量在同一个引擎里。当业务已经有 ES、且查询需要关键词与语义并用时,它的综合成本通常低于再引入一个专用向量库。
读法建议
- 先读 01、02,把分片、倒排索引和分词的关系理清;这两篇决定了后面所有性能问题的判断方式。
- 再读 03、04,理解「写入后 1 秒才可见」和「query/filter 分工」;这是生产上最容易误用的两处。
- 最后读 05、06、07、09,把聚合内存、分片分配、磁盘水位、bulk 队列和监控指标串起来;排障时按「现象 → 命令 → 判断」走。
- 09 是运维视角的收口:先分清读/写路径,再看队列、堆、磁盘、分片四类指标,避免只盯单个阈值。
- 有向量检索需求时读 08,先确认规模与过滤条件,再决定是否用 ES 而不是专用向量库。
- 每篇末尾的「讲清楚」是三分钟口述版;读完先能复述机制和取舍,再回头查命令和默认值。