Elasticsearch 高频面试题
ES 架构:集群、节点、分片、副本
【题目】 ES 集群架构中的集群、节点、分片、副本含义是什么?
【参考答案】
| 术语 | 说明 | 关键点 |
|---|---|---|
| Cluster(集群) | 多个节点组成的整体 | 唯一集群名标识 |
| Node(节点) | 单个 ES 实例 | 可兼任 master/data/ingest/coordinating 角色 |
| Primary Shard(主分片) | 原始数据分片 | 创建后数量不可修改 |
| Replica Shard(副本分片) | 主分片副本 | 可动态扩缩,不与主分片同节点 |
公式:总分片数 = 主分片数 × (副本数 + 1)
生产建议:主分片数 ≈ 节点数,副本默认 1,奇数节点防脑裂。
【延伸追问】
- 主分片数设置过多或过少会有什么问题?
- 为什么 ES 7.x 后一个索引只能有一个 Type?
【易错坑点】
- 主分片数一旦设置不可修改,这是最常见的面试陷阱
- 副本可以动态调整,但主分片必须在创建索引前规划好
倒排索引原理
【题目】 倒排索引的原理是什么?
【参考答案】 倒排索引是 ES 实现快速全文检索的核心数据结构。
- 正排索引:文档 → 字段内容(通过文档找词)
- 倒排索引:词条 → 文档 ID 列表(通过词找文档)
构建过程:
原始文档 → 分词器(Analyzer)分词 → 词条(Term)
→ 建立词条与包含该词条的文档 ID 映射
→ 附加信息:词频(TF)、位置(Position)、偏移量(Offset)
优势:分词后建立倒排表,搜索时直接通过词条定位文档,无需全表扫描。
【延伸追问】
- ES 的分词器有哪些类型?如何选择?
- 什么是正排索引(doc_values)?什么场景下使用?
【易错坑点】
- 倒排索引 ≠ 全文索引,倒排索引是具体的数据结构,全文索引是功能
- 分词结果取决于分词器,不同分词器对同一文本的处理完全不同
ES 写入流程
【题目】 ES 文档写入流程是怎样的?(面试重中之重)
【参考答案】
客户端请求 → 协调节点(Coordinating Node)
→ 路由算法 shard = hash(_id) % number_of_primary_shards 定位主分片
→ 写入主分片 → 主分片成功后同步所有副本
→ 全部副本落盘成功 → 协调节点返回 success
路由算法:默认基于 _id 哈希,也可通过 routing 参数自定义。
写入保障:
- translog(事务日志):写入时先记 translog,防止宕机丢数据
- refresh(默认 1s):内存缓冲区 → 内存段,文档变为可检索(不落盘)
- flush:内存段 → 磁盘文件,清空 translog
【延伸追问】
- ES 是近实时(NRT)搜索引擎,这个”近实时”如何实现的?
- 大批量导入数据时如何优化写入性能?
【易错坑点】
- 写入成功 ≠ 立即可检索,需要等到 refresh(默认 1s)后才可见
- refresh 只是写入内存段,不保证持久化,持久化靠 flush
ES 健康状态
【题目】 ES 健康状态 green / yellow / red 的含义是什么?
【参考答案】
| 状态 | 含义 | 影响 |
|---|---|---|
| green | 所有主 + 副本分片全部正常分配 | ✅ 正常 |
| yellow | 主分片就绪,副本分片缺失(节点不足) | ⚠️ 数据安全,检索可用 |
| red | 部分主分片未分配 | ❌ 对应索引数据丢失,读写异常 |
【延伸追问】
- 集群 yellow 时应该如何处理?(增加节点或调整副本数)
- red 集群的恢复步骤和优先级是什么?
【易错坑点】
- yellow 不等于有问题,单节点集群没有副本分配是正常现象
- red 不一定全部索引不可用,只有涉及丢失主分片的索引才异常
关联文档
- ../../../monitoring/监控与可观测性 — 可观测性
- ES 基础概念(文档待创建) — ES 深入