跳转到内容

Google 1998 — 把整个网络爬下来、压扁、再用一秒查到

是什么

这篇论文是第一代 Google 搜索引擎的工程白皮书。日常类比:想象你要做一份”全世界图书馆的总目录”——你得先派人把每本书抄一遍(爬虫),再把每本书拆成词建一张”哪个词在哪本书第几页”的反查表(倒排索引),最后还得想办法在用户问”我想看推理小说”时一秒内挑出最好看的几本(排序)。

1998 年 Stanford 两个博士生 Sergey Brin 和 Lawrence Page 把这件事第一次完整做完——他们爬了 2400 万个网页,把整个仓库压到 53GB,并能在普通服务器上一秒钟回答查询。同年他们成立了 Google 公司。

注意:这不是 PageRank 那篇论文(那篇 6 页只讲算法,见 pagerank-1998)。这篇 20 页讲整个搜索引擎怎么搭起来——爬虫 / 存储 / 索引 / 排序 / PageRank 全栈。

为什么重要

不理解这篇论文,下面这些事都没法解释:

  • 为什么 1998 年之前的搜索引擎(AltaVista / Lycos / Excite)会被”在页面里塞 1000 次关键词”骗到——它们没有链接结构信号
  • 为什么 Google 一开始就强调链接锚文本(anchor text)作为索引——别人写”点这里看苹果官网”,这”苹果官网”四个字算到被链向那个页面上
  • 现代搜索引擎工程的主干流程(Crawl → Parse → Index → Score)是这篇论文定下的
  • 为什么 Elasticsearch / Lucene 的术语(barrel / lexicon / posting list / hit list)跟这篇论文几乎一致——后人都按这个模板抄
  • 大数据时代到来前,单机存 53GB 网页 + 14M 词表 + 1 秒响应是非平凡工程,论文里全是”如何在 1998 年硬件上把内存抠到位”的实战

核心要点

整个系统拆成 5 大模块,按数据流向排列:

  1. Crawler(爬虫):多个分布式爬虫同时抓页面。一个进程开 300 个并发连接,峰值 100 页/秒。自带 DNS 缓存——否则每次解析域名就把性能毁了。

  2. Store Server(仓库):把抓回的 HTML 用 zlib 压缩存盘。147GB 原始 → 53.5GB 压缩,每个页面带一个 docID。

  3. Indexer(索引器):读仓库 → 把每个页面拆成词 → 输出两份东西

    • 正排索引(forward index):docID → 该页里出现了哪些词、在什么位置
    • 锚文件(anchor file):链接的描述文字(“点这里看苹果”)和它指向的目标 URL
  4. Sorter(排序器):把正排索引”翻面”成倒排索引(inverted index)——wordID → 哪些 docID 包含这个词。这就是 okapi-bm25-1994 等所有信息检索算法的查询底座。

  5. Searcher(查询器):拿到用户的查询词 → 查倒排索引 → 用多个信号融合打分(位置 / 字体 / 大小 / 锚文本权重 / pagerank-1998 的链接分) → 返回 top K。

关键工程细节:

  • Hit list:每个词在每个文档里的出现记录被压到 2 字节(位置 + 字体大小 + 是否大写 + 类型)。1998 年硬盘按 GB 算钱,省字节就是省命。
  • Lexicon:14M 词表常驻 256MB 内存,查询路径上不碰盘。
  • Barrels:正排索引切成 64 份,每份按 wordID 范围分区,方便并行排序。
  • BigFiles:虚拟文件层,一个逻辑文件可以横跨多个文件系统——绕过 1998 年单文件 2GB 上限。

实践案例

案例 1:锚文本为什么是大杀器

假设有 1000 个网页都写:

<a href="https://www.apple.com">苹果官网</a>

1998 年之前的引擎只索引 apple.com 页面本身的文字。但 apple.com 主页可能根本没出现”苹果官网”这四个字(早期 Apple 主页一张大图加点产品 logo)。

Google 把”苹果官网”这四个字也算到 apple.com 这个 docID 头上。于是用户搜”苹果官网”——apple.com 立刻命中。这一招同时解决了图片、视频、PDF 的索引(它们没正文但有人链)。

更妙的是:恶意网站可以塞自己的页面,但没法控制别人怎么写链接描述。所以锚文本也是一种抗作弊信号

案例 2:Hit list 的 2 字节是怎么塞下的

每个 hit 表示”词 W 在文档 D 的某个位置出现”。论文里 plain hit 的位(bit)布局:

| capitalization (1 bit) | font size (3 bits) | position (12 bits) |
  • 大小写 1 位:是不是首字母大写
  • 字体 3 位:相对于本页平均字号的等级(标题字大 → 权重高)
  • 位置 12 位:在文档前 4096 个词内的偏移;超出就截断

