1. 搜索引擎架构概览:理解搜索引擎的基本组件
搜索引擎这东西,说白了就是一台超级大的「信息整理机器」。你每天在百度、Google 上敲几个字,几毫秒就出结果了。但背后那套流程,其实挺复杂的。
我刚开始接触搜索引擎时,也觉得它像个黑盒子。后来拆开一看,核心就四个组件:爬虫、索引、查询、排序。今天咱们就把这四个家伙挨个聊透。
1.1 爬虫:搜索引擎的「眼睛」
爬虫是干什么的?它负责满世界跑,把网页内容抓回来。你可以把它想象成一个不知疲倦的机器人,每天在互联网上「逛街」,看到新店(新网页)就进去拍照(抓取内容)。
我个人习惯把爬虫分成两类:
- 广度优先爬虫:先抓首页,再抓首页上的所有链接,一层层往外扩。适合抓全站。
- 深度优先爬虫:顺着一个链接一直往下点,直到没路了再回来。适合抓特定专题。
嗯,这里要注意一个坑。爬虫不是乱跑的,它得遵守 robots.txt 协议。我在项目中遇到过,有同事写爬虫时没检查这个文件,结果把人家后台管理页面也给抓了……那叫一个尴尬。
1.2 索引:搜索引擎的「记忆」
爬虫把网页抓回来了,但你不能每次都去原始网页找内容吧?那太慢了。所以我们需要一个「索引」——说白了,就是给所有网页建一个目录。
索引的核心是倒排索引。这个概念听起来高大上,其实很简单:
- 正排索引:文档 → 关键词(比如:文档1包含「苹果」「手机」)
- 倒排索引:关键词 → 文档(比如:「苹果」出现在文档1、文档3、文档7)
你想想看,用户搜「苹果」时,搜索引擎直接查倒排索引,瞬间就知道哪些文档里有这个词。这比挨个翻文档快了多少倍?
我建议你在设计索引时,一定要考虑分词。中文分词比英文麻烦多了。「南京市长江大桥」这句话,你分不好,意思就全变了。我踩过这个坑,后来老老实实用了结巴分词 + 自定义词典。
1.3 查询:搜索引擎的「耳朵」
用户输入关键词,搜索引擎得听懂他到底想找什么。这就是查询模块的活。
查询模块要做三件事:
- 解析:把用户输入的字符串拆成一个个词。比如「北京天气」→ 「北京」+「天气」
- 改写:处理拼写错误、同义词、近义词。用户搜「苹果手机」,你可能得同时搜「iPhone」
- 扩展:根据用户意图,补充相关词。搜「感冒药」,可以扩展出「退烧药」「消炎药」
我记得有一次线上事故,用户搜「新冠疫苗」时,系统把「新冠」当成了「新」+「冠」,结果搜出来一堆帽子……后来我们加了一个实体识别模块,才把这个问题解决掉。
1.4 排序:搜索引擎的「大脑」
索引找到了相关文档,但可能有几万个结果。用户只看前10个。所以你得排序——把最相关的、质量最高的排前面。
排序算法有很多,但核心就两个维度:
| 维度 | 说明 | 常见指标 |
|---|---|---|
| 相关性 | 文档和用户查询的匹配程度 | TF-IDF、BM25、向量相似度 |
| 质量 | 文档本身的权威性、时效性 | PageRank、域名权重、发布时间 |
我刚开始做排序时,只关注相关性。结果发现,搜「感冒了怎么办」,排第一的居然是个个人博客,内容还写错了。后来加了质量分,才把权威网站顶上去。
排序还有一个隐藏问题:冷启动。新发布的网页,没有点击数据,没有链接权重,怎么排?我建议用探索与利用策略——给新文档一个基础分,让它有机会被用户看到,然后根据反馈动态调整。
1.5 整体数据流:从输入到输出
好了,四个组件都聊完了。咱们把它们串起来,看看一次搜索请求的完整流程:
- 用户输入:在搜索框里敲「北京天气」
- 查询模块:解析成「北京」+「天气」,并扩展同义词
- 索引模块:查倒排索引,找到包含这两个词的所有文档
- 排序模块:计算每个文档的相关性和质量分,排好序
- 返回结果:把前10个结果展示给用户
整个过程,从用户敲回车到看到结果,通常不超过 200 毫秒。你想想看,这背后有多少数据在流动?
嗯,这就是搜索引擎的骨架。后面咱们会逐个深入,把每个组件的细节、监控指标、故障排查方法都讲透。今天先到这里,下一章咱们聊爬虫的监控与调优。