Elasticsearch

·5 分钟阅读·1703 字
📋 目录

Elasticsearch 高频面试题


ES 架构:集群、节点、分片、副本

【题目】 ES 集群架构中的集群、节点、分片、副本含义是什么?

【参考答案】

术语说明关键点
Cluster(集群)多个节点组成的整体唯一集群名标识
Node(节点)单个 ES 实例可兼任 master/data/ingest/coordinating 角色
Primary Shard(主分片)原始数据分片创建后数量不可修改
Replica Shard(副本分片)主分片副本可动态扩缩,不与主分片同节点

公式总分片数 = 主分片数 × (副本数 + 1)

生产建议:主分片数 ≈ 节点数,副本默认 1,奇数节点防脑裂。

【延伸追问】

  • 主分片数设置过多或过少会有什么问题?
  • 为什么 ES 7.x 后一个索引只能有一个 Type?

【易错坑点】

  • 主分片数一旦设置不可修改,这是最常见的面试陷阱
  • 副本可以动态调整,但主分片必须在创建索引前规划好

倒排索引原理

【题目】 倒排索引的原理是什么?

【参考答案】 倒排索引是 ES 实现快速全文检索的核心数据结构。

  • 正排索引:文档 → 字段内容(通过文档找词)
  • 倒排索引词条 → 文档 ID 列表(通过词找文档)

构建过程

原始文档 → 分词器(Analyzer)分词 → 词条(Term)
  → 建立词条与包含该词条的文档 ID 映射
  → 附加信息:词频(TF)、位置(Position)、偏移量(Offset)

优势:分词后建立倒排表,搜索时直接通过词条定位文档,无需全表扫描。

【延伸追问】

  • ES 的分词器有哪些类型?如何选择?
  • 什么是正排索引(doc_values)?什么场景下使用?

【易错坑点】

  • 倒排索引 ≠ 全文索引,倒排索引是具体的数据结构,全文索引是功能
  • 分词结果取决于分词器,不同分词器对同一文本的处理完全不同

ES 写入流程

【题目】 ES 文档写入流程是怎样的?(面试重中之重)

【参考答案】

客户端请求 → 协调节点(Coordinating Node)
  → 路由算法 shard = hash(_id) % number_of_primary_shards 定位主分片
  → 写入主分片 → 主分片成功后同步所有副本
  → 全部副本落盘成功 → 协调节点返回 success

路由算法:默认基于 _id 哈希,也可通过 routing 参数自定义。

写入保障

  • translog(事务日志):写入时先记 translog,防止宕机丢数据
  • refresh(默认 1s):内存缓冲区 → 内存段,文档变为可检索(不落盘
  • flush:内存段 → 磁盘文件,清空 translog

【延伸追问】

  • ES 是近实时(NRT)搜索引擎,这个”近实时”如何实现的?
  • 大批量导入数据时如何优化写入性能?

【易错坑点】

  • 写入成功 ≠ 立即可检索,需要等到 refresh(默认 1s)后才可见
  • refresh 只是写入内存段,不保证持久化,持久化靠 flush

ES 健康状态

【题目】 ES 健康状态 green / yellow / red 的含义是什么?

【参考答案】

状态含义影响
green所有主 + 副本分片全部正常分配✅ 正常
yellow主分片就绪,副本分片缺失(节点不足)⚠️ 数据安全,检索可用
red部分主分片未分配❌ 对应索引数据丢失,读写异常

【延伸追问】

  • 集群 yellow 时应该如何处理?(增加节点或调整副本数)
  • red 集群的恢复步骤和优先级是什么?

【易错坑点】

  • yellow 不等于有问题,单节点集群没有副本分配是正常现象
  • red 不一定全部索引不可用,只有涉及丢失主分片的索引才异常

关联文档

  • ../../../monitoring/监控与可观测性 — 可观测性
  • ES 基础概念(文档待创建) — ES 深入