第一篇 搜索引擎入门 3
第1章 搜索引擎与信息检索基础 3
1.1 搜索引擎的历史 3
1.1.1 萌芽:Archie、Gopher 3
1.1.2 起步:Robot(网络机器人)的出现与Spider(网络爬虫) 5
1.1.3 发展:Excite、Galaxy、Yahoo等 7
1.1.4 繁荣:Infoseek、AltaVista、Google和Baidu 8
1.2 信息检索系统的基本知识 11
1.2.1 什么是信息检索系统 11
1.2.2 信息检索的过程 12
1.2.3 传统查找的优点和不足 13
1.2.4 使用索引提高检索速度 14
1.2.5 倒排索引 14
1.2.6 评价信息检索系统的标准 16
1.3 Lucene简介 16
1.4 小结 17
第二篇 Lucene开发详解 21
第2章 Lucene入门实例 21
2.1 实例介绍 21
2.1.1 实例说明 21
2.1.2 开发过程 21
2.2 准备工作 22
2.2.1 将文档的全角标点转换成半角标点 23
2.2.2 将大文档切分成多个小文档 25
2.2.3 预处理源文件的统一接口 27
2.3 创建Eclipse工程 27
2.3.1 准备工作 27
2.3.2 创建工程并引入Lucene的JAR包 29
2.3.3 运行文档预处理类 36
2.3.4 创建处理文档的索引类:IndexProcessor 37
2.3.5 创建检索索引的搜索类 40
2.4 运行效果 44
2.5 小结 45
第3章 Lucene索引的建立 46
3.1 Document逻辑文件 46
3.1.1 Lucene的Document 46
3.1.2 为Document添加多种Field 47
3.1.3 Document的内部实现 49
3.2 Field的内部实现 50
3.2.1 Field包含的类 51
3.2.2 Field类的构造方法 52
3.3 Lucene的索引工具IndexWriter 54
3.3.1 IndexWriter的初始化 54
3.3.2 向索引添加文档 56
3.4 Lucene索引过程详解 58
3.3.3 限制每个Field中的词条的数量 58
3.4.1 Lucene索引建立过程概述 59
3.4.2 使用addDocument方法向索引添加文档 59
3.4.3 DocumentWriter的addDocument方法 61
3.4.4 文档的倒排 66
3.4.5 对postingTable进行排序 71
3.5.1 索引的segment 73
3.5.2 .fnm格式 73
3.5 索引文件格式 73
3.4.6 将Posting信息写入索引 73
3.5.3 .fdx与.fdt格式 74
3.5.4 .tii与.tis格式 75
3.5.5 deletable格式 76
3.5.6 复合索引格式.cfs 76
3.6 索引过程的优化 76
3.6.1 合并因子mergeFactor 76
3.6.2 maxMergeDocs 78
3.6.3 minMergeDocs 78
3.7 索引的合并与索引的优化 78
3.7.1 FSDirectory与RAMDirectory 78
3.7.2 使用IndexWriter来合并索引 79
3.7.3 索引的优化 81
3.8 从索引中删除文档 82
3.8.1 索引的读取工具IndexReader 83
3.8.2 使用文档ID号来删除特定文档 86
3.8.3 使用Field信息来删除批量文档 88
3.9 Lucene的同步问题 89
3.9.1 为什么要进行同步以及Lucene的同步法则 90
3.9.2 commit.lock与write.lock 90
3.10 Lucene 2.0的新类:IndexModifier类 91
3.11 小结 92
4.1.1 初始化IndexSearcher 93
第4章 Lucene的搜索 93
4.1 使用IndexSearcher进行搜索 93
4.1.2 IndexSearcher最简单的使用 94
4.1.3 IndexSearcher的多种search方法 95
4.2 Hits类详解 97
4.2.1 Hits类的公有接口 97
4.2.2 效率分析 98
4.2.3 Hits内部的缓存 100
4.2.4 Hits类的工作原理 103
4.3.1 文档与词条的向量空间 104
4.3 对搜索结果的评分 104
4.3.2 Lucene的文档得分算法 105
4.4 构建各种Lucene内建的Query对象 108
4.4.1 toString查看原子查询 109
4.4.2 查询重写与权重 109
4.4.3 TermQuery词条搜索 110
4.4.4 BooleanQuery布尔搜索 111
4.4.5 RangeQuery范围搜索 119
4.4.6 PrefixQuery前缀搜索 122
4.4.7 PhraseQuery短语搜索 125
4.4.8 MultiPhraseQuery多短语搜索 128
4.4.9 FuzzyQuery模糊搜索 133
4.4.10 WildcardQuery通配符搜索 137
4.4.11 SpanQuery跨度搜索 138
4.5 第三方提供的Query对象:RegexQuery 146
4.6 通过QueryParser转换用户关键字 148
4.6.1 词条的定义 149
4.6.2 QueryParser初始化 149
4.6.3 改变QueryParser默认的布尔逻辑 150
4.6.4 短语和QueryParser 151
4.6.5 FuzzyQuery和QueryParser 152
4.6.7 查找指定的Field 153
4.6.6 通配符与QueryParser 153
4.6.8 RangeQuery与QueryParser 157
4.6.9 QueryParser和SpanQuery 158
4.7 多Field搜索与多索引搜索 159
4.7.1 多域搜索MultiFieldQueryParser 159
4.7.2 MultiSearcher在多个索引上搜索 161
4.7.3 ParalellMultiSearcher:多线程搜索 164
4.7.4 Searchable和RMI 167
4.8 小结 168
5.1.1 使用Score进行自然排序 170
5.1 相关度排序 170
第5章 排序、过滤和分页 170
5.1.2 Searcher的explain方法 172
5.1.3 通过改变boost值来改变文档的得分 173
5.2 使用Sort来排序 177
5.2.1 Sort简介 177
5.2.2 SortField 178
5.2.3 按文档得分进行排序 179
5.2.4 按文档的内部ID号来排序 182
5.2.5 按一个或多个Field来排序 183
5.2.6 改变SortField中的Locale信息 190
5.3.1 过滤器的基本结构 191
5.3 搜索的过滤器 191
5.3.2 一个简单的Filter:建立索引 192
5.3.3 一个简单的Filter:打印索引文档信息 194
5.3.4 一个简单的Filter:安全级别与过滤器代码 196
5.3.5 一个简单的Filter:在搜索时应用过滤器 197
5.3.6 一个简单的Filter:总结 198
5.3.7 按范围过滤RangeFilter 199
5.3.8 在结果中查询QueryFilter 202
5.3.9 缓存结果:CachingWrapper Filter 205
5.4 翻页问题 206
5.4.1 依赖于session的翻页 206
5.4.3 缓存+多次查询 207
5.4.2 多次查询 207
5.4.4 缓存+多次查询+数据库 208
5.5 小结 208
第6章 Lucene的分析器 209
6.1 分析 209
6.1.1 分词 209
6.1.2 Lucene的分析器的结构 210
6.1.3 Lucene的分析器的实现 212
6.2 Lucene与JavaCC 213
6.2.2 JavaCC为Lucene提供的分析器脚本 214
6.2.1 JavaCC简介 214
6.2.3 Lucene的标准分析器 218
6.2.4 标准过滤器:StandardFilter 220
6.2.5 大小写转换器:LowerCaseFilter 221
6.2.6 忽略词过滤器:StopFilter 221
6.3 分析器的进阶 222
6.3.1 再看StandardAnalyzer中的管道过滤器结构 222
6.3.2 长度过滤器:LengthFilter 223
6.3.3 PerFieldAnalyzerWrapper 223
6.4 对中文的分析 224
6.3.4 其他 224
6.4.1 现有的中文分词方式简介 225
6.4.2 中科院的分词软件和JE分词 227
6.5 小结 232
第三篇 Lucene相关话题 235
第7章 对Word、Excel和PDF的处理 235
7.1 使用PDFBox处理PDF文档 235
7.1.1 PDFBox的下载 235
7.1.2 在Eclipse中配置 236
7.1.3 使用PDFBox解析PDF内容 237
7.1.4 运行效果 238
7.1.5 与Lucene的集成 239
7.2 使用xpdf来处理中文PDF文档 241
7.2.1 xpdf的下载 241
7.2.2 配置 242
7.2.3 提取中文 243
7.2.4 运行效果 246
7.3 使用POI来处理Excel和Word文件格式 246
7.3.1 对Excel的处理类 247
7.3.2 ExcelReader的运行效果 251
7.3.3 POI中Excel文件Cell的类型 252
7.3.4 对Word的处理类 254
7.4 使用Jacob来处理Word文档 256
7.4.1 Jacob的下载 256
7.4.2 在Eclipse中配置 256
7.5 小结 258
第8章 Compass:封装了Lucene的框架 259
8.1 Compass简介 259
8.1.1 Compass的下载 259
8.1.2 Compass的代码片断 260
8.2 Compass的初始配置 261
8.2.1 Compass的配置文件 261
8.2.3 使用JDBC来存储索引 262
8.2.2 将索引存放于内存中 262
8.2.4 使用连接池来存储索引 263
8.2.5 加载compass.cfg.xml文件 264
8.3 域模型的配置 265
8.3.1 实体代码 265
8.3.2 实体关系 271
8.3.3 实体Book的配置文件 271
8.3.4 通用元数据定义文件(.cmd.xml) 272
8.3.5 Author和Article的配置文件 276
8.4.1 索引代码 278
8.4 使用Compass来建立索引 278
8.4.2 对象关系图和运行结果 280
8.5 使用Compass来搜索 281
8.5.1 使用find()方法搜索 281
8.5.2 CompassHits类型 282
8.5.3 CompassHit类型 283
8.5.4 使用Lucene语法来查找 284
8.6 配置Analyzer和Optimizer 286
8.7 小结 287
第9章 Lucene分布式和Google Search API 288
9.1 Lucene与分布式 288
9.1.1 什么是GFS 288
9.1.2 为Lucene提供分布式的几点设想 289
9.2 Google的Search API 291
9.2.1 搭建环境 292
9.2.2 构建搜索类 292
9.2.3 设置查询时的参数和查询语法 295
9.2.4 运行测试 296
9.3 小结 297
第四篇 网络爬虫Heritrix 301
第10章 无比强大的网络爬虫Heritrix 301
10.1 Heritrix使用入门 301
10.1.1 下载和运行Heritrix 301
10.1.2 在Eclipse里配置Heritrix的开发环境 304
10.1.3 创建一个新的抓取任务 308
10.1.4 设置抓取时的处理链 310
10.1.5 设置运行时的参数 312
10.1.6 运行抓取任务 314
10.1.7 Heritrix的镜像存储结构 318
10.1.8 终止抓取或终止Heritrix的运行 319
10.2 Heritrix的架构 320
10.2.1 抓取任务CrawlOrder 320
10.2.2 中央控制器CrawlController 321
10.2.3 Frontier链接制造工厂 324
10.2.4 用Berkeley DB实现的BdbFrontier 329
10.2.5 Heritrix的多线程ToeThread和ToePool 332
10.2.6 处理链和Processor 335
10.3 扩展和定制Heritrix 338
10.3.1 向Heritrix中添加自己的Extractor 339
10.3.2 定制Queue-assignment-policy的两个问题 343
10.3.3 定制Queue-assignment-policy继承QueueAssignmentPolicy类 344
10.3.4 扩展FrontierScheduler来抓取特定的内容 344
10.3.5 在Prefetcher中取消robots.txt的限制 346
10.4 小结 347
11.1 实例简介以及实现途径 351
第11章 搜索引擎综合实例:准备篇 351
第五篇 构建垂直搜索引擎 351
11.1.1 选择网站 352
11.1.2 太平洋电脑网和网易手机频道 352
11.1.3 分析网站内容并准备抓取清单 353
11.1.4 从下拉列表获得手机品牌首页 356
11.1.5 解析手机品牌页面 359
11.2 在Heritrix中为pconline开发抓取所需的定制类 361
11.2.1 保存所有产品的页面和图片 362
11.2.2 不保存其他无关页面 362
11.2.3 开始抓取 364
11.3.1 分析网易手机频道 365
11.3 在Heritrix中为网易手机频道开发抓取所需的定制类 365
11.3.2 设计抓取代码 368
11.4 在Eclipse中创建工程结构 373
11.4.1 下载插件 373
11.4.2 在Eclipse中配置插件 374
11.4.3 创建工程 375
11.4.4 设置工程的Context 376
11.4.5 设定源代码存放和输出路径 377
11.4.6 添加Java代码 379
11.4.7 添加Jar包 380
11.4.8 创建JSP文件 381
11.4.9 工程整体结构一览 383
11.5 设定配置文件及其相关类 385
11.5.1 系统属性配置文件 385
11.5.2 封装配置文件 385
11.6 产品详细信息文件格式 387
11.7 解析网页信息的基类Extractor 389
11.8 太平洋电脑网手机产品页面Extractor 393
11.9 pconline产品信息运行效果测试 397
11.9.1 编写测试函数 397
11.9.2 执行测试 398
11.10 网易手机频道的产品信息运行效果 401
11.11 构建产品信息词库 404
11.12 数据库与索引结构 407
11.12.1 定Product类 407
11.12.2 确定数据库与索引的结构 409
11.13 数据库处理和索引处理 411
11.13.1 对数据库进行操作 412
11.13.2 对索引进行操作 414
11.14 调用数据库处理类和索引处理类 415
11.15 运行 420
11.16 小结 422
12.1 HTML的基本知识 423
第12章 使用正则表达式与HTMLParser提取网页内容 423
12.2 JDK中的正则表达式提取网页内容 424
12.2.1 java.util.regex包 424
12.2.2 正则表达式提取网页内容实例 426
12.3 HTMLParser提取网页内容 431
12.3.1 HTMLParser的下载 431
12.3.2 HTMLParser概述 432
12.3.3 Lexer的功能及实现 433
12.3.4 HTMLParser的功能及实现 438
12.3.5 HTMLParser实例 443
12.4 小结 445
第13章 搜索引擎综合实例:DWR 446
13.1 DWR的下载 446
13.2 DWR入门与实例演示 447
13.2.1 创建工程结构 447
13.2.2 在web.xml中配置DWR 447
13.2.3 配置dwr.xml 448
13.2.4 页面代码 449
13.2.5 运行效果 451
13.2.6 DWR与直接使用XMLHttpRequest对象的比较 452
13.2.7 在DWR中操纵自定义的对象 454
13.2.8 查看DWR的输出日志 459
13.3 dwr.xml的配置 460
13.3.1 dwr.xml的标准结构 460
13.3.2 〈init〉标签与DWR自带的converter和creator 461
13.3.3 〈allow〉标签 465
13.3.4 〈signature〉标签 466
13.3.5 另一个例子 467
13.4 util.js 470
13.4.1 调用util.js 471
13.4.2 使用useLoadingMessage方法显示提示图标 471
13.4.3 DWRUtil.setValue和DWRUtil.getValue 475
13.4.4 DWRUtil.getValues和DWRUtil.setValues 478
13.4.5 DWRUtil.addOptions和DWRUtil.removeAllOptions 482
13.4.6 DWRUtil.addRows和DWRUtil.removeAllRows 487
13.4.7 DWRUtil.to DescriptiveString方法 492
13.5 小结 493
第14章 搜索引擎综合实例:Web篇 494
14.1 配置文件 494
14.1.1 Spring配置文件 494
14.1.2 DWR配置文件 495
14.1.3 web.xml 496
14.2.1 SearchResult 498
14.2 各种Bean类 498
14.2.2 SearchResults 500
14.2.3 SearchRequest 502
14.3 SearchService的实现 502
14.4 SearchResultDao 507
14.5 前台部分 509
14.5.1 搜索主页面main.jsp 509
14.5.2 图片的显示 515
14.5.3 详细信息页面detail.sp 516
14.6 问题 519
14.7 小结 521