ES 面试

ES 面试速记版

1. ES 是什么

Elasticsearch 是分布式全文检索引擎 ,底层基于 Lucene。

它擅长做关键词搜索、多字段检索、高亮和相关性排序。

项目里一般是 MySQL 做主库,ES 做搜索副本


2. ES 为什么搜索快

核心原因是倒排索引

倒排索引不是"文档里有什么词",而是:

词项 -> 出现在哪些文档里。

比如:

  • 黑神话 -> 文档1、文档3
  • Java -> 文档2

所以搜关键词时,不用全表扫描。


3. Lucene 是什么

Lucene 是底层全文检索库。

ES 底层搜索能力来自 Lucene。

Lucene 负责:

  • 建立倒排索引
  • 执行搜索
  • 计算相关性分数

ES 在它上面做了:

  • HTTP 接口
  • JSON 文档操作
  • 分布式
  • 分片
  • 副本
  • 集群管理

4. index、document、field 是什么

  • document:一条数据
  • field:文档里的字段
  • index:一类 document 的集合

比如:

  • video_index:视频索引
  • user_index:用户索引

5. index 和倒排索引的区别

index 是数据集合。
倒排索引 是 index 内部为了支持搜索建立的索引结构。

一句话:

index 是"数据放在哪里",倒排索引是"怎么让搜索变快"。


6. text 和 keyword 的区别

text :会分词,适合全文检索。
keyword:不分词,适合精确匹配、过滤、排序、聚合。

一句话:

text 用来搜全文,keyword 用来精确匹配。


7. node、cluster、shard 是什么

  • node:一台 ES 服务器
  • cluster:多个 node 组成的集群
  • shard:分片,一个 index 会拆成多个 shard

拆 shard 的目的:

  • 分布存储
  • 并行查询
  • 方便扩容

8. primary shard 和 replica shard

  • primary shard:主分片
  • replica shard:副本分片

副本作用:

  • 提高可用性
  • 分担查询压力

9. shard 和 segment 的区别

shard 是 ES 层面的分片。
segment 是 Lucene 层面的索引段。

一个 index 会拆成多个 shard,

一个 shard 里面又会有多个 segment。


10. 为什么一个 shard 里不是一个大文件

因为 Lucene 更适合追加写

新数据不会每次都重写整个大索引,

而是不断生成新的小段,也就是 segment。

后续再慢慢 merge。


11. 一条数据写进 ES 后经历什么

  1. 根据文档 id 路由到某个 primary shard
  2. 对可检索字段做分词分析
  3. 先写入内存缓冲区,同时写 translog
  4. 构建倒排索引相关结构
  5. refresh 后生成新的 segment,这时数据对搜索可见
  6. 后续 flush、merge

12. refresh、flush、merge 的区别

refresh :让新数据对搜索可见
flush :更稳定地持久化,并清理 translog
merge:把多个小 segment 合并成更少的大 segment

一句话记忆:

  • refresh:能搜到了
  • flush:存稳了
  • merge:合起来了

13. 为什么写入 ES 后有时立刻搜不到

因为写入成功后,数据可能只是进入了内存和 translog,

还没有经过 refresh。

refresh 之后生成新的 segment,数据才对搜索可见。

所以 ES 是近实时搜索,不是严格实时。


14. 更新和删除为什么不是简单原地改

因为 Lucene 的 segment 更适合追加写,不适合频繁原地修改。

所以:

  • 更新:通常可以理解成"旧文档失效 + 新文档重建"
  • 删除:通常先打删除标记,后续 merge 时再真正清理

这也是为什么 ES 更适合搜索,不太适合高频精确更新。


15. ES 和 MySQL 的区别

MySQL 更适合:

  • 存业务主数据
  • 事务
  • 精确查询
  • 高频更新

ES 更适合:

  • 全文检索
  • 多字段搜索
  • 高亮
  • 相关性排序

一句话:

MySQL 负责存,ES 负责搜。


16. 为什么项目里要 MySQL 同步到 ES

因为 MySQL 是主库,ES 是搜索副本。

用户改昵称、视频改标题、新增视频后,

都要把变化同步到 ES,否则搜索会是旧数据。

常见做法是:

  • 业务先写 MySQL
  • 通过 MQ / Redis / 定时任务异步同步到 ES

这叫:

最终一致性。


