一、ES 基础原理(必杀区)
1️⃣ ES 为什么快?
答题结构:
- 倒排索引(词 → docId)
- 不可变 segment(无锁读)
- mmap + PageCache
- 分片并行查询
2️⃣ 倒排索引和 B+Tree 的核心区别?
- B+Tree:范围查询强
- 倒排索引:全文搜索强
- ES 先分词,再查词典
3️⃣ ES 为什么是近实时(NRT)?
- refresh 才能被搜索
- 默认 1s refresh
- 可见 ≠ 已持久化
4️⃣ refresh / flush / commit 区别?
- refresh:可搜索
- flush:落盘 + 清 translog
- commit:Lucene 层提交
5️⃣ update 在 ES 底层怎么实现?
- delete + insert
- 旧 doc 标记删除
- merge 时物理清除
二、索引 & 写入(高频追问)
6️⃣ 写入一条数据发生了什么?
- 协调节点路由
- primary shard 写
- 写 buffer + translog
- 同步 replica
7️⃣ translog 的作用?
- 防止宕机丢数据
- 类似 MySQL WAL
- flush 后清理
8️⃣ ES 会不会丢数据?
标准回答:
- refresh 前可能丢
- translog 保证 crash 恢复
- ack=all 减少风险
9️⃣ 写入慢的常见原因?
- refresh 频繁
- shard 过多
- merge 压力大
- IO 瓶颈
🔟 写入优化手段?
- bulk
- 关闭 refresh
- 调大 translog
- 合理 shard
三、查询 & 搜索(必问)
1️⃣1️⃣ 查询为什么分 Query / Fetch 两阶段?
- Query:算 score + docId
- Fetch:取 _source
- 减少网络 IO
1️⃣2️⃣ 深分页为什么慢?
- 每个 shard 都算 from + size
- 大量无效排序
- O(n) 丢弃
1️⃣3️⃣ 深分页怎么解决?
- search_after
- scroll(导出)
- 限制页数
1️⃣4️⃣ scroll 为什么不适合实时?
- 基于快照
- 不反映最新数据
- 占用资源
1️⃣5️⃣ search_after 的原理?
- 基于 sort 值
- 无 offset
- 必须唯一排序字段
四、打分 & 分词(加分项)
1️⃣6️⃣ ES 默认打分算法?
- BM25
- TF * IDF * norm
1️⃣7️⃣ keyword 和 text 区别?
- keyword:不分词、精确匹配
- text:分词、参与评分
1️⃣8️⃣ analyzer / tokenizer 区别?
- analyzer = tokenizer + filter
- 决定索引和查询行为
1️⃣9️⃣ 中文分词怎么选?
- ik_smart(粗)
- ik_max_word(细)
- 精确字段用 keyword
五、分布式 & 架构(面试官最爱)
2️⃣0️⃣ shard 是什么?
一个 shard = 一个 Lucene Index
2️⃣1️⃣ shard 能不能改?
- primary shard:不能
- replica:可以
2️⃣2️⃣ shard 太多的问题?
- 内存占用
- 文件句柄
- merge 开销
2️⃣3️⃣ 副本的作用?
- 读扩展
- 高可用
- 故障转移
2️⃣4️⃣ 主分片挂了怎么办?
- replica 提升为 primary
- cluster 自动选举
六、工程 & 真实场景(决胜区)
2️⃣5️⃣ ES 为什么不适合事务?
- 无强一致
- 无回滚
- NRT
2️⃣6️⃣ ES 和 MySQL 如何配合?
- MySQL:主数据
- ES:搜索
- binlog / MQ 同步
2️⃣7️⃣ 如何保证数据一致性?
- 最终一致
- 重放机制
- 定期校准
2️⃣8️⃣ ES 适合做主存储吗?
标准回答:
不适合,ES 是搜索引擎,不是事务型数据库
2️⃣9️⃣ ES 常见线上事故?
- shard 爆炸
- heap 爆
- 大查询拖垮集群
3️⃣0️⃣ ES 排查问题思路?
- 看 JVM heap
- 看 GC
- 看 slowlog
- 看 segment & merge
七、你现在该怎么用这 30 问?
建议打法(很重要):
1️⃣ 每题准备 30 秒 + 2 分钟版本
2️⃣ 能画出 Index / Shard / Segment 结构
3️⃣ 至少能讲清 refresh + translog
4️⃣ 能说清深分页的本质