# 搜尋引擎原理

::: 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/) - 開源的即時搜索引擎
