ES结构

集群 节点 分片 ——> https://blog.csdn.net/weixin_43639512/article/details/86736881

ES查询性能调优  ——> https://blog.csdn.net/jbjmh/article/details/139551306

 

ES查询过程 -- 获取文档ID+根据ID获取文档详细 

Elasticsearch 的读取过程是其高效搜索能力的核心,下面我将详细介绍其工作原理:

1. 读取流程概述
客户端请求:应用程序发送查询请求

路由与分发:协调节点接收请求并确定相关分片

分片查询:并行向所有相关分片(主分片或副本)发送查询

结果合并:协调节点收集各分片结果并合并排序

返回结果:将最终结果返回给客户端

2. 读取详细过程
2.1 查询阶段(Query Phase)
查询解析:协调节点解析查询DSL,确定查询类型(全文/精确/聚合等)

分片选择:根据路由信息确定需要查询的分片列表

并行查询:

向所有相关分片(包括副本)发送查询请求

每个分片在本地执行查询

返回匹配文档的ID和排序值(不返回完整文档)

结果合并:

协调节点收集所有分片结果

按照排序规则合并结果集

确定最终文档排名

2.2 取回阶段(Fetch Phase)
文档定位:根据查询阶段确定的文档ID列表

并行获取:

向存储这些文档的分片发送多文档获取请求(Multi-get)

每个分片返回完整文档内容和元数据

结果组装:

协调节点组装最终结果

可能应用高亮、字段过滤等后处理

3. 核心数据结构
3.1 倒排索引(Inverted Index)
词项→文档列表的映射

包含词频、位置等信息

支持快速全文检索

3.2 Doc Values
列式存储结构

用于排序、聚合和脚本访问

默认对所有非text字段启用

3.3 正向索引
文档ID→字段值的映射

用于获取完整文档内容

4. 查询类型与优化
4.1 查询类型
精确查询:Term/Terms查询,直接查找倒排索引

全文查询:Match/Match_phrase,经过分析器处理

复合查询:Bool/Dis_max等组合多个查询

聚合查询:基于Doc Values的统计分析

4.2 查询优化
查询改写:如将某些Bool查询改写为更高效的Filter查询

缓存机制:

查询缓存(Query Cache):缓存查询结果

请求缓存(Request Cache):缓存整个分片级别的结果

字段数据缓存(Fielddata Cache):用于聚合和排序

预过滤:使用Filter上下文跳过相关性评分计算

5. 分片查询策略
5.1 分片选择
根据路由信息确定目标分片

对于搜索请求,默认查询所有分片

可以设置preference参数控制分片选择

5.2 自适应副本选择(ARS)
7.0+版本特性

基于分片副本的响应时间和负载情况智能选择

提高查询性能和集群稳定性

6. 读取一致性
实时获取:通过realtime参数可以读取最新写入但未刷新的文档

版本控制:基于文档版本号避免读取旧数据

刷新控制:手动refresh可使写入立即可查

7. 性能影响因素
分片数量:过多分片增加查询开销

索引设计:合理的字段类型和映射

查询复杂度:嵌套/脚本/模糊查询等开销较大

硬件资源:SSD/I/O吞吐量/内存大小

JVM堆大小:影响缓存可用空间

Elasticsearch 的读取设计通过分布式并行查询、高效数据结构和多层缓存机制,实现了海量数据下的快速检索能力

 

3. ES写入过程——> https://blog.csdn.net/jbjmh/article/details/139551306

Elasticsearch 写入原理
Elasticsearch 的写入过程是一个复杂但高效的设计,下面我将详细介绍其核心原理:

1. 写入流程概述
客户端请求:应用程序发送文档到 Elasticsearch

路由与转发:请求到达协调节点,根据路由规则确定目标分片

主分片处理:文档首先写入主分片

副本同步:主分片将变更同步到所有副本分片

确认返回:所有副本确认后,返回成功响应给客户端

2. 写入详细过程
2.1 文档接收阶段
客户端可以通过 Index API 或 Bulk API 发送文档

文档首先到达协调节点(Coordinating Node)

协调节点根据文档ID的哈希值确定目标分片

2.2 主分片写入
事务日志(Translog)记录:首先将操作写入Translog,确保持久性

内存缓冲:文档被添加到内存缓冲区(In-memory buffer),此时写入到es内容是不可以查询的

refresh操作:定期(默认1秒)将内存缓冲区内容生成新的segment(可搜索但未持久化)

这使新文档在写入后很快可被搜索到

2.3 副本同步
主分片将变更并行发送到所有副本分片

副本分片执行相同的写入过程(Translog→内存缓冲→refresh)

主分片等待所有副本确认后才返回成功

2.4 持久化过程
flush操作:定期(或基于Translog大小)将内存中的segment写入磁盘

创建一个新的提交点(commit point)

清空Translog(旧的Translog会被删除)

segment合并:后台合并小segment为大segment,优化查询性能

3. 关键组件
3.1 倒排索引(Inverted Index)
写入时构建从词项到文档的映射

支持快速全文搜索

3.2 事务日志(Translog)
防止数据丢失的关键组件

所有操作首先写入Translog

在节点崩溃时用于恢复未持久化的数据

3.3 分段(Segment)机制
每个分片由多个不可变的segment组成

新文档写入新segment,旧segment只读

定期合并segment以提高性能

4. 写入优化参数
refresh_interval:控制刷新频率(平衡实时性与吞吐量)

translog.durability:async/sync,控制事务日志写入方式

number_of_replicas:副本数量(影响写入性能和数据安全性)

bulk API:批量写入大幅提升吞吐量

5. 一致性保证
Elasticsearch 提供不同级别的一致性控制:

quorum:大多数分片可用(默认)

one:主分片确认即可

all:所有分片必须确认

通过这种设计,Elasticsearch 实现了近实时搜索(NRT)与数据持久性的平衡,同时保证了高可用性和水平扩展能力。

 

ES写入性能调优——> 

https://blog.csdn.net/jbjmh/article/details/139551306

 

ES脑裂——> 

https://blog.csdn.net/qq_40991313/article/details/133942498

posted on 2025-07-07 10:14  colorfulworld  阅读(9)  评论(0)    收藏  举报