ES 是什么?和 Lucene 什么关系?
ES 是基于 Lucene 封装的分布式搜索引擎,提供全文检索、数据分析。
Lucene 是底层的检索库,ES 把它做成了分布式、易用、高可用的服务。
ES的核心概念:index、document、shard、replica
index:相当于数据库的库
document:一条数据,相当于行
shard:分片,把索引拆分成多个块,提高并发和容量
replica:副本,备份数据,提高可用性,分担查询压力
什么是倒排索引?
倒排索引就是关键词对应文档 ID,而不是文档对应关键词。
这样搜关键词时能快速定位到哪些文档包含它,是 ES 快的核心原因。
ElasticSearch中match和term的区别
match 分词,适用于 text 类型字段,适用于模糊匹配
term 不分词,适用于 keyword 类型字段,适用于精确匹配
text 和 keyword 区别?
text:会分词,用于全文搜索
keyword:不分词,用于精确匹配、排序、聚合
ES 为什么查询快?核心是什么?
答:核心是倒排索引,按关键词匹配文档,无需全表扫描;项目均用 IK 分词器,适配专业词汇,提升检索准确性
ES 怎么实现多维度筛选 + 检索提速?
答:筛选字段建 keyword 索引,使用 bool 查询:must 放关键词检索,filter 放多维度筛选条件(filter 不参与评分且可缓存);项目中合理设置分片,将热点数据预热至内存,保证检索响应 < 500ms。
ES 怎么性能优化
- 怎么提高写入速度?
用 bulk 批量写入
调大 refresh_interval,减少段生成
写入时临时关掉副本,写完再开
提前定义 mapping,不动态创建字段 - 怎么提高查询速度?
能用 filter 就不用 query,filter 会缓存
聚合、排序用 keyword,不用 text
深分页用 search_after 或 scroll,不用 from+size
只查需要的字段,别全返回 - 分片怎么设?
单分片建议 10~50GB
分片太少:并发上不去
分片太多:管理开销大,查询慢
MySQL 数据怎么同步到 ES?
主流用 Canal 监听 binlog,实时同步到 ES。
也可以定时任务增量同步,或业务双写。
什么是冷热分离?
热数据:放高性能节点,高频读写
冷数据:放低配节点,只查不写
用 ILM 生命周期自动管理。
集群加节点会发生什么?
ES 会自动分片重平衡,把数据均匀分到新节点,提高整体性能。
慢查询怎么排查?
开慢查询日志
用 profile 看每一步耗时
看节点负载、线程、分片状态
ElasticSearch 的常见问题与解决方案
- 数据不一致问题
原因:副本同步延迟或节点故障。
解决:监控副本状态,确保 number_of_replicas 合理,避免网络分区。 - 查询性能瓶颈
原因:全表扫描、未命中索引。
解决:使用 _explain 分析查询计划,优化索引和查询语句。
- 集群脑裂(Split Brain)
原因:网络分区导致多个主节点。
解决:配置 discovery.zen.minimum_master_nodes 至少为 (number_of_master_nodes / 2) + 1。
ElasticSearch 是分布式搜索与分析领域的核心工具,掌握其核心原理(倒排索引、分片副本)、查询优化(聚合、路由)、集群管理(高可用、监控)及故障排查是面试成功的关键。
实际应用中需结合业务场景设计合理的索引策略,并通过性能调优(JVM、分页、缓存)保障系统稳定性。
ElasticSearch 集群如何搭建的
ElasticSearch7.10.2 集群:
集群采用 3 主 2 从架构,主节点负责分片管理和写操作,从节点负责读操作和容灾,所有节点统一配置内核参数、禁用透明大页,保证集群稳定性;
创建课程索引时指定3 主分片 + 1 副本,分片均匀分配到主节点,副本分配到从节点,同时安装 IK 分词器实现中文全文检索,设置 1s 刷新间隔实现数据实时索引;
项目中通过 Spring Data Elasticsearch 对接集群,使用keyword做精确查询、text+IK做模糊检索,结合动态加权排序算法,实现课程 / 名师 / 知识点多维度检索,搜索响应时间控制在 500ms 内;
同时做了批量操作、热点缓存、冷热数据分离等优化,适配 10 万 + 课程数据的高并发检索需求,高峰期系统稳定运行。