Elastic Stack
我们从一个简单的比喻开始。可以将 Elastic Stack 想象成一个高效的图书馆系统:
- Elasticsearch:图书馆的书架和检索系统
Elasticsearch 就是图书馆的书架和信息检索系统。当你来到图书馆时,想找某本书或查询某个主题,Elasticsearch 就是帮助你快速找到相关书籍并呈现给你答案的系统。它的检索速度特别快,因为它使用了“倒排索引”,就像图书馆的书籍按主题快速分类,而不是一页一页翻。查询时,它能直接定位到相关的主题,而不是逐一检查每本书。
为什么检索速度这么快?
想象一下,如果你需要查找一本特定主题的书,每次都要从头到尾翻阅每本书,效率非常低。倒排索引的作用就像是为每本书创建了一个索引目录,记录每个关键词和它在书中的位置。这样,查询时,系统就能迅速找到包含关键词的书,而无需逐本书查找,大大加速了检索过程。
- Logstash:图书馆的图书管理员
Logstash 就是图书馆中的图书管理员,负责收集和整理书籍。在 Elastic Stack 中,Logstash 负责将各种数据源(如日志文件、数据库等)收集进来,清洗、过滤并转换成 Elasticsearch 能理解的格式。它还可以根据需要进行数据增强、格式化等工作。
- Beats:图书馆的传感器
Beats 就像是图书馆里的“传感器”,用于实时监控和收集来自各个角落的信息。它们能够以轻量级的方式,将各种实时数据(如操作日志、系统监控数据等)发送给 Logstash 或直接发送到 Elasticsearch。比如,Filebeat 用于监控日志文件,Metricbeat 用于收集服务器的性能数据。
- Kibana:图书馆的展示与分析工具
Kibana 就像是图书馆里的展示柜或查询台,专门用来展示和可视化 Elasticsearch 中存储的数据。它提供了一个友好的界面,帮助用户创建图表、仪表盘、进行数据分析,并直观地展示查询结果。
各组件如何协同工作:
Beats:收集实时数据,类似“传感器”。
Logstash:接收、处理、转换数据,像“图书管理员”一样进行整理。
Elasticsearch:将处理过的数据存储在索引中,像“图书馆书架”一样管理数据,并快速检索。
Kibana:展示和可视化数据,类似“展示柜”展示信息。
这种结构让 Elastic Stack 不仅能够高效地处理大规模数据,还能实时分析和展示,让我们更方便地进行决策。
倒排索引
这一步是理解 Elasticsearch 的“分水岭”。一旦你真正理解了倒排索引,后面的 Query DSL、聚合、性能调优都会变得顺理成章。下面我会从零、从底层、用可落地的例子来讲。
- 一、什么是倒排索引(Inverted Index)——先打破直觉
- 先看“正排索引”(人类的直觉)
假设我们有 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%’ 的本质 👉 数据量一大,性能灾难
- 倒排索引:把关系“倒过来”
倒排索引的核心思想是:
“每个词(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]
👉 完全不依赖“数据总量”,只依赖“命中词项”