17. 多字段检索、高亮、相关性排序分别是什么

多字段检索 :一次搜索同时查 title、description、tags、author 等多个字段。
高亮 :把命中的关键词标出来。
相关性排序:ES 会计算哪个结果更符合用户搜索意图,并排前面。


18. ES 架构怎么答

你可以直接背:

ES 是分布式搜索引擎,业务数据按 index 组织,一个 index 会拆成多个 shard,并分布在不同 node 上;每个 shard 底层本质是一个 Lucene index,而 Lucene 又会把索引组织成多个 segment。查询时由协调节点把请求分发到相关分片,再把结果汇总返回。


19. "你有深度使用过 ES 吗"怎么答

我在项目里用 ES 做过用户和视频搜索,实际用到过多字段检索、高亮和相关性排序。架构上是 MySQL 做主库,ES 做搜索副本,通过异步同步链路把 MySQL 的变更同步到 ES。原理上我也了解 ES 底层基于 Lucene、核心是倒排索引,一个 index 会拆成多个 shard,而 shard 内部又由多个 segment 组成。


高频面试题一问一答

Q1:ES 底层核心是什么索引结构?

倒排索引。

也就是提前记录某个词出现在哪些文档里,所以适合全文检索。


Q2:Lucene 是什么?

Lucene 是底层全文检索库,ES 底层基于 Lucene 实现。


Q3:index 和倒排索引有什么区别?

index 是一类数据的集合,倒排索引是 index 内部用来支持搜索的结构。


Q4:为什么 ES 搜索快?

因为底层是倒排索引,不需要像数据库模糊查询那样大量扫描。


Q5:为什么写入 ES 后有时搜不到?

因为还没 refresh,数据还没对搜索可见。


Q6:refresh 和 flush 的区别?

refresh 让数据能搜到,flush 让数据更稳地持久化并清理 translog。


Q7:text 和 keyword 有什么区别?

text 会分词,适合全文检索;keyword 不分词,适合精确匹配。


Q8:为什么 ES 不适合高频精确更新?

因为 Lucene 的 segment 更适合追加写,更新更像旧文档失效再重建,而不是数据库那种原地改。


Q9:ES 和 MySQL 怎么配合?

MySQL 存主数据,ES 做搜索副本,通过异步同步保证最终一致性。


Q10:为什么一个 index 要拆成 shard?

为了分布存储、并行查询和方便扩容。


总结

Elasticsearch 是分布式全文检索引擎,底层基于 Lucene。它搜索快的核心原因是倒排索引,也就是提前记录"某个词出现在哪些文档里"。业务上通常用 MySQL 存主数据,用 ES 做搜索副本。一个 index 会拆成多个 shard,每个 shard 底层本质上是一个 Lucene index,而 Lucene 又会把索引组织成多个 segment。写入时数据会先进入内存和 translog,经过 refresh 后生成新的 segment,此时数据才对搜索可见;flush 更偏持久化和清理 translog;merge 则用于合并多个小 segment。项目里我主要用过 ES 的多字段搜索、高亮和相关性排序,也了解 MySQL 到 ES 的异步同步链路。

相关推荐
半页码书2 小时前
半结构化面试是什么?跟结构化面试有什么区别?
人工智能·面试·职场和发展·求职招聘·职场发展·远程工作
鸿蒙程序媛2 小时前
【工具汇总】git 常用命令行汇总
大数据·git·elasticsearch
Trouvaille ~2 小时前
【MySQL篇】复合查询:多表数据的整合
数据库·sql·mysql·面试·复合查询·基础入门·多表连接
GISer_Jing2 小时前
前端JS面试6大核心考点详解
前端·javascript·面试
Trouvaille ~3 小时前
【MySQL篇】内外连接:多表关联的完整指南
android·数据库·mysql·面试·后端开发·dql·内外连接
Ruihong3 小时前
你的 Vue 3 生命周期,VuReact 会编译成什么样的 React?
vue.js·react.js·面试
Elasticsearch3 小时前
多大才算太大?Elasticsearch 容量规划最佳实践
elasticsearch
未秃头的程序猿3 小时前
💥 MyBatis 面试连环炮:从源码原理到实战避坑,彻底拿下 Offer 通关秘籍
后端·面试·mybatis
over6973 小时前
面试官视角:TypeScript Pick 工具类型深度解析与手写实现
前端·面试