ES底层原理深度剖析

引言

Elasticsearch(简称ES)是一个开源的分布式搜索引擎,底层是基于 Apache Lucene 构建的分布式搜索引擎,广泛用于构建实时搜索、日志分析、数据可视化等应用。在本文中,我们将深度剖析 Elasticsearch 的底层原理,包括其基本架构、数据存储、索引结构、搜索流程等,并结合代码和使用场景进行介绍。

关于es的入门使用请参考: ElasticSearch入门介绍和实战-CSDN博客

1. 基本架构

  • Node: Elasticsearch 集群中的每个实例称为一个 Node,每个 Node 都可以承载多个索引和分片。
  • Index: Index 是文档的逻辑分组,类似于数据库中的表,每个 Index 包含多个 Document。
  • Document: Document 是 Elasticsearch 存储的基本数据单元,类似于数据库中的记录。
  • Shard: Shard 是 Index 的物理分片,每个 Index 可以分为多个 Shard,每个 Shard 都是一个独立的 Lucene 索引。
  • Replica: Replica 是 Shard 的副本,用于提高数据的可靠性和可用性。

2. 数据存储

Elasticsearch 使用倒排索引(Inverted Index)来加速搜索,其数据存储结构主要包括以下几个组件:

  • Index Buffer: Index Buffer 是 Elasticsearch 内存中的缓冲区,用于存储新写入的文档。
  • Translog: Translog 是 Elasticsearch 的事务日志,用于持久化写入的文档,保证数据的可靠性。
  • Segment: Segment 是 Lucene 的基本存储单元,每个 Shard 包含多个 Segment,Segment 存储了文档的倒排索引、词典等信息。
  • Merge: Merge 是 Elasticsearch 的后台任务,用于将多个小的 Segment 合并为一个更大的 Segment,提高查询效率。

3. 索引结构

Elasticsearch 的索引结构由 Mapping、Analyzer 和 Tokenizer 组成:

  • Mapping: Mapping 定义了索引中文档的字段和数据类型,类似于数据库中的表结构。
  • Analyzer: Analyzer 定义了如何对文档进行分词和处理,例如将文本转换为小写、去除停用词等。
  • Tokenizer: Tokenizer 定义了如何对文本进行分词,例如按照空格、逗号等字符进行分词。

每个索引的数据被组织成多个 Lucene 索引段(Segment),每个段包含了该索引的部分数据,包括文档、倒排索引、词典等信息。每个段由一个或多个 .cfs 文件和多个 .cfe 文件组成,其中 .cfs 文件存储了压缩的文档数据,.cfe 文件存储了段信息、倒排索引、词典等数据。 

4. 搜索流程

Elasticsearch 的搜索流程主要包括 Query 解析、查询执行和结果返回等步骤:

  • Query 解析: Elasticsearch 接收到查询请求后,首先进行 Query 解析,将用户输入的查询字符串转换为 Query DSL。
  • 查询执行: Elasticsearch 根据 Query DSL 在倒排索引中进行搜索,匹配相关的文档,并计算文档的相关性得分。
  • 结果返回: Elasticsearch 将搜索结果按照相关性得分排序,并返回给用户,同时支持分页、排序等功能。

5. 写入流程

当有新的文档写入时,写入流程包括以下几个步骤:

  • Document Buffering: 新写入的文档首先被缓存在内存中的 Document Buffer 中,等待被刷新到磁盘。
  • Translog Writing: 新写入的文档被异步写入 Translog 中,保证写入的持久化和可靠性。
  • Segment Creation: 当 Document Buffer 中的文档数量达到一定阈值或定时刷新时,将文档刷新到磁盘,并创建新的 Lucene 索引段
  • Merge Process: 定期执行 Merge 过程,将多个小的 Lucene 索引段合并为一个更大的段,优化查询性能和磁盘空间利用。

6. 读取流程

当执行查询/搜索操作时,读取流程包括以下几个步骤:

  • Query Parsing: 解析查询请求,将查询字符串转换为 Lucene 查询对象。
  • Query Execution: 在倒排索引中执行查询,匹配相关的文档,并计算文档的相关性得分。
  • Result Retrieval: 将搜索结果按照相关性得分排序,并返回给用户,支持分页、排序等功能。

7. 使用场景

Elasticsearch 可以广泛应用于各种场景,包括实时搜索、日志分析、数据可视化等:

  • 实时搜索: Elasticsearch 提供了强大的全文搜索能力,可以用于构建实时搜索引擎,例如电商网站的商品搜索、新闻网站的内容搜索等。
  • 日志分析: Elasticsearch 可以用于实时分析和可视化大规模日志数据,例如监控系统的日志分析、安全事件检测等。
  • 数据可视化: Elasticsearch 结合 Kibana 工具,可以实现实时数据可视化和仪表盘展示,例如实时监控系统的性能指标、用户行为分析等。

8. 总结

在实际应用中,我们可以根据具体的业务需求和性能要求,合理地设计和配置 Elasticsearch 的索引结构、数据存储方式、写入流程和读取流程等,以达到最佳的性能和可用性。也需要注意监控和调优 Elasticsearch 集群的各项指标和参数,及时发现和解决潜在的性能问题和故障,确保系统的稳定运行。

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Memory_2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值