Skip to content

搜索引擎原理

前言

你在淘宝搜"红色連衣裙",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 找到文檔內容。而搜索引擎用的是倒排索引:從關鍵词找到包含它的文檔列表。

Inverted Index
Type a search term to see how an inverted index works
Source documents
Doc 1Apple is a common fruit
Doc 2Apple released a new phone
Doc 3I like eating fruit and vegetables
Doc 4This phone has a practical price
Doc 5The fruit shop has apples and bananas
Inverted index table
apple[1][2][5]
fruit[1][3][5]
phone[2][4]
company[2]
release[2]
like[3]
vegetables[3]
price[4]
practical[4]
banana[5]
common[1]
索引類型方向查找方式適用場景
正排索引文檔 → 內容知道 ID,查內容數據庫主鍵查询
倒排索引關鍵词 → 文檔列表知道關鍵词,查文檔全文搜索

倒排索引的構建過程

  1. 文檔收集:獲取所有需要被搜索的文檔
  2. 分词(Tokenization):将文檔拆分為一个个词語
  3. 建立映射:記錄每个词語出現在哪些文檔中(以及出現位置、频率等)
  4. 持久化存儲:将索引写入磁盘,支持快速查找

2. 分词與文本分析

分词是搜索引擎的第一步,也是中文搜索的最大挑戰。英文天然以空格分词,但中文没有分隔符——"乒乓球拍卖了"可以分成"乒乓球/拍卖/了"或"乒乓/球拍/卖/了"。

分词方式說明示例
標準分词按空格和標點切分(英文)"hello world" → ["hello", "world"]
中文分词基于词典或模型切分"搜索引擎" → ["搜索", "引擎"]
N-gram按固定長度滑動窗口切分"搜索" → ["搜索", "索引"]
自定義词典添加業務專有词汇"iPhone16ProMax" 作為一个词

文本分析管道

分词只是文本分析的一步,完整的管道包括:

  1. 字符過滤:去除 HTML 標簽、特殊字符
  2. 分词:将文本拆分為词語(Token)
  3. 停用词過滤:去除"的"、"了"、"是"等无意義的高频词
  4. 同義词擴展:将"手機"擴展為"手機、電话、移動電话"
  5. 词干提取:将 "running" 還原為 "run"(英文)

3. 相關性排序:哪个結果最"相關"?

找到匹配的文檔只是第一步,更重要的是排序——把最相關的結果排在最前面。

算法原理特點
TF-IDF词频(TF) × 逆文檔频率(IDF)經典算法,简單有效
BM25TF-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"容錯性
自動补全輸入"苹"提示"苹果手機"提升體验
高亮搜索結果中標红匹配词直观展示
權重調整標题匹配權重 > 內容匹配提高精确度
過滤與聚合按价格區間、品牌筛選缩小范围

總結

搜索引擎是互聯網應用的核心基础設施。理解倒排索引、分词、相關性排序這三个核心概念,就掌握了搜索引擎的本质。

回顧本章的關鍵要點:

  1. 倒排索引:從關鍵词到文檔的反向映射,是搜索引擎的核心數據結構
  2. 分词是基础:中文分词是搜索质量的關鍵,需要選择合適的分词器
  3. BM25 排序:基于词频和文檔频率的相關性評分,是 ES 的默認算法
  4. ES 架構:分片 + 副本實現分布式和高可用
  5. 搜索優化:同義词、纠錯、补全讓搜索更智能

延伸阅讀