Google 神话

动手写一个搜索引擎
1995 年,两个年轻的学生 Larry Page 和 Sergey Brin 在一点上达成了共识——从大量数
据检索信息是计算系统面临的最大的挑战之一。1996 年,他们创建了一个叫做 BackRub 的
搜索引擎。这个搜索引擎后来叫做 Google。1998 年,Page 和 Brin 在 Larry 的大学宿舍创立
Google 公司的第一个数据中心。2000 年,Google 开始成为全球最大的搜索引擎一直到现在。
2005 年,Google 股票市值超过 1000 亿美元。公司首次登陆华尔街时,“让世界更美好”便
是他们阐明的目标之一。

体验搜索引擎

你想起什么大脑没有记住的知识了吗?用搜索引擎吧。它往往不会让你失望。
事实上这正是 Google 的创始人设想的。“如果你想搜就能搜,几乎像拥有第二个大脑,
那就妙极了,”他说。就在 Brin (一直是两人中站在前台的那个)说在兴头上的时候,Page 在
不声不响地稍稍露面之后,便带着“共谋者般的微笑”溜出了房间。
但是不要感到 Google 已经完成所有的事情,没有什么事情留下来给我们做了。

下面是这本教程目录:

自己动手写搜索引擎…………………………………………………………………………….1

第 1 章 了解搜索引擎……………………………………………………………………………1

1.1 Google 神话………………………………………………………………………………………………………..1

1.2 体验搜索引擎……………………………………………………………………………………………………..1

1.3 你也可以做搜索引擎…………………………………………………………………………………………..4

1.4 本章小结…………………………………………………………………………………………………………….4

第 2 章 遍历搜索引擎技术………………………………………………………………………5

2.1   30 分钟实现的搜索引擎……………………………………………………………………………………..5

  • 2.1.1 准备工作环境(10 分钟)…………………………………………………………………………5
  • 2.1.2 编写代码(15 分钟)………………………………………………………………………………..6
  • 2.1.3 发布运行(5 分钟)………………………………………………………………………………….9

2.2 搜索引擎基本技术…………………………………………………………………………………………….14

  • 2.2.1 网络蜘蛛…………………………………………………………………………………………………14
  • 2.2.2 全文索引结构………………………………………………………………………………………….14
  • 2.2.3 Lucene 全文检索引擎………………………………………………………………………………15
  • 2.2.4 Nutch 网络搜索软件………………………………………………………………………………..15
  • 2.2.5 用户界面…………………………………………………………………………………………………17

2.3 商业搜索引擎技术介绍……………………………………………………………………………………..17

  • 2.3.1 通用搜索…………………………………………………………………………………………………17
  • 2.3.2 垂直搜索…………………………………………………………………………………………………18
  • 2.3.3 站内搜索…………………………………………………………………………………………………19
  • 2.3.4 桌面搜索…………………………………………………………………………………………………21

2.4 本章小结…………………………………………………………………………………………………………..21

第 3 章 获得海量数据……………………………………………………………………………22

3.1 自己的网络蜘蛛………………………………………………………………………………………………..22

  • 3.1.1 BerkeleyDB 介绍………………………………………………………………………………………27
  • 3.1.2 抓取网页…………………………………………………………………………………………………28
  • 3.1.3 MP3 抓取………………………………………………………………………………………………..29
  • 3.1.4 RSS 抓取…………………………………………………………………………………………………30
  • 3.1.5 图片抓取…………………………………………………………………………………………………33
  • 3.1.6 垂直行业抓取………………………………………………………………………………………….34

3.2 抓取数据库中的内容…………………………………………………………………………………………36

  • 3.2.1 建立数据视图………………………………………………………………………………………….36
  • 3.2.2 JDBC 数据库连接…………………………………………………………………………………….36
  • 3.2.3 增量抓取…………………………………………………………………………………………………38

3.3 抓取本地硬盘上的文件……………………………………………………………………………………..38

  • 3.3.1 目录遍历…………………………………………………………………………………………………38

3.4 本章小结…………………………………………………………………………………………………………..40

第 4 章 提取文档中的文本内容………………………………………………………………..41

4.1 从 HTML 文件中提取文本 ………………………………………………………………………………..41

  • 4.1.1 HtmlParser 介绍………………………………………………………………………………………..49
  • 4.1.2 结构化信息提取………………………………………………………………………………………52
  • 4.1.3 网页去噪…………………………………………………………………………………………………58
  • 4.1.4 网页结构相似度计算……………………………………………………………………………….61
  • 4.1.5 正文提取的工具 FireBug………………………………………………………………………….62
  • 4.1.6 正文提取的工具 NekoHTML……………………………………………………………………64
  • 4.1.7 正文提取…………………………………………………………………………………………………66

