Elasticsearch 基础总结
一、Elasticsearch 是什么
开源的分布式、RESTful 搜索和分析引擎,Java 开发,基于 Lucene。7.x 起内置 JDK,无需额外依赖。支持文本、数值、地理空间、结构化与非结构化数据。
一句话:ES 是一个专门用来"搜索"和"分析"海量数据的引擎,不是用来替代 MySQL 的。
二、Lucene 是什么
Lucene 是一个用 Java 编写的全文检索库,是 ES 的底层核心。它提供倒排索引、分词、评分、高亮等能力。由于其没有分布式和高可用,直接基于它开发非常复杂。ES 在其上封装了 REST API、分布式、副本等
一句话:
"ES 底层是 Lucene,Lucene 提供了倒排索引和全文检索能力。ES 在 Lucene 之上加了分布式、副本、REST API,让它变成一个可以直接用的搜索系统。"
三、ES 能帮你做什么
| 场景 | 说明 |
|---|---|
| 全文检索 | 商品搜索、文章搜索、日志搜索 |
| 日志分析 | ELK(Elasticsearch + Logstash + Kibana) |
| 聚合分析 | 统计、分组、报表、仪表盘 |
| 模糊匹配 | 拼写纠错、同义词、拼音搜索 |
| 地理位置搜索 | 附近的人、附近的店 |
| 向量搜索 | RAG、推荐系统(新趋势) |
不适合:
- 强事务场景(如银行转账)
- 复杂关联查询(多表 JOIN)
- 频繁更新的数据
四、为什么 ES 可以而 MySQL 不行?
核心原因:数据结构不同。
1. MySQL 的索引是 B+ 树
- B+ 树适合精确匹配 和范围查询。
- 对于
LIKE '%关键字%',无法走索引,只能全表扫描。 - 数据量大时,全表扫描极慢。
2. ES 的索引是倒排索引
- 倒排索引是 Term → 文档 ID 列表 的映射。
- 写入时对文本分词,建立 Term 和文档的关系。
- 查询时直接根据 Term 找到文档,不需要扫描全表。
3. 举例
查询"手机":
- MySQL:
WHERE title LIKE '%手机%'→ 全表扫描,慢。 - ES:倒排索引直接找到包含"手机"的文档 ID → 快。
4. 一句话
"MySQL 用 B+ 树,适合精确匹配和范围查询,但 LIKE '%xxx%' 无法走索引,只能全表扫描。ES 用倒排索引,写入时分词建立 Term 到文档的映射,查询时直接根据 Term 定位,所以全文检索快很多。这就是为什么搜海量文本用 ES,而不用 MySQL。"
五、ES 核心概念
| 概念 | 说明 | 类比 MySQL |
|---|---|---|
| Cluster(集群) | 一个或多个节点组成,对外提供搜索服务 | 一个数据库实例 |
| Node(节点) | 一个 ES 进程,属于某个集群 | 一个数据库服务器 |
| Index(索引) | 文档的集合,类似数据库的表 | 表 |
| Document(文档) | 一条 JSON 记录 | 行 |
| Field(字段) | 文档中的一个属性 | 列 |
| Mapping(映射) | 定义字段类型和属性 | 表结构 |
| Shard(分片) | 索引的水平拆分,每个分片是一个 Lucene 实例 | 分库分表 |
| Replica(副本) | 分片的备份,提供高可用和读扩展 | 主从复制 |
| 倒排索引 | Term → 文档 ID 的映射 | 无直接对应 |
一句话:
"ES 里索引类似 MySQL 的表,文档类似行,字段类似列,Mapping 类似表结构。索引可以拆成多个分片,每个分片是一个 Lucene 实例,副本提供高可用。ES 用倒排索引做全文检索,和 MySQL 的 B+ 树互补。"
六、常见考察点
面试不会直接问"ES 是什么",而是通过以下方式考察:
| 问题 | 考察点 |
|---|---|
| "你项目为什么用 ES?" | ES 是什么、能做什么、和 MySQL 区别 |
| "ES 和 MySQL 有什么区别?" | B+ 树 vs 倒排索引、全文检索 vs 事务 |
| "ES 底层是什么?" | Lucene、倒排索引 |
| "ES 里的索引、文档、分片是什么?" | 基础概念 |
| "数据怎么从 MySQL 同步到 ES?" | 数据同步方案 |
| "ES 为什么快?" | 倒排索引、分布式、分片 |