Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

ElasticSearch FAQ

内容:基础、倒排索引、写入原理、查询、集群、分片、性能调优、冷热分离、安全、ES 7/8 新特性等。

⭐ 目录

  • 一、基础概念
  • 二、倒排索引 / Lucene 原理
  • 三、写入流程(核心)
  • 四、查询流程(核心)
  • 五、分片 / 副本 / 路由
  • 六、集群与节点角色
  • 七、性能优化(索引、搜索)
  • 八、数据建模
  • 九、ES 运维
  • 十、常见故障
  • 十一、安全与权限
  • 十二、冷热分离 / ILM
  • 十三、相关生态(Kibana、Logstash、Beats)

一、基础概念

1. ElasticSearch 是什么?为什么快?

回答精要:

ElasticSearch 是基于 Lucene 的分布式搜索和分析引擎。

它快的原因:

  1. 倒排索引(Inverted Index)
  2. 分布式分片并行查询
  3. 列式存储(doc_values)
  4. 内存缓存(file cache / query cache / shard request cache)
  5. 高效的写入与 segment merge

二、倒排索引原理

2. 什么是倒排索引?

倒排索引是:

单词 -> 出现在哪些文档 -> 文档中的位置

适合全文检索,查询复杂文本速度远远快于关系型数据库。

3. 倒排索引为什么快?

  • 关键词直接对应文档列表,无需扫描整张表
  • 结构适合大规模并行搜索
  • Lucene 对索引进行了大量优化:跳表、FST、压缩存储

三、写入流程

4. ElasticSearch 文档写入流程?

流程如下:

  1. 协调节点接收请求
  2. 根据 routing 计算目标 primary shard
  3. 写入 lucene 内存 buffer
  4. 定期 refresh -> 生成 segment,可被搜索
  5. translog 记录写入日志
  6. 后台 merge 合并小 segment
  7. 副本同步

5. refresh 是什么?flush 是什么?

  • refresh(默认 1 秒):刷新内存 buffer,生成可搜索 segment -> 数据“可被查询”。
  • flush:清空 translog -> 保证数据持久化。

四、查询流程(核心)

6. ElasticSearch 查询流程?

  1. 协调节点拆分查询 -> 发送到每个 shard
  2. 每个 shard 查询自己的倒排索引
  3. 返回 top N
  4. 协调节点合并结果
  5. 返回最终排序后的结果

五、分片 / 副本 / 路由

7. 为什么 ES 要分片?

  • 支持水平扩展
  • 支持并行查询
  • 避免单节点无法存储超大数据

8. 分片选多了有什么坏处?

  • 小 segment 太多 -> 搜索慢
  • merge 压力大
  • 内存占用高

最佳实践:单 shard 控制在 20–50 GB

9. ES 的路由算法?

默认:

shard = hash(_routing) % number_of_primary_shards

所以 分片数不能修改(主分片数固定)

10. Replica 副本的作用是什么?

  • 读高可用(提高查询性能)
  • 故障转移(主分片挂了,副本提升为主分片)

六、集群、节点角色

11. 什么是 master 节点?

负责:

  • 管理集群状态
  • 选主
  • 创建删除索引
  • 分片调度

常见错误:把 master 当成数据节点使用 -> 崩溃风险。

12. ES 7/8 有哪些节点角色?

简要列出:

  • master
  • data_hot / data_warm / data_cold / data_frozen
  • ingest
  • transform
  • ml
  • coordinating-only

七、性能优化(索引、搜索)

13. 写入性能怎么优化?

  • 使用 bulk 批量写入
  • 降低 refresh_interval(默认 1s,可改成 5s)
  • 使用 Autogenerated ID
  • 不要频繁更新文档(因为更新本质是删除+新增)
  • 合理的分片数量
  • 使用 SSD

14. 搜索性能怎么优化?

  • 使用 filter(可缓存)
  • keyword 代替 text(不分词)
  • 关闭不必要的字段(“index”: false)
  • 使用 doc_values,禁用 fielddata
  • 尽量使用 Term 查询,不用 wildcard 前缀搜索

八、数据建模

15. text 和 keyword 的区别?

字段类型 是否分词 使用场景
text 全文检索
keyword 精确匹配/聚合/排序

16. mapping 为什么要静态定义,不要依赖 dynamic?

  • dynamic 会导致字段爆炸(field explosion)
  • 导致集群状态膨胀
  • 影响搜索性能

九、运维

17. 如何扩容 ES?

  • 增加数据节点 -> shard 自动 re-balance
  • 增加 master 节点提高稳定性
  • 增加协调节点提升搜索性能

18. 如何查看集群健康状态?

GET _cluster/health

输出 green/yellow/red。

19. 什么情况下出现 yellow?

  • 副本未分配
  • 单节点集群(正常)

十、常见故障

20. 集群变红怎么办?

常见原因:

  • 某些主分片丢失
  • 节点掉线
  • 磁盘满(常见!)

处理:

  • 查看 _cluster/allocation/explain
  • 释放磁盘空间
  • 恢复快照

21. 为什么 ES 占用磁盘比你的数据大?

原因:

  • 倒排索引成本高
  • segment + merge
  • 副本
  • 索引存储结构本身压缩比低

十一、安全与权限

22. 如何开启 ElasticSearch 安全认证?

ES 8 默认开启 X-Pack Security:

  • TLS
  • 用户角色管理(RBAC)
  • API Key
  • Token

十二、冷热分离 / ILM

23. 冷热分离有什么好处?

  • 热节点高性能:写入更快
  • 冷节点高容量:成本更低
  • ILM 控制 index 生命周期

24. 讲一下 ILM 的生命周期?

一般流程:

Hot -> Warm -> Cold -> Frozen -> Delete

每个阶段控制:

  • rollover
  • forcemerge
  • allocate 到不同节点
  • searchable snapshot

十三、ELK / EFK 生态

25. Logstash、Beats、Elasticsearch、Kibana 的职责?

  • Filebeat:轻量采集日志
  • Logstash:Log pipeline(过滤、解析、grok)
  • Kafka(可选):缓存/削峰/解耦
  • Elasticsearch:搜索与存储
  • Kibana:展示与可视化

十四、概述

ElasticSearch 快是因为倒排索引 + Lucene + 分布式 + 并行搜索 + 列式存储。

写入是:buffer -> segment -> refresh -> translog -> flush -> merge。

分片数不要太多,单 shard 控制 20–50GB。

使用 filter、keyword、doc_values 优化搜索。

靠 ILM 做冷热分离,提高性能和降低成本。

master 只负责管理,不存数据。

查询和写入路径要完全理解。