4.2 从非 HTML 文件中提取文本 …………………………………………………………………………….77

  • 4.2.1 TEXT 文件……………………………………………………………………………………………….77
  • 4.2.2 PDF 文件 …………………………………………………………………………………………………77
  • 4.2.3 Word 文件………………………………………………………………………………………………..85
  • 4.2.4 Rtf 文件……………………………………………………………………………………………………86
  • 4.2.5 Excel 文件………………………………………………………………………………………………..87
  • 4.2.6 PowerPoint 文件……………………………………………………………………………………….88

4.3 流媒体内容提取………………………………………………………………………………………………..89

  • 4.3.1 音频流内容提取………………………………………………………………………………………89
  • 4.3.2 视频流内容提取………………………………………………………………………………………91

4.4 抓取限制应对方法…………………………………………………………………………………………….93

4.5 本章小结…………………………………………………………………………………………………………..94

第 5 章 自然语言处理…………………………………………………………………………….95

5.1 中文分词处理……………………………………………………………………………………………………95

  • 5.1.1 Lucene 中的中文分词………………………………………………………………………………95
  • 5.1.2 Lietu 中文分词的使用 ………………………………………………………………………………96
  • 5.1.3 中文分词的原理………………………………………………………………………………………96
  • 5.1.4 查找词典算法………………………………………………………………………………………….99
  • 5.1.5 最大概率分词方法…………………………………………………………………………………102
  • 5.1.6 新词发现……………………………………………………………………………………………….105
  • 5.1.7 隐马尔可夫模型…………………………………………………………………………………….106

5.2 语法解析树……………………………………………………………………………………………………..108

5.3 文档排重…………………………………………………………………………………………………………108

5.4 中文关键词提取………………………………………………………………………………………………110

  • 5.4.1 关键词提取的基本方法………………………………………………………………………….110
  • 5.4.2 关键词提取的设计………………………………………………………………………………… 111
  • 5.4.3 从网页提取关键词………………………………………………………………………………… 111

5.5 相关搜索………………………………………………………………………………………………………… 111

5.6 拼写检查…………………………………………………………………………………………………………114

  • 5.6.1 英文拼写检查………………………………………………………………………………………..114
  • 5.6.2 中文拼写检查………………………………………………………………………………………..115

5.7 自动摘要…………………………………………………………………………………………………………120

  • 5.7.1 自动摘要技术………………………………………………………………………………………..120
  • 5.7.2 自动摘要的设计…………………………………………………………………………………….120
  • 5.7.3 Lucene 中的动态摘要……………………………………………………………………………..128

5.8 自动分类…………………………………………………………………………………………………………128

  • 5.8.1 Classifier4J……………………………………………………………………………………………..129
  • 5.8.2 自动分类的接口定义……………………………………………………………………………..131
  • 5.8.3 自动分类的 SVM 方法实现……………………………………………………………………132
  • 5.8.4 多级分类……………………………………………………………………………………………….132

5.9 自动聚类…………………………………………………………………………………………………………134

  • 5.9.1 聚类的定义……………………………………………………………………………………………134
  • 5.9.2 K 均值聚类方法……………………………………………………………………………………..135
  • 5.9.3 K 均值实现…………………………………………………………………………………………..135

5.10 拼音转换……………………………………………………………………………………………………….142

5.11 语义搜索……………………………………………………………………………………………………….143

5.12 跨语言搜索……………………………………………………………………………………………………147

5.13 本章小结……………………………………………………………………………………………………….148

第 6 章 创建索引库……………………………………………………………………………149

6.1 设计索引库结构………………………………………………………………………………………………150

  • 6.1.1 理解 Lucene 的索引库结构…………………………………………………………………..150
  • 6.1.2 设计一个简单的索引库………………………………………………………………………….152

6.2 创建和维护索引库…………………………………………………………………………………………..153

  • 6.2.1 创建索引库……………………………………………………………………………………………153
  • 6.2.2 向索引库中添加索引文档………………………………………………………………………153
  • 6.2.3 删除索引库中的索引文档………………………………………………………………………155
  • 6.2.4 更新索引库中的索引文档………………………………………………………………………155
  • 6.2.5 索引的合并……………………………………………………………………………………………155
  • 6.2.6 索引的定时更新…………………………………………………………………………………….156
  • 6.2.7 索引的备份和恢复…………………………………………………………………………………157
  • 6.2.8 修复索引……………………………………………………………………………………………….158

6.3 读写并发控制………………………………………………………………………………………………….158

