标题：自己动手写搜索引擎
图书信息
作　者：罗刚  编著  
  出 版 社： 电子工业出版社
出版时间： 2009-10
I S B N ：978-7-121-09640-2
分类： 图书 >>小说 
定价：55.00元(含光盘1张)
宣传语
·首次揭示商业级搜索引擎实现秘密。
·业内知名开发团队倾情奉献。
·引领Lucene开发技术升级。
内 容 简 介
本书是猎兔企业搜索开发团队的软件产品研发和项目实践的经验汇总。本书全方位展现出一个商用级别的Lucene搜索解决方案，主要包括爬虫、自然语言处理和搜索实现部分。
爬虫部分介绍了网页遍历方法和从网页提取主要内容的方法。
自然语言处理部分包括了中文分词从理论到实现以及在搜索引擎中的实用等细节。
其他自然语言处理的经典问题与实现包括：文档排重、文本分类、自动聚类、语法解析树、拼写检查、拼音转换等理论与实现方法。
在实现搜索方面，本书用简单的例子介绍了完整的搜索实现过程，覆盖了从索引库的设计和索引库与数据库的同步到搜索用户界面设计与实现。搜索用户界面包括实现布尔逻辑查询、按区间范围查询、搜索结果按日期排序等。本书还进一步介绍了搜索排序的优化方法。
最后以基于Lucene的搜索服务器Solr为例，展示了Lucene的最新应用方法。
前 言
15  在中国，随着互联网从城市到农村的普及，搜索引擎对日常生活产生越来越大的影响。例如，笔者自己一般每天就有15个左右的问题需要求助于搜索引擎。从04年开始笔者也从数据库相关软件开发转入搜索引擎相关开发工作。
Google  20世纪末，在美国国家科学基金会的支持下，斯坦福大学的两个学生在他们的教授指导下开始了一个数字图书馆项目。后来，他们创建了Google公司，开创了通过互联网搜索技术共享人类信息的新纪元。Google通过网络广告取得了巨大的商业回报，到现在仍然是世界500强企业中赢利能力最强的公司之一。NASDAQ证券交易市场的最高股价是Google公司的股票。搜索引擎开发成为一项极有含金量的技术。
Web开始写作《自己动手写搜索引擎》这本书以前，已经有一些介绍搜索理论或者搜索开发工具的图书，但是往往表现出来的是纯粹的理论推导和公式定理，或者仅仅是现成开源软件的介绍、分析和使用，并没有介绍其理论依据。有的读者是数学专业的博士，对于相关的数学模型一看就明白，但对于算法实现可能仍然缺少经验。有的读者是培训学校毕业的学生，可能对Web开发框架和软件工具的使用很熟悉，但缺少理论基础和深入创新的能力。本书的一个特点在于前面是原理介绍，接着是具体的代码实现。不仅讲解抽象的知识，更重要的是把知识转化成具体软件应用的过程也展示出来。
Lucene  《自己动手写搜索引擎》是猎兔企业搜索开发团队的软件产品研发和项目实践的经验汇总。感谢Lucene，它把搜索引擎开发工作变成了广大程序员都能够参与的游戏。所以本书选用Lucene来全方位展现一个商用级别的搜索解决方案。中文分词当前仍然是实现中文搜索的热门话题之一。本书重点介绍了中文分词的相关理论和代码实现，以及在搜索引擎中实用中文分词等细节。本书用简单的例子介绍了搜索引擎完整的实现过程，同时也没有忽略一些经典的算法实现。
该书适合需要具体实现搜索引擎的程序员使用，对于自然语言处理等相关研究人员也有一定参考价值，同时猎兔搜索团队也已经开发出以本书为基础的专门培训课程。本书附带光盘中的代码经过了详细的注释。为了帮助初学者更容易地了解程序的功能，经过笔者的精心整理后，每个主要变量和每行主要的执行程序都加上了注释，前后对比图如下所示。
3年  笔者花了3年时间编写本书，但限于时间和水平，其中很多内容笔者仍然正在改写中，希望读者不吝赐教，使本书在重印时内容能更全面。如果条件允许，笔者也很愿意探索一些非比寻常的方式来介绍技术。
API  笔者把写书的过程看成是笔者自身和作者所组建的技术团队修炼和提高的过程。笔者相信技术高手并非天生，而是来源于对卓越品质的追求和自我的不断提升。起点低不是问题，笔者所在的搜索开发团队就包括一些高中学历的程序员，不愿意学习和深入钻研问题才是最大的问题。从企业知识管理的角度，这本书也是有益的。团队里每次有新人进来，我们都先把相关文档发给他们，这样内部交流技术就多了一些基础，不用每次都从Lucene最基本的API等这些基本知识开始介绍。
搜索  从学习的过程来看，有人会问：“你没有去过**公司，怎么知道开发搜索引擎？”笔者没有去过大的搜索公司，所以只能从公开的论文、资料和代码等开始学习。感谢搜索引擎技术本身的发展，这方面的学习材料越来越容易通过搜索获得。笔者没有在课堂上学习过自然语言处理等方面的课程，刚开始做中文分词的时候，吴春尧博士问：“你知不知道语言模型？”笔者当时对这些概念一无所知。但是通过了解中文分词程序每一行代码的作用，阅读相关的论文，终于了解了其中一些常用的数学方法。
Solr  从开发过程来看，首先由客户或者其他开发人员提出问题，解决问题，重新审查整个过程并寻找更好的解决方法。比如实现搜索结果中分类统计，最开始用QueryFilter方法可以实现基本的功能，后来Solr的作者实现了一个更快的DocSetHitCollector方法，如果用查表法来改进这个DocSetHitCollector方法可以达到比Solr官方版本更快的计算速度。搜索软件开发的过程借用日本产品研发大师稻盛和夫的话与大家共勉——“对产品的现场，重新进行审视、体察、贴心、倾听。这样的话，就可以听见神灵的声音。现场产品传来喃喃细语告知我们解决问题的诀窍——这样试试如何？”
准确  从成书过程来看，这本书也找过一些内部的开发人员请他们挑问题使得本书的表达更准确。最后，电子工业出版社的胡辛征老师对本书提出了很多具体而必要的建议，江立老师反复做了细致的修订工作，他们丰富的经验和认真负责的态度使得本书从粗糙的讲稿变成了书本的形式。
感谢  最后笔者衷心感谢家人、关心我的老师和朋友们、创业伙伴、搜索培训班的学员以及选择猎兔搜索软件的客户多年来的支持。第一次开办搜索培训班时，由于讲稿本身准备得不够充分，学员有诸多的反馈意见。经过不断的修改后，新学员的负面反馈越来越少。他们的意见也在时刻提醒笔者要保持谦虚的态度。猎兔搜索的客户对于完善搜索技术提供了重要的支持，客户公司包括：天下互联公司、北京电视台、港澳资讯公司、三星鹏泰公司、中国自动化网、中国工控网、中国机电贸易网、易车网、敦煌网、G宝盘、消息树网站等。
目 录
第1章  遍历搜索引擎技术 1
1.1  30分钟实现的搜索引擎 1
1.1.1  准备工作环境（10分钟） 1
1.1.2  编写代码（15分钟） 3
1.1.3  发布运行（5分钟） 5
1.2  Google神话 9
1.3  体验搜索引擎 9
1.4  搜索语法 10
1.5  你也可以做搜索引擎 13
1.6  搜索引擎基本技术 14
1.6.1  网络蜘蛛 14
1.6.2  全文索引结构 14
1.6.3  Lucene全文检索引擎 15
1.6.4  Nutch网络搜索软件 16
1.6.5  用户界面 17
1.7  商业搜索引擎技术介绍 19
1.7.1  通用搜索 19
1.7.2  垂直搜索 20
1.7.3  站内搜索 21
1.7.4  桌面搜索 23
1.8  本章小结 24
第2章  获得海量数据 25
2.1  自己的网络蜘蛛 25
2.1.1  抓取网页 25
2.1.2  网络蜘蛛遍历与实现 26
2.1.3  改进网络蜘蛛 30
2.1.4  MP3抓取 34
2.1.5  RSS抓取 36
2.1.6  图片抓取 38
2.1.7  垂直行业抓取 39
2.2  抓取数据库中的内容 42
2.2.1  建立数据视图 42
2.2.2  JDBC数据库连接 43
2.2.3  增量抓取 45
2.3  抓取本地硬盘上的文件 47
2.4  本章小结 49
第3章  提取文档中的文本内容 50
3.1  从HTML文件中提取文本 50
3.1.1  HtmlParser介绍 53
3.1.2  结构化信息提取 63
3.1.3  查看网页的DOM结构 68
3.1.4  正文提取的工具NekoHTML 71
3.1.5  网页去噪 73
3.1.6  网页结构相似度计算 76
3.1.7  网站风格树去除文档噪声 80
3.1.8  正文提取 92
3.2  从非HTML文件中提取文本 98
3.2.1  TEXT文件 98
3.2.2  PDF文件 98
3.2.3  Word文件 105
3.2.4  RTF文件 106
3.2.5  Excel文件 107
3.2.6  PowerPoint文件 108
3.3  流媒体内容提取 109
3.3.1  音频流内容提取 109
3.3.2  视频流内容提取 111
3.4  抓取限制应对方法 113
3.5  本章小结 114
第4章  中文分词 115
4.1  Lucene中的中文分词 115
4.2  Lietu中文分词的使用 116
4.3  中文分词的原理 117
4.4  查找词典算法 118
4.5  最大概率分词方法 123
4.6  新词发现 127
4.7  词性标注 129
4.8  本章小结 139
第5章  自然语言处理 140
5.1  语法解析树 140
5.2  文档排重 141
5.3  中文关键词提取 142
5.3.1  关键词提取的基本方法 142
5.3.2  从网页中提取关键词 145
5.4  相关搜索 145
5.5  拼写检查 148
5.5.1  英文拼写检查 148
5.5.2  中文拼写检查 149
5.6  自动摘要 153
5.6.1  自动摘要技术 153
5.6.2  自动摘要的设计 154
5.6.3  Lucene中的动态摘要 162
5.7  自动分类 163
5.7.1  Classifier4J 164
5.7.2  自动分类的接口定义 165
5.7.3  自动分类的SVM方法实现 166
5.7.4  多级分类 167
5.8  自动聚类 170
5.8.1  聚类的定义 170
5.8.2  K均值聚类方法 170
5.8.3  K均值实现 173
5.9  拼音转换 179
5.10  语义搜索 180
5.11  跨语言搜索 186
5.12  本章小结 188
第6章  创建索引库 189
6.1  设计索引库结构 190
6.1.1  理解Lucene的索引库结构 190
6.1.2  设计一个简单的索引库 192
6.2  创建和维护索引库 193
6.2.1  创建索引库 193
6.2.2  向索引库中添加索引文档 194
6.2.3  删除索引库中的索引文档 196
6.2.4  更新索引库中的索引文档 197
6.2.5  索引的合并 197
6.2.6  索引的定时更新 197
6.2.7  索引的备份和恢复 198
6.2.8  修复索引 199
6.3  读写并发控制 200
6.4  优化使用Lucene 200
6.4.1  索引优化 201
6.4.2  查询优化 202
6.4.3  实现时间加权排序 206
6.4.4  实现字词混合索引 207
6.4.5  定制Similarity 214
6.4.6  定制Tokenizer 215
6.5  查询大容量索引 217
6.6  本章小结 218
第7章  用户界面设计与实现 219
7.1  Lucene搜索接口（search代码） 219
7.2  搜索页面设计 221
7.2.1  用于显示搜索结果的taglib 221
7.2.2  用于搜索结果分页的taglib 223
7.2.3  设计一个简单的搜索页面 225
7.3  实现搜索接口 227
7.3.1  布尔搜索 227
7.3.2  指定范围搜索 228
7.3.3  搜索结果排序 233
7.3.4  搜索页面的索引缓存与更新 234
7.4  实现关键词高亮显示 236
7.5  实现分类统计视图 239
7.6  实现相似文档搜索 244
7.7  实现AJAX自动完成 246
7.7.1  总体结构 247
7.7.2  服务器端处理 247
7.7.3  浏览器端处理 249
7.7.4  服务器端改进 250
7.7.5  部署总结 261
7.8  jQuery实现的自动完成 262
7.9  集成其他功能 267
7.9.1  拼写检查 267
7.9.2  分类统计 267
7.9.3  相关搜索 271
7.9.4  再次查找 274
7.9.5  搜索日志 275
7.10  搜索日志分析 276
7.11  本章小结 280
第8章  其他高级主题 281
8.1  使用Solr实现分布式搜索 281
8.1.1  Solr服务器端的配置与中文支持 282
8.1.2  把数据放进Solr 287
8.1.3  删除数据 289
8.1.4  客户端搜索界面 290
8.1.5  Solr索引库的查找 292
8.1.6  索引分发 294
8.1.7  Solr搜索优化 298
8.1.8  Solr中字词混合索引 302
8.1.9  相关检索 304
8.1.10  搜索结果去重 307
8.1.11  分布式搜索 311
8.1.12  SolrJ查询分析器 315
8.1.13  扩展SolrJ 325
8.1.14  扩展Solr 327
8.1.15  Solr的.NET客户端 333
8.1.16  Solr的PHP客户端 334
8.2  图像的OCR识别 336
8.3  竞价排名 343
8.4  Web图分析 344
8.5  使用并行程序分析数据 350
8.6  RSS搜索 351
8.7  本章小结 353
参考资料 354