docs: 重构 README 附录展示 & 新增多个附录交互组件

README 更新:
- 移除顶部 header.png 横幅图片
- 新增「附录知识库」板块,以 3×3 网格展示 9 大知识领域精选内容
- 附录链接指向部署版网站 (datawhalechina.github.io)
- 阶段表格新增「附录」行,突出 80+ 交互式专题
- 章节标题「新手入门 & PM」简化为「零基础入门」
- News 新增 2026-02-25 附录知识库更新条目

新增交互组件:
- 异步任务队列 (async-task-queues) 演示组件
- 文件存储 (file-storage) 演示组件
- 项目架构 (project-architecture) 演示组件
- 限流与背压 (rate-limiting) 演示组件
- 搜索引擎 (search-engines) 演示组件
- 计算机基础: AppLaunch/BiosUefi/OSBoot 等启动流程演示组件

新增附录文档:
- 前端项目架构 (frontend-project-architecture.md)
- 后端项目架构 (backend-project-architecture.md)

内容优化:
- 算法思维、数据结构、编程语言、调试艺术等多篇附录内容更新
- HTML/CSS 布局、请求旅程等前后端文档完善
- 附录索引页 (index.md) 同步更新
This commit is contained in:
sanbuphy
2026-02-25 12:22:49 +08:00
parent f44c842fe7
commit df51f84ab5
36 changed files with 8535 additions and 393 deletions
@@ -1,3 +1,153 @@
# 搜索引擎原理
> 待实现
::: tip 前言
**你在淘宝搜"红色连衣裙",0.1 秒内从几十亿商品中找到了最相关的结果——这背后是怎么做到的?** 搜索引擎是互联网最核心的基础设施之一,从 Google 到电商站内搜索,它的核心原理都是一样的:倒排索引 + 相关性排序。
:::
**这篇文章会带你学什么?**
学完这章后,你将获得:
- **倒排索引**:理解搜索引擎最核心的数据结构
- **分词技术**:了解中文分词的挑战和常见方案
- **相关性排序**:掌握 TF-IDF 和 BM25 的基本原理
- **Elasticsearch**:了解最流行的搜索引擎的架构和使用场景
- **搜索优化**:掌握同义词、纠错、高亮等实用搜索功能
| 章节 | 内容 | 核心概念 |
|-----|------|---------|
| **第 1 章** | 倒排索引 | 正排索引 vs 倒排索引 |
| **第 2 章** | 分词与分析 | 中文分词、停用词、词干提取 |
| **第 3 章** | 相关性排序 | TF-IDF、BM25 |
| **第 4 章** | Elasticsearch | 分布式架构、分片、副本 |
| **第 5 章** | 搜索优化 | 同义词、纠错、自动补全 |
---
## 0. 全景图:搜索的本质是什么?
搜索的本质是一个**信息检索(Information Retrieval**问题:给定一个查询,从海量文档中找到最相关的结果,并按相关性排序返回。
这个过程分为两个阶段:
- **索引阶段(离线)**:提前把所有文档处理好,建立高效的查找结构
- **查询阶段(在线)**:用户输入关键词时,快速找到匹配的文档并排序
::: tip 为什么不能用数据库 LIKE 查询?
`SELECT * FROM products WHERE name LIKE '%红色连衣裙%'` 看起来能搜索,但它需要**全表扫描**——逐行检查每条记录。当数据量达到百万级时,这种查询会慢到不可用。倒排索引把这个 O(n) 的操作变成了 O(1) 的查找。
:::
---
## 1. 倒排索引:搜索引擎的"心脏"
传统数据库用的是**正排索引**:从文档 ID 找到文档内容。而搜索引擎用的是**倒排索引**:从关键词找到包含它的文档列表。
<InvertedIndexDemo />
| 索引类型 | 方向 | 查找方式 | 适用场景 |
|---------|------|---------|---------|
| 正排索引 | 文档 → 内容 | 知道 ID,查内容 | 数据库主键查询 |
| 倒排索引 | 关键词 → 文档列表 | 知道关键词,查文档 | 全文搜索 |
::: tip 倒排索引的构建过程
1. **文档收集**:获取所有需要被搜索的文档
2. **分词(Tokenization**:将文档拆分为一个个词语
3. **建立映射**:记录每个词语出现在哪些文档中(以及出现位置、频率等)
4. **持久化存储**:将索引写入磁盘,支持快速查找
:::
---
## 2. 分词与文本分析
分词是搜索引擎的第一步,也是中文搜索的最大挑战。英文天然以空格分词,但中文没有分隔符——"乒乓球拍卖了"可以分成"乒乓球/拍卖/了"或"乒乓/球拍/卖/了"。
| 分词方式 | 说明 | 示例 |
|---------|------|------|
| 标准分词 | 按空格和标点切分(英文) | "hello world" → ["hello", "world"] |
| 中文分词 | 基于词典或模型切分 | "搜索引擎" → ["搜索", "引擎"] |
| N-gram | 按固定长度滑动窗口切分 | "搜索" → ["搜索", "索引"] |
| 自定义词典 | 添加业务专有词汇 | "iPhone16ProMax" 作为一个词 |
::: tip 文本分析管道
分词只是文本分析的一步,完整的管道包括:
1. **字符过滤**:去除 HTML 标签、特殊字符
2. **分词**:将文本拆分为词语(Token
3. **停用词过滤**:去除"的"、"了"、"是"等无意义的高频词
4. **同义词扩展**:将"手机"扩展为"手机、电话、移动电话"
5. **词干提取**:将 "running" 还原为 "run"(英文)
:::
---
## 3. 相关性排序:哪个结果最"相关"?
找到匹配的文档只是第一步,更重要的是**排序**——把最相关的结果排在最前面。
| 算法 | 原理 | 特点 |
|------|------|------|
| TF-IDF | 词频(TF) × 逆文档频率(IDF) | 经典算法,简单有效 |
| BM25 | TF-IDF 的改进版,加入文档长度归一化 | Elasticsearch 默认算法 |
| 向量检索 | 将文档和查询转为向量,计算余弦相似度 | 支持语义搜索 |
::: tip TF-IDF 直觉理解
- **TF(词频)**:一个词在文档中出现越多次,这个文档越可能与该词相关
- **IDF(逆文档频率)**:一个词在越少的文档中出现,它的区分度越高
- "的"在所有文档中都出现(IDF 低),所以搜索"的"没有意义
- "Elasticsearch"只在少数文档中出现(IDF 高),搜索它能精确定位
:::
---
## 4. Elasticsearch:最流行的搜索引擎
Elasticsearch 是目前最流行的开源搜索引擎,基于 Apache Lucene 构建,提供分布式、RESTful API 的全文搜索能力。
| 概念 | 说明 |
|------|------|
| Index | 类似数据库的"表",存储同类文档 |
| Document | 一条记录,JSON 格式 |
| Shard | 分片,将索引拆分到多个节点 |
| Replica | 副本,提供高可用和读扩展 |
| Mapping | 字段类型定义,类似数据库 Schema |
| Analyzer | 文本分析器,定义分词规则 |
::: tip ES vs 数据库
Elasticsearch 不是用来替代数据库的,而是作为搜索层与数据库配合使用。典型架构:数据写入数据库 → 同步到 ES → 搜索请求走 ES → 详情请求走数据库。
:::
---
## 5. 搜索优化:让搜索更"聪明"
| 优化手段 | 说明 | 效果 |
|---------|------|------|
| 同义词 | "手机"也能搜到"电话" | 提高召回率 |
| 拼写纠错 | "iphoen" 自动纠正为 "iphone" | 容错性 |
| 自动补全 | 输入"苹"提示"苹果手机" | 提升体验 |
| 高亮 | 搜索结果中标红匹配词 | 直观展示 |
| 权重调整 | 标题匹配权重 > 内容匹配 | 提高精确度 |
| 过滤与聚合 | 按价格区间、品牌筛选 | 缩小范围 |
---
## 总结
搜索引擎是互联网应用的核心基础设施。理解倒排索引、分词、相关性排序这三个核心概念,就掌握了搜索引擎的本质。
回顾本章的关键要点:
1. **倒排索引**:从关键词到文档的反向映射,是搜索引擎的核心数据结构
2. **分词是基础**:中文分词是搜索质量的关键,需要选择合适的分词器
3. **BM25 排序**:基于词频和文档频率的相关性评分,是 ES 的默认算法
4. **ES 架构**:分片 + 副本实现分布式和高可用
5. **搜索优化**:同义词、纠错、补全让搜索更智能
## 延伸阅读
- [Elasticsearch 官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html) - 最权威的 ES 参考
- [Elasticsearch 权威指南](https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html) - 中文入门指南
- [Apache Lucene](https://lucene.apache.org/) - ES 底层的搜索引擎库
- [MeiliSearch](https://www.meilisearch.com/) - 轻量级搜索引擎,适合中小项目
- [Typesense](https://typesense.org/) - 开源的即时搜索引擎