6.4 优化使用 Lucene…………………………………………………………………………………………….159

  • 6.4.1 索引优化……………………………………………………………………………………………….159
  • 6.4.2 查询优化……………………………………………………………………………………………….161
  • 6.4.3 实现时间加权排序…………………………………………………………………………………166
  • 6.4.4 实现字词混合索引…………………………………………………………………………………167
  • 6.4.5 定制 Similarity……………………………………………………………………………………….173
  • 6.4.6 定制 Tokenizer……………………………………………………………………………………….174

6.5 查询大容量索引………………………………………………………………………………………………176

6.6 本章小结…………………………………………………………………………………………………………177

第 7 章 用户界面设计与实现…………………………………………………………………177

7.1 Lucene 搜索接口(search 代码)………………………………………………………………………….178

7.2 搜索页面设计………………………………………………………………………………………………….179

  • 7.2.1 用于显示搜索结果的 taglib……………………………………………………………………179
  • 7.2.2 用于搜索结果分页的 taglib……………………………………………………………………181
  • 7.2.3 设计一个简单的搜索页面………………………………………………………………………183

7.3 实现搜索接口……………………………………………………………………………………………………186

  • 7.3.1 布尔搜索……………………………………………………………………………………………….186
  • 7.3.2 指定范围搜索………………………………………………………………………………………..186
  • 7.3.3 设置过滤条件………………………………………………………………..错误!未定义书签
  • 7.3.4 搜索结果排序………………………………………………………………………………………..191
  • 7.3.5 搜索页面的索引缓存与更新…………………………………………………………………..192

7.4 实现关键词高亮显示……………………………………………………………………………………….194

7.5 实现多维视图………………………………………………………………………………………………….196

7.6 实现相似文档搜索…………………………………………………………………………………………..202

7.7 实现 AJAX 自动完成 ………………………………………………………………………………………205

  • 7.7.1 总体结构……………………………………………………………………………………………….206
  • 7.7.2 服务器端处理………………………………………………………………………………………..206
  • 7.7.3 浏览器端处理…………………………………………………………………………………….208
  • 7.7.4 服务器端改进………………………………………………………………………………………..209
  • 7.7.5 部署总结……………………………………………………………………………………………….219

7.8 jQuery 实现的自动完成…………………………………………………………………………………….219

7.9 集成其他功能………………………………………………………………………………………………….225

  • 7.9.1 拼写检查……………………………………………………………………………………………….225
  • 7.9.2 分类统计……………………………………………………………………………………………….226
  • 7.9.3 相关搜索……………………………………………………………………………………………….226
  • 7.9.4 再次查找……………………………………………………………………………………………….229
  • 7.9.5 搜索日志……………………………………………………………………………………………….229

7.10 搜索日志分析………………………………………………………………………………………………..231

7.11 本章小结……………………………………………………………………………………………………….234

第 8 章 其他高级主题…………………………………………………………………………238

8.1 使用 Solr 实现分布式搜索……………………………………………………………………………….235

  • 8.1.1 Solr 服务器端的配置与中文支持…………………………………………………………….235
  • 8.1.2 把数据放进 Solr…………………………………………………………………………………….240
  • 8.1.3 删除数据……………………………………………………………………………………………….243
  • 8.1.4 客户端搜索界面…………………………………………………………………………………….244
  • 8.1.5 Solr 索引库的查找………………………………………………………………………………….245
  • 8.1.6 索引分发……………………………………………………………………………………………….249
  • 8.1.7 Solr 搜索优化…………………………………………………………………………………………249
  • 8.1.8 Solr 中字词混合索引………………………………………………………………………………252
  • 8.1.9 相关检索……………………………………………………………………………………………….256
  • 8.1.10 搜索结果去重………………………………………………………………………………………258
  • 8.1.11 分布式搜索………………………………………………………………………………………….263
  • 8.1.12 SolrJ 查询分析器…………………………………………………………………………………..267
  • 8.1.13 扩展 SolrJ ……………………………………………………………………………………………279
  • 8.1.14 扩展 Solr……………………………………………………………………………………………..280
  • 8.1.15 Solr 的.net 客户端…………………………………………………………………………………288
  • 8.1.16 Solr 的 php 客户端………………………………………………………………………………..289

8.2 图片搜索…………………………………………………………………………………………………………294

  • 8.2.1 图像的 OCR 识别…………………………………………………………………………………..295

8.3 竞价排名…………………………………………………………………………………………………………299

8.4 Web 图分析 ……………………………………………………………………………………………………..300

8.5 使用并行程序分析数据……………………………………………………………………………………305

8.6 RSS 搜索 …………………………………………………………………………………………………………306

8.7 本章小结…………………………………………………………………………………………………………307

参考资源………………………………………………………………………………………………………………………308

  • 书籍………………………………………………………………………………………………………………………308
  • 网址………………………………………………………………………………………………………………………308

本书中的章节和代码对照表309