搜索引擎原理
前言
你在淘宝搜"红色連衣裙",0.1 秒內從几十億商品中找到了最相關的結果——這背後是怎么做到的? 搜索引擎是互聯網最核心的基础設施之一,從 Google 到電商站內搜索,它的核心原理都是一样的:倒排索引 + 相關性排序。
這篇文章會带你學什么?
學完這章後,你将獲得:
- 倒排索引:理解搜索引擎最核心的數據結構
- 分词技術:了解中文分词的挑戰和常见方案
- 相關性排序:掌握 TF-IDF 和 BM25 的基本原理
- Elasticsearch:了解最流行的搜索引擎的架構和使用場景
- 搜索優化:掌握同義词、纠錯、高亮等實用搜索功能
| 章節 | 內容 | 核心概念 |
|---|---|---|
| 第 1 章 | 倒排索引 | 正排索引 vs 倒排索引 |
| 第 2 章 | 分词與分析 | 中文分词、停用词、词干提取 |
| 第 3 章 | 相關性排序 | TF-IDF、BM25 |
| 第 4 章 | Elasticsearch | 分布式架構、分片、副本 |
| 第 5 章 | 搜索優化 | 同義词、纠錯、自動补全 |
0. 全景图:搜索的本质是什么?
搜索的本质是一个信息檢索(Information Retrieval)問题:给定一个查询,從海量文檔中找到最相關的結果,并按相關性排序返回。
這个過程分為兩个階段:
- 索引階段(離线):提前把所有文檔處理好,建立高效的查找結構
- 查询階段(在线):用户輸入關鍵词時,快速找到匹配的文檔并排序
為什么不能用數據庫 LIKE 查询?
SELECT * FROM products WHERE name LIKE '%红色連衣裙%' 看起來能搜索,但它需要全表扫描——逐行檢查每條記錄。当數據量達到百万级時,這種查询會慢到不可用。倒排索引把這个 O(n) 的操作變成了 O(1) 的查找。
1. 倒排索引:搜索引擎的"心脏"
傳统數據庫用的是正排索引:從文檔 ID 找到文檔內容。而搜索引擎用的是倒排索引:從關鍵词找到包含它的文檔列表。
| 索引類型 | 方向 | 查找方式 | 適用場景 |
|---|---|---|---|
| 正排索引 | 文檔 → 內容 | 知道 ID,查內容 | 數據庫主鍵查询 |
| 倒排索引 | 關鍵词 → 文檔列表 | 知道關鍵词,查文檔 | 全文搜索 |
倒排索引的構建過程
- 文檔收集:獲取所有需要被搜索的文檔
- 分词(Tokenization):将文檔拆分為一个个词語
- 建立映射:記錄每个词語出現在哪些文檔中(以及出現位置、频率等)
- 持久化存儲:将索引写入磁盘,支持快速查找
2. 分词與文本分析
分词是搜索引擎的第一步,也是中文搜索的最大挑戰。英文天然以空格分词,但中文没有分隔符——"乒乓球拍卖了"可以分成"乒乓球/拍卖/了"或"乒乓/球拍/卖/了"。
| 分词方式 | 說明 | 示例 |
|---|---|---|
| 標準分词 | 按空格和標點切分(英文) | "hello world" → ["hello", "world"] |
| 中文分词 | 基于词典或模型切分 | "搜索引擎" → ["搜索", "引擎"] |
| N-gram | 按固定長度滑動窗口切分 | "搜索" → ["搜索", "索引"] |
| 自定義词典 | 添加業務專有词汇 | "iPhone16ProMax" 作為一个词 |
文本分析管道
分词只是文本分析的一步,完整的管道包括:
- 字符過滤:去除 HTML 標簽、特殊字符
- 分词:将文本拆分為词語(Token)
- 停用词過滤:去除"的"、"了"、"是"等无意義的高频词
- 同義词擴展:将"手機"擴展為"手機、電话、移動電话"
- 词干提取:将 "running" 還原為 "run"(英文)
3. 相關性排序:哪个結果最"相關"?
找到匹配的文檔只是第一步,更重要的是排序——把最相關的結果排在最前面。
| 算法 | 原理 | 特點 |
|---|---|---|
| TF-IDF | 词频(TF) × 逆文檔频率(IDF) | 經典算法,简單有效 |
| BM25 | TF-IDF 的改進版,加入文檔長度归一化 | Elasticsearch 默認算法 |
| 向量檢索 | 将文檔和查询轉為向量,計算餘弦相似度 | 支持語義搜索 |
TF-IDF 直觉理解
- TF(词频):一个词在文檔中出現越多次,這个文檔越可能與該词相關
- IDF(逆文檔频率):一个词在越少的文檔中出現,它的區分度越高
- "的"在所有文檔中都出現(IDF 低),所以搜索"的"没有意義
- "Elasticsearch"只在少數文檔中出現(IDF 高),搜索它能精确定位
4. Elasticsearch:最流行的搜索引擎
Elasticsearch 是目前最流行的開源搜索引擎,基于 Apache Lucene 構建,提供分布式、RESTful API 的全文搜索能力。
| 概念 | 說明 |
|---|---|
| Index | 類似數據庫的"表",存儲同類文檔 |
| Document | 一條記錄,JSON 格式 |
| Shard | 分片,将索引拆分到多个節點 |
| Replica | 副本,提供高可用和讀擴展 |
| Mapping | 字段類型定義,類似數據庫 Schema |
| Analyzer | 文本分析器,定義分词規则 |
ES vs 數據庫
Elasticsearch 不是用來替代數據庫的,而是作為搜索層與數據庫配合使用。典型架構:數據写入數據庫 → 同步到 ES → 搜索請求走 ES → 詳情請求走數據庫。
5. 搜索優化:讓搜索更"聪明"
| 優化手段 | 說明 | 效果 |
|---|---|---|
| 同義词 | "手機"也能搜到"電话" | 提高召回率 |
| 拼写纠錯 | "iphoen" 自動纠正為 "iphone" | 容錯性 |
| 自動补全 | 輸入"苹"提示"苹果手機" | 提升體验 |
| 高亮 | 搜索結果中標红匹配词 | 直观展示 |
| 權重調整 | 標题匹配權重 > 內容匹配 | 提高精确度 |
| 過滤與聚合 | 按价格區間、品牌筛選 | 缩小范围 |
總結
搜索引擎是互聯網應用的核心基础設施。理解倒排索引、分词、相關性排序這三个核心概念,就掌握了搜索引擎的本质。
回顧本章的關鍵要點:
- 倒排索引:從關鍵词到文檔的反向映射,是搜索引擎的核心數據結構
- 分词是基础:中文分词是搜索质量的關鍵,需要選择合適的分词器
- BM25 排序:基于词频和文檔频率的相關性評分,是 ES 的默認算法
- ES 架構:分片 + 副本實現分布式和高可用
- 搜索優化:同義词、纠錯、补全讓搜索更智能
延伸阅讀
- Elasticsearch 官方文檔 - 最權威的 ES 參考
- Elasticsearch 權威指南 - 中文入門指南
- Apache Lucene - ES 底層的搜索引擎庫
- MeiliSearch - 輕量级搜索引擎,適合中小项目
- Typesense - 開源的即時搜索引擎