🚀 无论是求职面试,还是日常工作中的搜索、日志分析和监控系统,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 调优)。
- 应用场景(日志、搜索、监控)。
掌握这些,不仅能应对大部分面试,还能落地到实际项目。
声明:来自运维开发故事,仅代表创作者观点。链接:https://eyangzhen.com/2371.html