🚀 无论是求职面试,还是日常工作中的搜索、日志分析和监控系统,Elasticsearch 都是绕不开的技术点。本文从 原理、架构、查询、调优、运维、安全与实践 七大方面,系统梳理 ES 的知识点,帮助你一文掌握面试必考内容。
一、核心概念与数据模型
- 基本对象
-
Master Node:负责集群管理、分片调度。
-
Data Node:负责数据存储和检索。
-
Coordinating Node:协调查询。
-
Ingest Node:数据预处理(Pipeline)。
-
主分片(Primary Shard):原始数据分片。
-
副本分片(Replica Shard):主分片的拷贝,提升高可用和查询并发能力。
-
Index(索引):相当于数据库的“库”。
-
Type(类型):7.x 之后已废弃。
-
Document(文档):最小数据单元,相当于“行”。
-
Field(字段):文档的属性。
-
分片(Shard):数据水平切分的基本单元。
-
集群角色:
- Mapping 映射
-
text
(分词,全文检索)。 -
keyword
(不分词,精确匹配)。 -
date
、long
、float
、boolean
。 -
nested
(嵌套对象)、object
。 -
定义字段的数据类型、分词器、是否可索引。
-
支持 静态映射 和 动态映射。
-
常见字段类型:
- 分片(Shard)与副本(Replica)
-
主分片:负责写入,数量在索引创建时固定。
-
副本分片:容错和负载均衡,数量可动态调整。
-
原则:单分片大小 10~50GB。
- Elasticsearch 中 text 与keyword
-
text:会分词,用于全文检索。
-
keyword:不分词,用于精确匹配(如 ID、邮箱、标签)。
-
通常字符串字段会同时建 text + keyword(multi-fields)。
二、工作原理
倒排索引
-
存储形式:
词项 → 文档 ID 列表
。 -
优势:高效模糊搜索、全文检索。
-
缺点:更新代价高(需要新建 segment)。
-
查询时通过分词器将输入拆分为词,然后快速找到包含这些词的文档。
-
适合全文检索,但不适合频繁更新。
写入流程
-
客户端请求到协调节点。
-
协调节点将请求路由到 主分片(根据 routing 算法)。
-
主分片写入后,同步副本分片。
-
返回成功。
查询流程
-
Query Phase:协调节点向所有分片广播请求。各分片返回 doc ID 与得分**+** 排序字段值,但不返回文档内容, 协调节点收到所有分片的候选结果后,做一次全局排序,选出最终 topN 个文档 。
-
Fetch Phase: 协调节点根据 Query Phase 选出的 topN 文档 ID,再去对应分片拉取完整文档内容, 把结果合并成最终响应,返回给客户端。
NRT(近实时搜索)
-
Lucene 基于 segment 存储。
-
默认 1s 会执行一次 refresh,新写入的数据才能被查询到。
分词与分析器(Analyzer)
-
分词器组成:字符过滤器 → 分词器 → 词元过滤器。
-
常见分词器:
-
StandardAnalyzer:默认英文分词。
-
IK 分词器:中文分词常用。
-
KeywordAnalyzer:整段不分词。
三、查询 DSL 深入
- 精确查询
-
term
:精确匹配,不分词。 -
terms
:多个值匹配。 -
range
:范围查询(数值、时间)。
- 全文检索
-
match
:分词查询。 -
multi_match
:跨字段搜索。 -
query_string
/simple_query_string
:支持语法(AND/OR/*)。
- 复合查询
-
bool
:组合 must、must_not、should、filter。 -
boosting
:提升或降低权重。 -
function_score
:自定义打分。
- 聚合分析(Aggregation)
-
Bucket:terms、date_histogram、range。
-
Metric:avg、sum、min、max、cardinality。
-
Pipeline:derivative、moving_avg、bucket_script。
- 分页查询
-
from+size:性能差,适合浅分页。
-
search_after:基于排序字段,适合深度翻页。
-
scroll:游标方式,适合批量导出。
四、性能优化
1. 索引优化
-
关闭
_all
字段,禁用动态映射。 -
控制单分片大小 10~50GB ,避免过多小索引。
-
使用合适的分词器(中文推荐 IK)。
-
根据业务设计字段类型:text(分词)/keyword(精确匹配) 并存。
2. 写入优化
-
批量写入 Bulk API。
-
调整 refresh_interval(默认 1s,可临时调大)。
-
关闭副本再导入,导入完成后再开启。
-
合并小 segment,减少 flush 频率。
3. 查询优化
-
用 filter 替代 query(不打分,可缓存)。
-
keyword + doc_values 适合做聚合和排序。
-
尽量避免前缀
*abc
或正则匹配。 -
设置合理的 index sorting。
4. 集群优化
-
建议堆内存为物理内存的 50%,但不超过 32GB(因为超过会失去压缩指针)
-
合理分配冷热节点,热节点(SSD,高 QPS)+ 冷节点(HDD,存历史数据)。
-
ILM(索引生命周期管理):自动 rollover、迁移数据。
-
避免过多分片(小索引碎片过多)。
五、运维与监控
- 集群状态
-
Green:主/副分片均正常。
-
Yellow:主分片正常,副本分片缺失。
-
Red:主分片丢失,数据不可用。
- 常见问题排查
-
分片未分配:磁盘不足 / 节点宕机。
-
查询超时:分片过多 / DSL 不合理。
-
内存溢出:大聚合查询 / Heap 过小。
- 监控指标
-
Heap 使用率、GC 次数。
-
Indexing/Query TPS。
-
分片分布是否均衡。
-
磁盘 I/O、队列长度。
- 快照与恢复
-
快照Repository:HDFS、S3、NAS。
-
支持增量快照。
-
可用于跨集群迁移。
- 常用排查命令
-
GET _cluster/health
:查看集群状态。 -
GET _cat/indices
:查看索引健康情况。 -
GET _cluster/allocation/explain
:分片未分配原因。
六、安全与高可用
- 权限管理
-
X-Pack Security:认证、RBAC。
-
TLS 加密传输。
-
API Key / Token。
- 高可用设计
-
主从分片机制,副本冗余。
-
Master 节点选举(Zen Discovery / Raft 方案)。
-
跨集群搜索(CCS)。
-
跨集群复制(CCR)。
七、生态与应用场景
- 日志与监控
-
ELK(Elasticsearch + Logstash + Kibana)。
-
EFK(Elasticsearch + Fluentd + Kibana)。
-
Metricbeat / Filebeat。
- 搜索业务
-
电商站内搜索。
-
智能推荐(结合打分函数)。
-
地理位置搜索(Geo query)。
- APM 与可观测性
-
Elastic APM:链路追踪、性能分析。
-
Kibana 可视化大屏。
- 安全场景
-
SIEM(安全信息与事件管理)。
-
入侵检测日志分析。
八、典型面试题集锦
-
ES 为什么比数据库快?
→ 倒排索引 + 内存缓存,避免全表扫描。 -
ES 是实时搜索吗?
→ 不是,属于 NRT(Near Real Time),1s 延迟。 -
深度分页如何解决?
→ 使用 search_after 或 scroll, 而不是 from+size 。 -
主分片数量能改吗?
→ 不能,必须在创建索引时确定;副本数可改。 -
如何处理 ES 集群 Yellow/Red?
→ Yellow:副本不足;Red:主分片丢失 → 检查磁盘、节点、分片分配。 -
ES 如何做冷热分离?
→ 节点分层,ILM 策略。 -
ES 和 Solr 的区别?
-
Solr 基于 ZooKeeper,强 schema,适合结构化搜索。
-
ES 内置分布式,schema 灵活,生态更好。
九、实战经验亮点(面试加分)
-
日志平台案例:百万级日志秒级检索,使用 Filebeat + ES + Kibana。
-
查询性能优化:通过 filter 缓存 + keyword 聚合,将查询延迟降低 70%。
-
集群容灾经验:配置跨集群复制(CCR),保障机房级别容灾。
-
数据分层:热节点存近 7 天数据,冷节点存归档数据,节省 60% 存储成本。
🔚 总结
Elasticsearch 的知识体系庞大,但面试核心集中在:
-
基础原理(倒排索引、写入/查询流程)。
-
架构机制(分片、副本、NRT)。
-
查询与调优(DSL、深度分页、filter vs query)。
-
运维与排错(集群状态、分片分配、JVM 调优)。
-
应用场景(日志、搜索、监控)。
掌握这些,不仅能应对大部分面试,还能落地到实际项目。
公众号:运维开发故事
github:https://github.com/orgs/sunsharing-note/dashboard
博客**:https://www.devopstory.cn**
爱生活,爱运维
我是wanger,《运维开发故事》公众号团队中的一员,一线运维农民工,云原生实践者,这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!
扫码二维码
关注我,不定期维护优质内容
温馨提示
如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢!
你还可以把我的公众号设为「星标」,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。
........................