Files
test-repo/docs/zh-cn/appendix/4-server-and-backend/search-engines.md
T
sanbuphy df51f84ab5 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) 同步更新
2026-02-25 12:22:49 +08:00

154 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 搜索引擎原理
::: 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/) - 开源的即时搜索引擎