ElasticSearch八股
基础概念
-
什么是Elasticsearch?请介绍一下Elasticsearch
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎,还是一个分布式文档数据库。它能很方便的使大量数据具有搜索、分析和探索的能力。
-
Elasticsearch 的基本概念有哪些?
-
index:索引,是具有相似结构的文档的集合(类似于数据库中的一个表)
-
document:文档,用来搜索的数据,其中的每一条数据就是一个文档,例如一个网页,一个商品信息,由field(字段)构成。文档是 Elasticsearch 中的基本数据单元。它是一个以 JSON 格式表示的结构化数据对象。(类似于数据库中的一行数据)
ES是一个非结构化的数据库,每个文档可以有不同的字段,并且有一个唯一标识.
-
field:字段,可以是一个简单的值(如字符串、数字、日期), 也可以是一个数组, 还可以嵌套一个对象或多个对象。(类似于数据库中某行的一列数据), 每个字段都对应一个类型。
可以指定如何分析某一字段的值, 即对field指定分词器
-
mapping:映射,可以把索引当做数据库中的表,数据库的表有约束信息,可以用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射,是索引中文档的字段约束信息,类似表的结构约束。
-
-
Elasticsearch 中的集群、节点、索引、文档、类型是什么?
核心概念的层级关系如下,从大到小依次是:集群 (Cluster) > 节点 (Node) > 索引 (Index) > 文档 (Document)。类型 (Type) 是一个已过时的概念。
- 集群:一个集群是由一个或多个节点组成的集合,它们共同持有整个数据,并提供跨所有节点的联合索引和搜索能力。
- 节点:一个节点是集群中的一个单个服务器,是集群的一部分。它是 Elasticsearch 的一个运行实例。
- 索引:具有相似结构的文档的集合(类似于数据库中的一个表)
- 文档:文档是 Elasticsearch 中的基本数据单元。它是一个以 JSON 格式表示的结构化数据对象。(类似于数据库中的一行数据)
-
说一下text 和 keyword类型的区别
它们的主要区别在于用途、分词处理方式和搜索方式。
- text类型:用于全文搜索的长文本(例如文档内容,产品描述,评论),会进行分词处理。如果你需要搜索文本内容中的关键词,用
text
- keyword类型:用于精确匹配、聚合、排序的精确值(如 ID、邮箱、状态、标签),不会进行分词处理,会被原样(作为一个完整的词条)存储和索引。如果你需要精确匹配一个值、进行聚合或排序,用
keyword
。
如果两者都需要,使用 多字段 (multi-fields) 来同时定义
text
和keyword
- text类型:用于全文搜索的长文本(例如文档内容,产品描述,评论),会进行分词处理。如果你需要搜索文本内容中的关键词,用
-
DocValues的作用是什么?
为字段提供一种基于列的、磁盘存储的、高效的数据结构,使得聚合、排序和脚本操作能够快速执行,同时避免消耗宝贵的 JVM 堆内存。
一般对于text字段会默认关闭doc_values,因为text字段经过分词后会产生大量词条,为他们构建doc_values会占用巨大的磁盘空间
-
什么是停顿词过滤?
其核心目的是移除文本中那些出现频率极高但携带信息量极低的词语,从而提高搜索和分析的效率与质量。
例如:冠词、介词、连词等
在ES中,停顿词过滤通过stop分词器或stop分词过滤器来实现。
-
query 和 filter 的区别是什么?
在ES中,Query和 Filter 是两种常用的数据检索方式,它们的主要区别在于 是否计算相关性分数(Score) 以及 是否使用缓存。
- Query(查询):此文档与此查询子句的匹配程度如何?计算相关性分数,结果不会被缓存,适合全文检索,需要排序的场景以及模糊匹配;
- Filter(过滤器):此文档和查询子句匹配吗?结果会被缓存,适合重复查询的场景,性能更高,因为不需要计算分数,适合精确匹配,布尔条件判断以及过滤不需要排序的数据。
Elasticsearch 针对 Filter 查询只需要回答「是」或者「否」,不需要像 Query 查询一下计算相关性分数,同时 Filter 结果可以缓存。
-
Elasticsearch有哪些数据类型?你在项目中用了哪些?
-
keyword:权限中心项目中使用频率最高的类型,适用于所有需要精确匹配、聚合、排序和过滤的标识符和状态字段,例如用户标识user_id
-
text:用于存储可读性文本、支持全文搜索,例如: 应用、项目、角色、权限的详细描述。
-
date:用于记录所有事件的时间点,是时间排序分析的基础,例如created_time: 用户、应用、项目、角色、权限的创建时间。
-
long/integer:用于存储计数和数值型ID,例如:user_count同一公司下的用户人数。
-
object/nested(处理复杂结构):用于存储嵌套的业务对象
-
-
Elasticsearch支持事务吗?
ES首要目标是高可用性、可扩展性和近实时的搜索与分析性能。为了实现这些目标,它牺牲了强事务性。所以不支持ACID事务。
虽然没有完整事务,但 Elasticsearch 提供了在单个文档级别的原子性操作:对单个文档的
index
,create
,delete
,update
操作是原子的。
核心原理
-
什么是倒排索引?
倒排序索引是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据文档id获取文档,是根据词条找文档的过程。
正向索引是根据id索引的方式,但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程
-
你了解倒排索引的实现原理吗?
-
文本预处理与分词:在构建索引前,原始文本需要进行:分词、转小写、停顿词过滤等操作
-
构建词项字典(Term Dictionary):系统会收集所有文档中出现过的唯一词项,并按字母顺序或哈希方式组织成一个有序的词项字典。
这个字典通常采用高效的查找结构(如B树、跳表或哈希表)存储,以便快速定位某个词项是否存在及其在索引中的位置。
-
生成倒排序表:对于词项字典中的每一个词项,系统会维护一个对应的倒排列表。该列表记录所有包含该词项的文档ID。
为了支持更复杂的查询(如短语搜索、相关性排序),倒排列表中通常还会存储额外信息,如:词频(TF, Term Frequency):词项在文档中出现的次数;位置信息(Position):词项在文档中的具体位置(如第几个词),用于支持“near”或“phrase”查询;字段信息:如果文档有多个字段(如标题、正文),还需记录词项出现在哪个字段。
-
压缩与优化存储:由于倒排列表可能非常庞大(尤其对常见词如“the”),系统会对文档ID列表进行压缩。
常见的压缩技术包括使用差值编码(Delta Encoding)(存储文档ID之间的差值而非原始ID,因为ID通常是递增的)和变长字节编码(Variable Byte Encoding),以减少磁盘和内存占用。
-
-
在 Elasticsearch 中,是怎么根据一个词找到对应的倒排索引的?
当用户发起搜索时(比如查询“A”),ES会
-
词项标准化与查询分析:ES会使用与索引创建时相同的分析器(Analyzer)对该查询词进行处理。
-
定位词项字典:Elasticsearch 的倒排索引是**分段(Segment)**存储的。每个段(Segment)是一个独立的、不可变的倒排索引结构。系统需要在所有相关的段中查找目标词项。
每个段内部包含一个词项字典(Term Dictionary),用于存储所有唯一的词项。为了实现极快的查找,Elasticsearch 使用一种高效的内存数据结构——**FST(Finite State Transducer,有限状态转换器)或自动补全树(Automaton)**来索引词项字典。
当查询词被标准化后,ES会:
- 遍历每个段的 FST 结构。
- 在 FST 中快速判断 “A” 是否存在。
- 如果存在,FST 会返回该词项在**词项字典文件(.tim 文件)**中的偏移量(Offset)。
-
读取词项字典详情:通过上一步得到的偏移量,Elasticsearch 从磁盘的
.tim
文件中读取该词项的详细信息。 -
获取倒排序表:根据详细信息,ES会读取读取包含该词项的所有文档ID列表(Doc ID)、位置信息和附加信息->倒排序表
-
合并多端结果
-
-
如何在保留不变性的前提下实现倒排索引的更新?
不直接修改已存在的索引,而是通过引入新的、不可变的索引片段,并在查询时进行逻辑合并,即:将“更新”操作转化为“追加新数据 + 标记旧状态”,利用分段存储和后台合并机制,在查询时提供一个融合了所有变更的逻辑视图。
这种方法牺牲了实时合并的存储效率(存在冗余和删除标记),但换来了极高的写入性能、查询性能和系统稳定性,是搜索引擎在海量数据场景下的最佳实践。
-
lucence 内部结构是什么?
分段式、不可变倒排索引。
- 分段:实现高效写入和增量更新
- FST+排序文件:实现毫秒级词项定位和倒排列表读取
- 正向索引:支持按ID获取原文
- 删除标记:在不修改旧段的前提下实现删除
- 段合并:后台优化存储和查询性能
-
是否了解字典树?
字典树(Trie,又称前缀树或单词查找树)是一种专门用于高效存储和检索字符串集合的树形数据结构。
基本结构与特点:
- 根节点为空
- 路径表示字符
- 节点存储信息
- 公共前缀共享路径
-
讲一下elasticsearch和mysql 的区别
- MySQL 可以用于存储和管理结构化数据,擅长处理事务类型的操作,可以确保数据的安全和一致性;
- 而 Elasticsearch 可以用于快速搜索和分析这些海量数据。不支持事务型操作
在这种情况下,可以将数据存储在 MySQL 中,并使用 Elasticsearch 对数据进行搜索和分析。
-
Elasticsearch为什么适合搜索?
-
基于倒排索引的核心机制:毫秒级响应
-
分布式架构:高可用性与无线扩展
索引被水平拆分为多个分片,分散到不同节点,实现并行查询和负载均衡。每个分片有多个副本,提升高可用性和读取吞吐(查询可负载到副本)。节点宕机后,集群自动将请求路由到副本,服务不中断。通过增加节点即可轻松扩展存储和计算能力,支撑 PB 级数据。
-
全文搜索与相关性计算
-
近实时搜索
-
灵活的数据模型与动态映射
- JSON 文档模型:以 JSON 格式存储数据,天然适合半结构化/非结构化数据(如日志、用户行为)。
- 动态映射(Dynamic Mapping):首次写入新字段时自动推断类型并建立索引,无需预先定义 Schema,开发效率高。
- 支持多种数据类型:文本、数字、日期、地理位置、嵌套对象、向量(用于语义搜索)等。
-
-
Elasticsearch的原理和结构是怎样的?
通过分片实现水平扩展,通过副本保障高可用,通过倒排索引实现快速检索,通过不可变段+合并实现高效更新。
-
ES为什么这么快?/近实时搜索
内存缓冲refresh+定期刷新flush:新文档先写入内存缓冲区和事务日志(translog),每秒刷新一次生成新的可搜索段(segment)。
存储机制
-
String类型在ES中是怎么存储的?
以text或者keyword进行存储
- 要搜索内容 → 用
text
- 要精确匹配、分组、排序 → 用
keyword
- 两者可结合使用
- 要搜索内容 → 用
-
列式存储与行式存储的区别是什么?列式存储的优势有哪些?
- 行式存储:MySQL、PostgreSQL 等数据库,按“行”组织数据,同一行的所有字段连续存储在磁盘上。
- 列式存储:Elasticsearch按“列”组织数据,同一列的所有值连续存储。相比于行式存储,列式存储具有高效的聚合分析、高压缩比、快速排序和去重、减少内存占比等优势。
-
你了解Elasticsearch的Segment吗?
Segment段是一个独立、完整且不可变的倒排索引单元。可以将其想象成数据库中的一个“小表”,Elasticsearch 的整个索引由一个或多个 Segment 组成。
-
说一下Elasticsearch的Refresh机制
Refresh 是 Elasticsearch 将内存中的新文档刷新(Flush)到可搜索的倒排索引段(Segment) 的过程。执行一次
refresh
后,新数据即可被查询,但尚未持久化到磁盘。 -
你知道Elasticsearch的Flush操作吗?
将内存中待持久化的数据强制写入磁盘的过程。
- 它通过定期将 Segment 刷盘并清空 Translog,确保数据在故障时可恢复。
- 与
refresh
配合,实现了 “近实时搜索” 与 “数据持久性” 的完美平衡。
-
什么是Merge操作?
Merge(段合并)是指将多个较小的、已持久化的段合并成一个更大的段,并删除原始的小 Segment 文件的过程。
特点:后台异步执行、不可变性保障(原 Segment 不变,新 Segment 写完后原子替换。)、资源可控。
-
ES如何保证数据不丢失?
通过的 “内存写入 + 持久化日志 + 定期刷盘 + 故障恢复” 机制,在保证高写入性能的同时,最大限度地防止数据丢失。
其核心是 事务日志(Translog) 和 刷新(Refresh)/刷盘(Flush) 的协同工作。
集群架构
-
说说你们公司 es 的集群架构,索引数据大小,分片有多少?
多集群架构:生产集群+日志集群+冷热分离集群
索引数据量:单索引:TB级;集群总量:PB级
分片策略:
- 单索引主分片数:根据数据量动态调整(如 3, 5, 10, 20)
- 副本数:
1
(热数据)或0
(冷数据,靠快照) - 总分片数:数万至数十万(需控制在 5万/节点)
-
分片机制是如何实现分布式集群的?
通过将数据逻辑上拆分、物理上分布,让多个节点协同工作,如同一个整体。
-
分片和副本有什么区别?
分片负责“拆分数据以实现扩展”,副本负责“复制数据以实现高可用”。
-
你了解分段机制吗?
Segment (段)是ES底层中最小的、独立的、不可变的倒排索引单元。类似于数据库中的一个“小索引文件”,一个 Elasticsearch 的分片(Shard)由一个或多个段(Segment) 组成。
Master选举与脑裂
-
Elasticsearch 的分布式原理是什么?
Elasticsearch 的分布式原理,是通过“分片实现水平扩展、副本保障高可用、主节点管理集群状态、协调节点处理请求、Translog 保证数据安全”的协同机制,将多个节点无缝整合为一个高性能、高可用、可扩展的分布式搜索与分析引擎。
-
Elasticsearch是如何实现Master选举的?
Voting Caster(投票候选者)机制 :只有明确配置的专用主节点(
node.roles: master
)才能参与投票和被选举,集群启动时从cluster.initial_master_nodes
列表中选出初始候选组,选举过程中必须获得多数投票候选者(Quorum)的支持才能成为主节点,从而确保在任何网络分区或节点故障下,最多只有一个主节点被选出,有效防止了脑裂问题。 -
Elasticsearch 重要的节点(比如公共 20 个),其中的 10 个选了一个master,另外 10 个选了另一个 master,怎么办?
这种情况就是典型的 “脑裂”(Split-Brain) 问题:一个集群因网络分区被分裂成两个独立的子集群,每个子集群都选举出了自己的主节点。这会导致数据不一致、写入冲突、服务混乱,是非常危险的状态。
在正确配置的 Elasticsearch 7.x+ 集群中,即使网络分裂为两个 10 节点组,也不会出现“双主”。因为只有包含多数投票候选者的分区才能选出主节点,另一个分区将自动停止服务以保证数据安全。这是 ES 分布式设计的“安全底线”。若发生脑裂,通常是配置错误所致,需立即修复并从备份恢复。
-
Elasticsearch是如何避免脑裂现象的?
采用投票候选者机制进行Master选举
-
Elasticsearch 集群脑裂问题如何解决?
- 手动隔离:手动关闭其中一个分区的所有节点,防止数据进一步分裂。
- 数据恢复:从快照(Snapshot)恢复数据。或者选择一个“正确”的分区作为主集群,重新加入另一个分区(需清空其数据)。
- 修复配置:升级到7.x
- 预防:
- 永远不要让所有数据节点成为主候选
- 使用奇数个专用主节点
- 启用网络分区检测和告警
节点协调与负载
-
节点和分片是如何协调的?
Elasticsearch 通过**“主节点管理分片分布、协调节点调度请求、数据节点执行本地操作”**的三级协作模式,实现了节点与分片之间的自动化、高可用、高性能协调,让整个集群像一个统一的整体对外服务。
-
客户端在和集群连接时,如何选择特定的节点执行请求的?
客户端连接集群时,通常将请求发送给任意一个节点(如负载均衡器后端),该节点作为协调节点接收请求,根据文档的
_id
或routing
计算出目标分片,再将请求内部转发到持有该分片的节点执行,最终合并结果返回,整个过程对客户端透明。 -
你遇到过数据倾斜问题吗?如何处理?
遇到过,对于某些热点文档,会被频繁访问
数据倾斜问题是指数据在分片或节点之间分布不均
- 对于索引主分片数过少(如 1 个),使用 Index Rollover 滚动索引,避免单索引无限增长。
- 对于自定义
routing
导致某些值的数据集中写入同一分片,使用复合 routing 或哈希扰动,提升分布均匀性。 - 对于某些文档被频繁查询或更新,增加副本数,分散读压力;或者使用缓存层(如 Redis)缓存热点数据。
- 对于新旧数据混存,新数据写入压力大问题,采用冷热架构,热节点(SSD)处理新数据写入、冷节点(HDD)存储旧数据。或者使用 ILM(索引生命周期管理) 自动迁移。
-
什么是长尾问题?
少数慢查询拖垮整体体验:绝大多数查询请求集中在少数热门数据上(头部),而大量查询分布在海量的、不常被访问的数据上(尾部),这些“尾部”查询虽然单个响应快,但数量庞大,累积耗时极长,导致整体查询延迟的“长尾”现象——即大部分用户的实际体验远差于平均响应时间。
解决方案:
-
优化慢查询和索引结构。
-
合理规划集群架构(冷热分离、角色分离)。
-
使用缓存和限流。
-
数据写入与更新
-
详细描述一下 Elasticsearch 索引文档的过程/es 写数据的过程是怎样的?
客户端请求先被路由到主分片,数据写入内存缓冲区并追加到持久化的事务日志(Translog),返回客户端确认,确认后同步到副本分片,随后每秒通过refresh生成可搜索的段,最后定期通过flush将段刷写到磁盘。
通过“内存写入 + 日志持久化 + 分布式复制”的协同,实现了高吞吐、近实时、高可靠的写入模型。
-
写数据的底层原理是什么?
Elasticsearch 写数据的底层原理是基于 Lucene 的倒排索引机制 和 分布式系统的日志先行(WAL)模式,通过 内存写入 + 事务日志 + 分片复制 + 定期持久化 的协同,实现高性能、近实时、高可靠的写入。
-
文档索引步骤顺序是什么?
- 客户端请求被路由主分片
- 写主分片内存缓冲区+事务日志
- 同步副本+响应客户端
- 每秒refresh生成可搜索的段
- 定期flush段持久化磁盘
- 后台合并段
-
新增的文档怎么快速和旧文档一起被检索?
新增文档通过每秒一次的refresh操作,被快速构建成新的可搜索的段,而查询会并行扫描所有的段(新的和旧的),结果合并返回。
- 每个 Segment 是一个独立的倒排索引。
- 查询时,Elasticsearch 会广播请求到所有 Segment(无论新旧)。
更新删除
-
详细描述一下 Elasticsearch 更新和删除文档的过程
标记 + 延迟物理清除
-
客户端发送删除请求
-
路由到主分片
-
写入删除标记
-
同步副本分片
-
响应客户端
-
refresh后不可见
后续查询时会忽略被标记删除的段
-
物理删除
在后台合并时,会跳过被标记删除的文档,生成的新段中将不再包含这些文档,旧段将被删除,空间回收
-
-
ES更新一个文档,它的操作步骤是什么样子的?
ES更新一个文档的操作步骤是基于其底层的不可变段的特性,通过“先获取旧文档,在写入新文档”的方式来实现:
- 客户端请求路由到主分片
- 获取旧文档
- 合并生成新文档
- 版本检查
- 写入主分片内存+事务日志
- 同步副本
- 响应成功
- refresh后新文档可搜
- 合并后旧文档被物理删除
高并发写入
-
写压力大时怎么处理?
批量写入、调大refresh间隔、临时关闭副本、增加分片、使用扩展集群等
-
海量数据如何写入es?
-
使用消息队列解耦(Kafka/RabbitMQ)
将数据先写入消息队列,防止突发流量压垮ES
消息者从队列中批量拉取数据写入ES
-
批量写入
使用bulkAPI批量提交文档
减少网络开销和IO次数
-
索引滚动
避免单个索引过大
当索引达到大小或时间阈值时,自动创建新索引并切换写入目标
-
合理设置分片数
单分片不宜过大
初始分片数=数据节点数x1~2(分片数不可变,需要提前规划)
-
冷热架构
热节点:SSD、高内存、高CPU、负责新数据写入和查询
冷节点:HDD、低配,存储旧数据,只读
使用ILM(索引生命周期管理)自动迁移
-
多消费者并行写入
多个消费者进程/线程并行从 Kafka 拉取不同分区数据。
并行写入 ES 不同分片,最大化吞吐。
-
-
在并发情况下,Elasticsearch 如何保证读写一致?
ES通过“主分片串行写+乐观并发控制+近实时可见性”保证了写操作的原子性和顺序性,通过“每秒refresh”实现近实时读,但在高并发下不保证强一致性,因为其设计目标是高可用和高性能,而非严格的 ACID 事务。它提供的是最终一致性和版本化并发控制。
主分片串行写:所有写操作必须在主分片上执行,主分片串行处理写请求,确保操作顺序一致,执行成功后,再同步到副本分片
乐观并发控制OCC:每个文档有个版本号,每次修改递增,更新时可以指定版本号,如果版本不匹配,返回409 Conflict,防止后写覆盖前写的并发问题
搜索与查询
搜索流程
-
详细描述一下 Elasticsearch 搜索的过程
搜索分为两个阶段:Query 阶段 和 Fetch 阶段(适用于
from + size
分页)。协调节点将查询广播到所有分片 → 每个分片在本地倒排索引中查找并排序 top-N 结果 → 协调节点合并结果确定全局 top-N → 再向分片获取完整文档 → 组装返回,通过“查询-获取”两阶段和并行执行,实现海量数据的毫秒级搜索。
-
Query阶段是如何工作的?
协调节点将查询广播到所有相关分片,每个分片再本地利用倒排序索引查找匹配文档,计算相关性得分,并保留排序后的前N个文档ID和得分,然后将这些结果返回给协调节点进行下一步合并。
-
Fetch阶段是如何工作的
协调节点在 Query 阶段确定全局排序后的目标文档列表,然后向这些文档所在的具体分片发送请求,获取完整的文档内容,最后将所有返回的完整文档组装成最终结果返回给客户端。
分词与查询
-
分词器的分词流程是怎样的?
分词流程是一个三阶段处理过程
- 首先通过分词过滤器对原始文本进行预处理
- 然后通过分词器将文本按规则切分成独立的词语单元
- 最终通过令牌过滤器将这些词语进行加工处理(如转小写、去除停用词、同义词扩展、词干提取等)
-
ES你是用过什么样的接口去搜索的?比如搜索一个关键字,你是怎么去搜索的?
使用过**
_search
进行全文检索、结构化查询、聚合、排序等;_msearch
进行批量搜索;_count
返回匹配文档的数量;_suggest
搜索建议(如自动补全、拼写纠错);_explain
**解释某个文档是否匹配查询,并展示得分计算过程。搜索关键字,会将搜索请求发送到_search接口,通过match查询将请求广播到所有分片,在每个分片的倒排序索引中并行查找、打分,协调节点合并结果后获取完整文档
-
title的类型是什么类型(设置ES索引的时候)?
对于
title
字段,推荐使用text
类型为主,并通过fields
添加keyword
子字段,兼顾搜索与结构化操作。 -
ES的深度分页与滚动搜索scroll是什么?
-
深度分页使用from+size,性能随着页数增加急剧下降,适用于实时分页查询
-
滚动搜索scroll基于快照和上下文,适合高效遍历大量数据,但非实时且占用内存,适用于批量处理场景
-
性能优化与调优
索引优化
-
建立索引阶段性能提升方法有哪些?
- 使用批量写入(Bulk API)减少网络开销
- 暂时调大refresh间隔以降低生成段的频率
- 写入期间将副本数设为0以减轻同步压力
- 合理设置分片数避免单分片过大
- 通过消息队列(卡夫卡或者RabbitMQ)削峰填谷实现流量平滑
- 利用索引滚动和ILM策略管理生命周期
-
elasticsearch 索引数据多了怎么办,如何调优?说一下你了解的调优手段
当 Elasticsearch 索引数据量变大后,容易出现查询变慢、写入延迟、节点资源(CPU、内存、磁盘 I/O)过载等问题。
索引设计优化:
-
合理设置分片数
单个分片建议控制在 30~50GB 之间。
分片数 = 数据节点数 × 1~2(避免过多分片导致开销大)。例如500GB 数据 → 设置 10~15 个主分片。
-
使用索引滚动+ILM
按大小(如 50GB)或时间(如 1 天)自动创建新索引。
配合ILM实现冷热节点分离
聚合优化
-
Elasticsearch 对于大数据量(上亿量级) 的聚合如何实现?
查询时各分片在本地对数据进行聚合,仅返回部分结果,协调节点再将这些中间结果进行二次合并与排序,最终生成全局聚合结果;对于高基数字段(如 UV),使用 HyperLogLog++ 等近似算法在有限内存下实现高效估算,兼顾精度与性能,从而在大规模数据场景下仍能快速返回聚合结果。
系统调优
-
Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?
- 提升文件句柄和线程数限制
- 增大 vm.max_map_count
- 关闭swap
- 锁定JVM内存
- 选用XFS文件系统并禁用atime
-
对于垃圾回收( GC) 方面,在使用 Elasticsearch 时要注意什么?
GC调优的核心是合理设置堆内存(<=32GB,不超过物理内存的50%)、使用G1GC回收器、避免大聚合和fielddata膨胀、通过监控及时发现GC停顿
ES 是 JVM 应用且依赖堆内存管理索引结构、查询缓存等,不当的 GC 行为会导致长时间停顿(Stop-The-World),引发节点脱离集群、查询超时等问题。
部署与运维
-
elasticsearch如何部署?ES应用你是怎么部署的?
Elasticsearch 常见部署方案包括:单节点(开发)、三节点集群(生产最小)、主从分离、冷热架构、跨机房容灾、容器化(K8s)和云托管服务
在我的项目开发中,使用单点部署ES
- 在容器内创建网络
- 加载ES镜像
- 运行容器:部署ES,部署kibana,在kibana可以编写DSL操作ES
在我的实习开发中,使用K8s部署ES,主要是通过ES官方提供的ECK扩展实现的,定义了一个ES自定义资源(CR),即可自动化完成集群的创建、配置、扩缩容、备份与监控等操作,极大简化了 ES 在容器环境中的运维复杂度,同时具备良好的弹性和高可用性
-
如何监控 Elasticsearch 集群状态?
Elasticsearch 自带监控(基础)
-
Cluster Health API:查看集群整体状态
-
Nodes Stats API:查看节点资源使用
-
Indices Stats API:查看索引级指标
监控 Elasticsearch 集群应结合 Kibana Monitoring 或 Prometheus + Grafana,重点关注集群健康、JVM 内存、GC、磁盘使用率、线程池队列和搜索/写入性能,并设置关键告警,实现对集群状态的实时感知与快速响应。
-
数据同步与一致性
-
数据库修改信息如何同步ElasticSearch?/怎样进行数据同步?/如何考虑es和MySQL一致性?
通常是通过监听数据库变更日志(Binlog )实现,通过捕获数据库的增删改操作,将变更事件发送到消息队列(如卡夫卡),再由消费者服务消费这些事件,实时更新或删除 Elasticsearch 中对应的文档,从而保证两者数据一致性,避免了轮询带来的性能开销和延迟。
-
项目中你的数据是怎么灌入ES的?
使用Kafka+消费者程序进行异步解耦写入,业务系统将数据变更事件(增删改操作)发送到卡夫卡消息队列,由独立的消费者程序从卡夫卡队列中订阅这些消息,解析后通过BulkAPI批量写入ES,即使 ES 暂时不可用,数据也会在 Kafka 中持久化,保障数据不丢失。
-
如果用消息队列异步写入的话,消息丢失怎么办?
例如在使用卡夫卡进行异步写入的过程中,为了防止消息丢失,需要从生产端、消息队列自身、消费端三个环节进行可靠性保障
- 生产者启用确认机制(acks=all),确保消息成功写入
- Kafka配置多副本和持久化,防止节点故障丢失数据
- 消费者提交偏移量前必须先确认ES写入成功并启用重试机制,结合死信队列处理异常消息,从而实现全流程的“至少一次”投递,保障数据不丢失。
应用场景与实战
-
ElasticSearch的主要功能及应用场景是什么?
Elasticsearch 是一个分布式的搜索与分析引擎,主要功能包括全文检索、结构化查询、聚合分析、高亮、排序和近实时数据处理;它广泛应用于日志分析(如 ELK 架构)、企业级搜索(电商、内容检索)、监控系统(指标存储与可视化)、安全分析(SIEM)和数据探索等场景,能够高效处理海量数据并支持复杂查询,是大数据时代核心的数据检索与分析组件。
-
实习中的ElasticSearch为什么要用?为啥不直接查Mysql?
MySQL 是关系型数据库,擅长事务处理和精确查询,而 Elasticsearch 是分布式搜索引擎,专为海量数据的全文检索、复杂查询和高并发低延迟搜索场景优化。通过MySQL 保数据一致性,ES 做搜索与分析,通过数据库变更日志(Binlog )同步数据,实现读写分离、各司其职。
-
针对文字,ES可以用倒排索引,你知道ES针对地图如何构建索引吗?
Elasticsearch 针对地图(地理位置)数据采用 Geo Hash + 树结构编码 和 **空间索引(Spatial Indexing)**技术来构建索引,而不是使用倒排索引来直接处理经纬度坐标。