外加 fancy hit(标题/锚/URL)用扩展位标识类型。总共 2 字节。一个 24M 页面、平均 1000 hit/页的语料,正排索引压缩后约 38GB——能塞进当时的硬盘。

案例 3:从查询词到 10 个结果,路径有多长

用户输入 “运动鞋 推荐”:

  1. 分词 → wordID(运动鞋), wordID(推荐)
  2. 查 lexicon → 拿到这两个词的倒排链表起点(在内存)
  3. 取倒排链表 → 列出包含两个词的所有 docID
  4. 求交集 + 算 hit 距离 → 两个词靠得越近的文档越好
  5. 多信号打分 = type-weight × proximity × PageRank × …
  6. 取 top 10 → 拼上标题 + 摘要返回

整个流程在 1998 年的 Pentium II + 256MB 内存上做到 1 秒以内——主要靠 lexicon 常驻内存 + 倒排链表顺序读盘。

踩过的坑

  1. DNS 是瓶颈:早期爬虫每次抓页面都做一次 DNS 查询,把 DNS 服务器都问崩了。论文里加了自建 DNS 缓存,每爬一个新域名才查一次。这个教训现代爬虫还在用。

  2. robots.txt 容易爆炸:有人在 robots.txt 里写极端规则,爬虫栽进去。需要做防御性解析。论文专门提到收到过愤怒邮件——某些站长以为爬虫是攻击。

  3. HTML 千奇百怪:1998 年的网页 HTML 大量错配标签、非 ASCII、各种编码。Parser 必须永远不崩,否则一两个页面就阻塞整个 indexer 进程。

  4. PageRank 收敛速度依赖 dangling node 处理:没有出链的页面(PDF / 图片)会”吸走”所有概率。论文用移除再加回的两步迭代规避。

  5. 重复 URL 是常态:同一份内容可能在 www.x.com/ax.com/a/index.html 两个 URL 出现。论文里靠 URL 标准化 + checksum 去重,但承认仍有漏网。这件事到 2010 年代仍是 Web 抓取的痛点。

  6. 磁盘随机寻道贵:倒排索引按 wordID 顺序写盘后,查询时按需顺序读取整段——避免随机寻道。这个”批量顺序读优于随机读”的取舍 20 年后在 SSD 时代才有所松动。

适用 vs 不适用场景

适用

  • 学搜索引擎工程的入门蓝图——Crawl/Parse/Index/Score 四步至今没变
  • 理解 okapi-bm25-1994 / salton-vsm-1975 等信息检索算法怎么落地到一个真实系统
  • 看 Lucene / Elasticsearch 源码前先读这篇——术语全对得上

不适用

  • 想学现代 Web 搜索(神经检索 / 向量召回 / BERT 重排)→ 这篇是 1998 年关键词时代
  • 想学分布式索引(千机集群、shard、replica)→ 这篇是单机/小集群规模,看后来的 GFS / MapReduce / bigtable-2006
  • 只关心 PageRank 算法本身 → 直接读 pagerank-1998 6 页技术报告即可

历史小故事(可跳过)

  • 1995 年:Page 和 Brin 在 Stanford 相识,共同做 BackRub 项目——研究 Web 链接结构。
  • 1996 年:BackRub 部署在 Stanford 校内,2 台二手机器爬了 2400 万页。
  • 1997 年 9 月:注册 google.com 域名(来自数学单词 googol = 10^100,写错一个字母)。
  • 1998 年 4 月:在 Brisbane 的 WWW7 会议上发表本文。
  • 1998 年 9 月:Google Inc. 在车库里成立,第一笔 10 万美元投资来自 Sun 联合创始人 Andy Bechtolsheim。

论文里有个有趣段落:“广告驱动的搜索引擎本质上偏向广告主,远离用户需求”——20 多年后这段话被反复引用。

学到什么

  1. 搜索引擎 = 离线建索引 + 在线查索引,两条管线分别优化,至今没变
  2. 链接结构是信号金矿——锚文本和 PageRank 都从链接里挖
  3. 工程系统的好坏取决于”瓶颈在哪”:1998 年瓶颈是磁盘和内存,所以 hit list 抠到 2 字节;今天瓶颈是延迟和成本,所以重排序模型放 GPU
  4. 完整系统论文比单点算法论文更难写——这篇 20 页覆盖 5 大模块,每块都要”够深 + 不冗”

延伸阅读

关联

  • pagerank-1998 —— 本文用到的链接打分算法的独立技术报告
  • salton-vsm-1975 —— 向量空间模型,倒排索引的理论祖先
  • okapi-bm25-1994 —— 排序公式的演进路线
  • akamai-2002 —— 同年代的另一种”网络规模”工程:CDN
  • bigtable-2006 —— Google 后来给搜索索引建的分布式存储
  • simrank-2002 —— 把 PageRank 思想推广到”两个节点有多像”