Java面试-09-分布式搜索引擎ES

Elasticsearch (ES) 核心知识点整理

目录

  1. [什么是 ES?](#什么是 ES?)
  2. [ES 核心概念](#ES 核心概念)
  3. [ES 主要特点](#ES 主要特点)
  4. [倒排索引(Inverted Index)](#倒排索引(Inverted Index))
  5. [ES 核心操作流程](#ES 核心操作流程)
  6. [ES 集群管理](#ES 集群管理)
  7. [ES 监控](#ES 监控)
  8. [ES 性能优化](#ES 性能优化)
  9. [ES 高级特性与问题解决](#ES 高级特性与问题解决)
  10. [ES 安全与查询](#ES 安全与查询)

1. 什么是 ES?

ES(Elasticsearch)是一款基于 Lucene 构建的分布式搜索引擎,设计理念核心是分布式架构,专注于海量数据的实时存储、检索与分析,提供高可用、可扩展的全文检索能力。

2. ES 核心概念

概念 解释
集群 由一个或多个节点组成的集合,共同提供数据存储、搜索/分析服务,实现高可用和可扩展性
节点 集群中的单个服务器实例,分主节点、数据节点等角色,参与索引/搜索、存储数据等操作
分片 索引的物理拆分单元,一个索引可拆分为多个分片,实现分布式存储和并行处理,提升性能
副本 分片的拷贝,提供数据冗余和高可用,同时可分担搜索请求,提升并发能力
索引 类似关系型数据库的"数据库",是具有相似特征的文档集合,是数据存储/检索的基本单位
文档 ES 最小数据单元,JSON 格式存储,类似数据库的"行记录",包含字段和对应值
映射 定义索引中文档的结构(字段数据类型、分词器等),类似数据库的"表结构定义"
类型 ES 6.x 前用于区分一个索引内不同类型文档,7.x 起弃用,推荐用不同索引区分
字段 文档中的单个数据项,类似数据库的"列",有专属数据类型(文本、数值、日期等)

3. ES 主要特点

  • 分布式与高可用性:支持数据分片和副本复制,自动管理数据分布,节点故障不影响集群可用。
  • 实时搜索和分析:近乎实时索引/搜索数据,写入后秒级可检索,支持海量数据快速分析。
  • 强大的全文搜索:支持模糊搜索、短语搜索、相关性排序等,适配复杂文本检索场景。
  • 丰富的查询与聚合:提供多类查询语法(匹配、范围、聚合等),支持分组、统计、过滤等数据分析。
  • 可扩展性与性能优化:水平扩展(增加节点)即可应对数据/查询量增长,支持多维度性能调优。

4. 倒排索引(Inverted Index)

4.1 定义

倒排索引是 ES 核心检索结构,与"正向索引(文档 ID → 内容)"相反,实现"单词/词条 → 包含该单词的文档 ID"的映射,用于快速定位含指定关键词的文档。

示例:检索"人工智能"时,可通过倒排索引直接找到所有包含该关键词的图书文档。

4.2 结构

  • 单词表(词典):存储所有被索引的单词/词条,按字典序排列,支持快速查找。
  • 倒排列表:每个单词对应一个列表,记录包含该单词的文档 ID、单词在文档中的位置/出现频率等,用于相关性排序。

5. ES 核心操作流程

5.1 写入数据的过程

  1. 客户端向任意节点(协调节点)发送写入请求;
  2. 协调节点根据文档 ID 计算目标分片,转发请求到主分片所在节点;
  3. 主分片执行写入,同步数据到所有副本分片;
  4. 所有副本确认写入成功后,主分片向协调节点返回成功,协调节点再响应客户端。

5.2 底层存储原理

ES 底层基于 Lucene,数据以不可变的段(Segment) 存储在磁盘;新数据写入新段,多个段定期合并;通过倒排索引、提交点(记录段状态)等机制实现快速检索。

5.3 读取数据(文档)的过程

  1. 客户端发送读取请求到协调节点;
  2. 协调节点确定目标分片,向主分片/副本分片发送查询请求;
  3. 分片执行查询并返回结果,协调节点合并/排序后返回给客户端。

5.4 删除/更改文档的过程

  • 删除:不立即删除磁盘数据,仅标记文档为"删除状态",段合并时清理标记数据;
  • 更改:先标记旧版本为删除,再写入新版本文档,最终通过段合并清理旧数据;
  • 操作流程:找到目标主分片 → 执行标记/写入 → 同步到副本分片 → 响应客户端。

5.5 搜索(检索文本)的过程

  1. 用户发送搜索请求到协调节点;
  2. 协调节点将请求广播到所有相关分片所在节点;
  3. 各节点在本地分片执行搜索,返回局部结果;
  4. 协调节点合并、排序所有局部结果,最终返回给用户。

6. ES 集群管理

6.1 Master 节点选举

ES 通过 Zen Discovery 模块实现节点发现和 Master 选举:

  1. 集群启动时,具备 Master 资格的节点互相通信;
  2. 默认按"节点 ID 最小"规则选举,或按配置的优先级选举;
  3. 当多数节点认可某节点为 Master 时,选举完成;
  4. Master 负责管理集群元数据(索引创建/删除、分片分配等)。

6.2 脑裂问题

6.2.1 成因
  • 网络故障:节点间通信中断,形成多个网络分区;
  • 配置问题:选举超时时间不合理、节点配置不一致;
  • 节点故障:Master 节点负载过高、硬件故障。
6.2.2 解决方法
  • 优化网络:确保集群网络稳定,减少分区概率;
  • 合理配置:调整选举超时时间,设置 minimum_master_nodes(需 > 集群 Master 候选节点数/2);
  • 增强稳定性:提升 Master 节点资源配置,避免负载过高。

6.3 分布式数据一致性

  • 一致性级别:设置写入时需确认的副本数(one/quorum/all),保证写入成功的副本数量;
  • 乐观并发控制:通过版本号校验,确保读写过程中数据不被覆盖;
  • 跨集群复制(CCR):异步复制索引到远程集群,保障地理分布式环境下的数据同步;
  • 快照与恢复:定期创建快照,故障时快速恢复数据。

7. ES 监控

可通过以下方式监控集群状态:

  • 内置工具:ES Head、Marvel 插件;
  • 可视化工具:Kibana(监控集群健康、节点负载、索引大小等);
  • 第三方工具:Prometheus + ES Exporter(监控各项性能指标)。

8. ES 性能优化

8.1 存储设备优化

  • 使用 SSD 硬盘提升读写性能;
  • 配置磁盘阵列,优化文件系统参数,保障磁盘 I/O 能力。

8.2 JVM 调优

参数类型 调优要点
堆大小 不超过物理内存的 50%,且不超过 32GB(避免压缩指针开销),防止 OOM 和频繁 GC
GC 调优 选用 G1 GC,调整新生代/老年代比例,减少 GC 停顿时间
文件系统缓存 预留足够内存给系统缓存,让热数据驻留内存,提升查询效率

8.3 核心参数配置

参数 配置原则
分片数 按数据量/查询复杂度设置,避免过多(增加管理成本)或过少(无法并行)
副本数 高可用/并发场景设 1-2 个,大批量写入时可临时设为 0,完成后恢复
refresh 时间 实时性要求低则调大(如 30s),减少刷新开销;默认 1s
flush 时间 按数据量调整,避免频繁刷盘影响性能
translog 大小 控制事务日志大小,达到阈值触发刷盘,避免日志过大占用磁盘

8.4 海量数据(数十亿级)查询优化

  • 缓存优化:利用 ES 内存缓存 + 系统文件缓存,预热热点数据;
  • 冷热分离:热数据存 SSD,冷数据存低成本存储,仅预热热数据;
  • 索引优化:合理设计索引结构、选用高效分词器,优化查询语句。

8.5 分页性能优化(避免深度分页)

  • 使用 scroll API:服务器端维护游标,分批获取大量数据;
  • 使用 search after:基于上一页最后一条数据的字段值查询下一页,替代页码分页。

8.6 高并发写入优化

  • 索引设计:按时间滚动创建索引(如 logs-%{+YYYY.MM.dd}),保持单索引大小适中;
  • 写入策略:使用 Bulk API 批量写入,关闭自动刷新(refresh_interval: -1),完成后恢复;
  • 集群配置:分离主节点/数据节点,禁用 swap 分区,调大文件句柄和线程池限制。

9. ES 高级特性与问题解决

9.1 字典树与拼写纠错

  • 字典树:树形结构,按字符串前缀存储,用于快速查找、自动补全、拼写检查;
  • 拼写纠错实现
    1. 基于编辑距离算法,计算输入字符串与索引词汇的距离,返回阈值内的词汇;
    2. 使用 ES Fuzzy Query 模糊查询,结合倒排索引实现纠错;
    3. 结合语言模型,按词汇出现概率优化纠错结果。

9.2 query 和 filter 的区别

特性 query 查询 filter 查询
分值计算 计算相关性分值,用于结果排序 不计算分值,仅判断是否匹配
使用场景 全文搜索(需按相关性排序) 过滤条件(如时间范围、状态筛选)
缓存 不缓存结果 缓存结果,提升重复查询效率

10. ES 安全与查询

10.1 敏感数据保护措施

  • 认证与授权:启用 X-Pack 安全插件,创建角色/用户,分配最小权限(只读/读写);
  • 数据加密:传输层启用 SSL/TLS 加密,存储层使用磁盘加密/索引加密;
  • 网络隔离:部署在专用网络区域,通过防火墙限制仅授权 IP 访问集群。

10.2 全文搜索与短语搜索

  • 全文搜索 :使用 match 查询,对字段分词后匹配词项。
    示例:查询"美丽的风景",分词为"美丽""的""风景",匹配含任意词项的文档;
  • 短语搜索 :使用 match_phrase 查询,要求词项按顺序连续出现。
    示例:查询"美丽的风景",仅匹配包含连续该短语的文档。

总结

  1. ES 是基于 Lucene 的分布式搜索引擎,核心依赖倒排索引实现快速检索,集群由节点组成,数据按分片/副本存储保障高可用;
  2. 性能优化核心方向:合理配置分片/副本、调优 JVM、优化写入/查询策略、避免深度分页;
  3. 集群稳定性保障:规范 Master 选举配置、预防脑裂、监控集群状态,同时通过认证加密保护数据安全。