Elastic Stack


我们从一个简单的比喻开始。可以将 Elastic Stack 想象成一个高效的图书馆系统:

  1. Elasticsearch:图书馆的书架和检索系统

Elasticsearch 就是图书馆的书架和信息检索系统。当你来到图书馆时,想找某本书或查询某个主题,Elasticsearch 就是帮助你快速找到相关书籍并呈现给你答案的系统。它的检索速度特别快,因为它使用了“倒排索引”,就像图书馆的书籍按主题快速分类,而不是一页一页翻。查询时,它能直接定位到相关的主题,而不是逐一检查每本书。

为什么检索速度这么快?

想象一下,如果你需要查找一本特定主题的书,每次都要从头到尾翻阅每本书,效率非常低。倒排索引的作用就像是为每本书创建了一个索引目录,记录每个关键词和它在书中的位置。这样,查询时,系统就能迅速找到包含关键词的书,而无需逐本书查找,大大加速了检索过程。

  1. Logstash:图书馆的图书管理员

Logstash 就是图书馆中的图书管理员,负责收集和整理书籍。在 Elastic Stack 中,Logstash 负责将各种数据源(如日志文件、数据库等)收集进来,清洗、过滤并转换成 Elasticsearch 能理解的格式。它还可以根据需要进行数据增强、格式化等工作。

  1. Beats:图书馆的传感器

Beats 就像是图书馆里的“传感器”,用于实时监控和收集来自各个角落的信息。它们能够以轻量级的方式,将各种实时数据(如操作日志、系统监控数据等)发送给 Logstash 或直接发送到 Elasticsearch。比如,Filebeat 用于监控日志文件,Metricbeat 用于收集服务器的性能数据。

  1. Kibana:图书馆的展示与分析工具

Kibana 就像是图书馆里的展示柜或查询台,专门用来展示和可视化 Elasticsearch 中存储的数据。它提供了一个友好的界面,帮助用户创建图表、仪表盘、进行数据分析,并直观地展示查询结果。

各组件如何协同工作:

Beats:收集实时数据,类似“传感器”。

Logstash:接收、处理、转换数据,像“图书管理员”一样进行整理。

Elasticsearch:将处理过的数据存储在索引中,像“图书馆书架”一样管理数据,并快速检索。

Kibana:展示和可视化数据,类似“展示柜”展示信息。

这种结构让 Elastic Stack 不仅能够高效地处理大规模数据,还能实时分析和展示,让我们更方便地进行决策。

倒排索引

这一步是理解 Elasticsearch 的“分水岭”。一旦你真正理解了倒排索引,后面的 Query DSL、聚合、性能调优都会变得顺理成章。下面我会从零、从底层、用可落地的例子来讲。

  • 一、什么是倒排索引(Inverted Index)——先打破直觉
  1. 先看“正排索引”(人类的直觉)

假设我们有 3 条文档(Document):

文档 ID 内容 1 Apple Pie is delicious 2 Apple is a fruit 3 I like Pie

正排索引的思路是:

“每个文档里有什么内容?”

Doc 1 → Apple, Pie, is, delicious Doc 2 → Apple, is, a, fruit Doc 3 → I, like, Pie

如果你要搜索 Apple:

系统必须 从 Doc1 → Doc2 → Doc3 全部扫描

判断每条文档是否包含 Apple

这就是 数据库全文 LIKE ‘%Apple%’ 的本质 👉 数据量一大,性能灾难

  1. 倒排索引:把关系“倒过来”

倒排索引的核心思想是:

“每个词(Term)出现在哪些文档中?”

构建倒排索引后,结构变成这样: 词(Term) 出现的文档 ID Apple 1, 2 Pie 1, 3 is 1, 2 delicious 1 a 2 fruit 2 I 3 like 3

这张表,本身就是 Elasticsearch 最核心的数据结构之一。

三、查询是如何“快如闪电”的 搜索 Apple

Elasticsearch 不会扫描文档,而是:

分词:Apple → apple

查倒排索引:

apple → [1, 2]

直接返回 Doc 1 和 Doc 2

复杂度接近:

O(1) + 结果集大小

搜索 Apple AND Pie

查两个倒排表:

apple → [1, 2] pie → [1, 3]

求交集

→ [1]

👉 完全不依赖“数据总量”,只依赖“命中词项”