Elasticsearch 面试考点精选
本章定位:总结 Elasticsearch 面试中最高频的考点,从基础概念到架构设计,提供逐层递进的回答思路。
一、基础概念
Q1:Elasticsearch 是什么?它和 MySQL 的全文搜索有何本质区别?
| 维度 | MySQL LIKE | Elasticsearch |
|---|---|---|
| 索引结构 | B+Tree(适合精确查找) | 倒排索引(适合全文搜索) |
| 分词 | 不支持 | 内置 Analyzer,分词后建立倒排索引 |
| 相关度排序 | 无 | BM25 评分,按相关性排序 |
| 扩展性 | 单机为主(主从复制) | 天然分布式,水平扩展 |
| 搜索速度 | 大数据量极慢(全表扫描) | 毫秒级(倒排索引直接定位) |
Q2:倒排索引的原理?为什么比正排索引快?
倒排索引:词项(Term)→ 文档列表(Posting List)的映射。搜索"分布式搜索引擎":分词后查倒排→取交集→直接命中,无需遍历所有文档。
Q3:ES 的写流程是怎样的?(从 API 到磁盘)
协调节点计算分片 → 写入内存 Buffer + Translog → 默认每 1s Refresh(Buffer→Lucene Segment)→ 默认每 30min 或 Translog 达 512MB Flush(fsync 到磁盘)→ 并行同步副本 → 返回客户端。
二、搜索与评分
Q4:match、match_phrase、term 的区别和使用场景?
| 查询类型 | 行为 | 场景 |
|---|---|---|
match | 分词后各词项 OR/AND 匹配 | 全文搜索(搜索框) |
match_phrase | 分词后要求词项顺序一致(可设 slop) | 精确短语搜索 |
term | 不分词,精确匹配倒排索引中的词项 | 查 ID、状态、标签(keyword 字段) |
Q5:BM25 评分的三个因子?如何调优?
① IDF(逆文档频率):稀有词权重高;② TF 饱和(词频):第 10 次重复几乎不加分;③ 字段长度归一化:短字段匹配更有价值。调优参数:k1(默认 1.2)和 b(默认 0.75)。
Q6:bool 查询中 must 和 filter 的区别?
| 维度 | must | filter |
|---|---|---|
| 评分 | 参与评分 | 不评分(score=0) |
| 缓存 | 不缓存 | 缓存(Filter Cache) |
| 性能 | 慢 | 快 |
| 用途 | 需要影响排序的条件 | 精确筛选条件 |
三、集群架构
Q7:主分片创建后为什么不能修改?
路由算法 hash(_routing) % num_primary_shards 使用取模运算。分片数改变后所有文档的路由结果都变化。变更唯一方式:Reindex。
Q8:脑裂的成因和预防?
成因:网络分区导致出现两个满足 quorum 的分区各自独立选出 Master。预防:Master-Eligible 节点奇数(3 或 5)、ES 7.x 自动计算 quorum、ES 8.x 使用 Raft 协议。
Q9:集群 Yellow 和 Red 状态分别意味着什么?
- Green:所有主分片和副本全部分配
- Yellow:所有主分片已分配,至少一个副本未分配(数据不丢失,失去冗余)
- Red:至少一个主分片未分配(部分数据不可用)
四、性能优化
Q10:ES 写入性能优化有哪些要点?
- 批量写入:Bulk 批次 5~15MB
- 关闭 Refresh:导入时
refresh_interval: -1,完成后恢复 - 异步 Translog:
durability: async,增大 sync_interval - 0 副本:导入时
number_of_replicas: 0,完成后追加 - 硬件:SSD 是刚需,多路径分散 I/O
Q11:搜索性能优化的关键点?
- 用 filter 替代 must:精确过滤条件放 filter,利用缓存
- 控制分页深度:search_after 代替 from+size
- 字段级优化:不评分字段设 norms: false,纯过滤字段设 index: false
- 减少返回字段:_source filtering
- Routing 优化:指定 routing 缩到单个分片
实战场景题
场景一:课程搜索引擎设计
Mapping:title 用 ik_max_word,category 用 keyword。排序:function_score 结合 enrollment_count + 原始 _score。聚合:terms 按 category 分组 + 嵌套 stats 统计价格。高可用:3 节点集群 + 1 副本 + 别名实现零停机切换。
场景二:日志分析系统设计
按天建索引:logs-2024-06-13,配合 Index Template 自动创建。ILM 策略:7 天后转 warm,30 天后删除。Mapping:dynamic: strict 控制字段数量。写入优化:refresh_interval: 30s,Bulk 5MB/批。
小结
Elasticsearch 面试核心分五个层级:基础概念(倒排索引/分词/写流程)→ 搜索查询(match/term/bool/BM25)→ 聚合分析(桶/指标/嵌套)→ 集群架构(分片/选举/脑裂)→ 性能优化(写入/搜索/硬件)。回答时遵循"定义→原理→示例→对比→陷阱"结构。