第一篇 搜索引擎入门
第1章 搜索引擎与信息检索 1
1.1 搜索引擎的历史 1
1.1.1 萌芽:Archie、Gopher 1
1.1.2 起步:Robot(网络机器人)的出现与Spider(网络爬虫) 3
1.1.3 发展:Excite、Galaxy、Yahoo等 4
1.1.4 繁荣:Infoseek、AltaVista、Google和Baidu 6
1.2 信息检索系统的基本知识 8
1.2.1 什么是信息检索系统 8
1.2.2 信息检索的过程 10
1.2.3 传统查找的优点和不足 11
1.2.4 使用索引提高检索速度 12
1.2.5 倒排索引 12
1.2.4 评价信息检索系统的标准 14
1.3 Lucene的简介 14
1.4 小结 15
第二篇 Lucene开发详解
第2章 Lucene入门实例 16
2.1 实例介绍 16
2.1.1 实例说明 16
2.1.2 开发过程 16
2.2 准备工作 17
2.2.1 将文档的全角标点转成半角标点 18
2.2.2 将大文档切分成多个小文档 20
2.2.3 预处理源文件的统一接口 21
2.3 创建Eclipse工程 22
2.3.1 准备工作 22
2.3.2 创建工程并引入Lucene的JAR包 24
2.3.3 运行文档预处理类 32
2.3.4 创建处理文档的索引类:IndexProcessor 33
2.3.5 创建检索索引的搜索类 36
2.4 运行效果 39
2.5 小结 41
第3章 索引的建立 42
3.1 Document逻辑文件 42
3.1.1 Lucene的Document 42
3.1.2 为Document添加多种Field 43
3.1.3 Document的内部实现 44
3.2 Field的内部实现 46
3.2.1 Field包含的类 46
3.2.2 Field类的构造方法 47
3.2 Lucene的索引工具IndexWriter 49
3.2.1 IndexWriter的初始化 49
3.2.2 向索引添加文档 51
3.2.3 限制每个Field中的词条的数量 52
3.3 Lucene索引过程详解 53
3.3.1 Lucene索引建立过程概览 53
3.3.2 使用addDocument方法向索引添加文档 54
3.3.3 DocumentWriter的addDocument方法 56
3.3.4 文档的倒排 61
3.3.5 对postingTable进行排序 66
3.3.6 将Posting信息写入索引 67
3.4 索引文件格式 68
3.4.1 索引的segment 68
3.4.2 .fnm格式 68
3.4.3 .fdx与.fdt格式 69
3.4.4 .tii与.tis格式 70
3.4.5 deletable格式 70
3.4.6 复合索引格式.cfs 70
3.5 索引过程的调优 71
3.5.1 合并因子mergeFactor 71
3.5.2 maxMergeDocs 72
3.5.3 minMergeDocs 72
3.6 索引的合并与索引的优化 72
3.6.1 FSDirectory与RAMDirectory 72
3.6.2 使用IndexWriter来合并索引 73
3.6.3 索引的优化 75
3.7 从索引中删除文档 76
3.7.1 索引的读取工具IndexReader 76
3.7.1 使用文档id号来删除特定文档 80
3.7.2 使用Field信息来删除批量文档 82
3.8 Lucene的同步问题 82
3.8.1 为什么要进行同步以及Lucene的同步法则 82
3.8.2 commit.lock与write.lock 83
3.9 Lucene 2.0的新类:IndexModifier类 84
3.10 小结 85
第4章 Lucene搜索 86
4.1 使用IndexSearcher进行搜索 86
4.1.1 初始化IndexSearcher 86
4.1.2 IndexSearcher的最简单使用 86
4.1.3 IndexSearcher的多种search方法 87
4.2 Hits类详解 89
4.2.1 Hits类的公有接口 89
4.2.2 效率分析 90
4.2.3 Hits内部的缓存 93
4.2.4 Hits类的工作原理 95
4.3 对搜索结果的评分 96
4.3.1 文档与词条的向量空间 96
4.3.2 Lucene的文档得分算法 97
4.4 构建各种Lucene内建的Query对象 100
4.4.1 toString:查看原子查询 100
4.4.2 查询重写与权重 101
4.4.3 TermQuery词条搜索 101
4.4.4 BooleanQuery布尔搜索 102
4.4.5 RangeQuery范围搜索 110
4.4.6 PrefixQuery前缀搜索 113
4.4.7 PhraseQuery:短语搜索 116
4.4.8 MultiPhraseQuery:多短语搜索 119
4.4.9 FuzzyQuery模糊搜索 124
4.4.10 WildcardQuery通配符搜索 127
4.4.11 SpanQuery跨度搜索 128
4.5 第三方提供的Query对象:RegexQuery 136
4.6 通过QueryParser转换用户关键字 138
4.6.1 词条的定义 139
4.6.2 QueryParser初始化 139
4.6.3 改变QueryParser默认的布尔逻辑 140
4.6.4 短语和QueryParser 141
4.6.5 FuzzyQuery和QueryParser 142
4.6.6 通配符与QueryParser 143
4.6.7 查找指定的Field 143
4.6.8 RangeQuery与QueryParser 147
4.6.9 QueryParser和SpanQuery 148
4.7 多Field搜索与多索引搜索 148
4.7.1 多域搜索MultiFieldQueryParser 149
4.7.2 MultiSearcher在多个索引上搜索 150
4.7.3 ParalellMultiSearcher:多线程搜索 154
4.7.4 Searchable和RMI 156
4.8 小结 158
第5章 排序、过滤和分页 159
5.1 相关度排序 159
5.1.1 使用Score进行自然排序 159
5.1.2 Searcher的explain方法 161
5.1.3 通过改变boost值来改变文档的得分 162
5.2 使用Sort来排序 166
5.2.1 Sort简介 166
5.2.2 SortField 166
5.2.3 按文档得分进行排序 168
5.2.4 按文档的内部id号来排序 171
5.2.5 按一个或多个Field来排序 172
5.2.6 改变SortField中的Locale信息 179
5.3 搜索的过滤器 180
5.3.1 过滤器的基本结构 180
5.3.2 一个简单的Filter:建立索引 181
5.3.3 一个简单的Filter:打印索引文档信息 183
5.3.4 一个简单的Filter:安全级别与过滤器代码 184
5.3.5 一个简单的Filter:在搜索时应用过滤器 185
5.3.6 一个简单的Filter:总结 187
5.3.7 按范围过滤RangeFilter 187
5.3.8 在结果中查询QueryFilter 191
5.3.9 缓存结果:CachingWrapperFilter 194
5.4 翻页问题 195
5.4.1 依赖于session的翻页 195
5.4.2 多次查询 195
5.4.3 缓存+多次查询 195
5.4.4 缓存+多次查询+数据库 196
5.5 小结 196
第6章 Lucene的分析器 197
6.1 分析 197
6.1.1 分词 197
6.1.2 Lucene的分析器结构 198
6.1.3 Lucene的分析器实现 199
6.2 Lucene与JavaCC 201
6.2.1 JavaCC简介 201
6.2.2 JavaCC为Lucene提供的分析器脚本 202
6.2.3 Lucene的标准分析器 205
6.2.4 标准过滤器:StandardFilter 207
6.2.5 大小写转换器:LowerCaseFilter 208
6.2.6 忽略词过滤器:StopFilter 208
6.3 分析器的进阶 209
6.3.1 再看StandardAnalyzer中的管道过滤器结构 209
6.3.2 长度过滤器:LengthFilter 210
6.3.3 PerFieldAnalyzerWrapper 210
6.3.4 其他 211
6.4 对中文的分析 211
6.4.1 现有的中文分词方式简介 211
6.4.2 中科院的分词软件和JE分词 213
6.5 小结 219
第三篇 Lucene相关话题
第7章 Word、Excel和PDF的处理 220
7.1 使用PDFBox处理PDF文档 220
7.1.1 PDFBox的下载 220
7.1.2 在Eclipse中配置 220
7.1.3 使用PDFBox解析PDF内容 221
7.1.4 运行效果 223
7.1.5 与Lucene的集成 224
7.2 使用xpdf来处理中文PDF文档 226
7.2.1 xpdf的下载 226
7.2.2 配置 227
7.2.3 提取中文 227
7.2.4 运行效果 230
7.3 使用POI来处理Excel和Word文件格式 231
7.3.1 对Excel的处理类 231
7.3.2 ExcelReader的运行效果 235
7.3.3 POI中Excel文件Cell的类型 236
7.3.4 对Word的处理类 238
7.4 使用Jacob来处理Word文档 239
7.4.1 Jacob的下载 240
7.4.2 在Eclipse中配置 240
7.5 小结 242
第8章 Compass:封装了Lucene的框架 243
8.1 Compass简介 243
8.1.1 Compass的下载 243
8.1.2 Compass的代码片断 244
8.2 Compass的初始配置 245
8.2.1 Compass的配置文件 245
8.2.2 将索引存放于内存中 246
8.2.3 使用JDBC来存储索引 246
8.2.4 使用连接池来存储索引 247
8.2.5 加载compass.cfg.xml文件 248
8.3 域模型的配置 248
8.3.1 实体代码 248
8.3.2 实体关系 254
8.3.3 实体Book的配置文件 255
8.3.4 通用元数据定义文件(.cmd.xml) 255
8.3.5 Author和Article的配置文件 259
8.4 使用Compass来建立索引 261
8.4.1 索引代码 262
8.4.2 对象关系图和运行结果 263
8.5 使用Compass来搜索 264
8.5.1 使用find()方法搜索 264
8.5.2 CompassHits类型 265
8.5.3 CompassHit类型 266
8.5.4 使用Lucene语法来查找 267
8.6 配置Analyzer和Optimizer 269
8.7 小结 269
第9章 Lucene分布式和Google Search API 271
9.1 Lucene与分布式 271
9.1.1 什么是GFS 271
9.1.2 为Lucene提供分布式的几点设想 272
9.2 Google的Search API 274
9.2.1 搭建环境 274
9.2.2 构建搜索类 275
9.2.3 设置查询时的参数和查询语法 277
9.2.4 运行测试 278
9.3 小结 279
第四篇 网络爬虫Heritrix
第10章 无比强大的网络爬虫Heritrix 280
10.1 Heritrix的使用入门 280
10.1.1 下载和运行Heritrix 280
10.1.2 在Eclipse里配置Heritrix的开发环境 283
10.1.3 创建一个新的抓取任务 288
10.1.4 设置抓取时的处理链 289
10.1.5 设置运行时的参数 293
10.1.6 运行抓取任务 294
10.1.7 Heritrix的镜象存储结构 298
10.1.8 终止抓取或终止Heritrix的运行 299
10.2 Heritrix的架构 300
10.2.1 抓取任务CrawlOrder 300
10.2.2 中央控制器CrawlController 301
10.2.3 Frontier链接制造工厂 304
10.2.4 用Berkeley DB实现的BdbFrontier 309
10.2.5 Heritrix的多线程ToeThread和ToePool 312
10.2.6 处理链和Processor 315
10.3 扩展和定制Heritrix 318
10.3.1 向Heritrix中添加自己的Extractor 318
10.3.2 定制Queue-assignment-policy两个问题 323
10.3.3 定制Queue-assignment-policy继承QueueAssignmentPolicy类 324
10.3.4 扩展FrontierScheduler来抓取特定的内容 324
10.3.5 在Prefetcher中取消robots.txt的限制 326
10.4 小结 327
第五篇 构建垂直搜索引擎
第11章 搜索引擎的数据准备 328
11.1 实例简介以及实现途径 328
11.1.1 选择网站 328
11.1.2 太平洋电脑网和网易手机频道 329
11.1.3 分析网站内容,准备抓取清单 330
11.1.4 从下拉列表获得手机品牌首页 333
11.1.5 解析出手机品牌页面 336
11.2 在Heritrix中为pconline开发抓取所需的定制类 339
11.2.1 保存所有产品的页面和图片 339
11.2.2 不保存其他无关页面 340
11.2.3 开始抓取 341
11.3 在Heritrix中为网易手机频道开发抓取所需的定制类 343
11.3.1 分析网易手机频道 343
11.3.2 设计抓取代码 345
11.4 在Eclipse中创建工程结构 351
11.2.1 下载插件 351
11.2.2 在Eclipse中配置插件 351
11.2.3 创建工程 353
11.2.3 设置工程的Context 354
11.2.3 设定源代码存放和输出路径 355
11.2.3 添加Java代码 356
11.2.3 添加Jar包 357
11.2.3 创建JSP文件 359
11.2.3 工程整体结构一览 361
11.5 设定配置文件及其相关类 362
11.5.1 系统属性配置文件 362
11.5.2 封装配置文件 363
11.6 产品详细信息文件格式 365
11.7 解析网页信息的基类Extractor 366
11.8 太平洋电脑网手机产品页面Extractor 370
11.9 pconline产品信息运行效果测试 374
11.9.1 编写测试函数 374
11.9.2 执行测试 375
11.10 网易手机频道的产品信息运行效果 378
11.11 构建产品信息词库 381
11.12 数据库与索引结构 384
11.12.1 定义Product类 384
11.12.2 确定数据库与索引的结构 386
11.13 数据库处理和索引处理 389
11.13.1 对数据库进行操作 389
11.13.2 对索引进行操作 391
11.14 调用数据库处理类和索引处理类 393
11.15 运行 397
11.3 小结 400
第12章 使用正则表达式与HTMLParser提取网页内容 402
12.1 HTML的基本知识 402
12.2 JDK中的正则表达式提取网页内容 403
12.2.1 java.util.regex包 403
12.2.2 正则表达式提取网页内容实例 404
12.3 HTMLParser提取网页内容 409
12.3.1 HTMLParser的下载 409
12.3.2 HTMLParser概述 409
12.3.3 Lexer功能及实现 410
12.3.4 HTMLParser功能及实现 415
12.3.5 HTMLParser实例 420
12.4 小结 422
第13章 使用Ajax框架:DWR 423
13.1 DWR的下载 423
13.2 DWR入门与实例演示 423
13.2.1 创建工程结构 423
13.2.2 在web.xml中配置DWR 424
13.2.3 配置dwr.xml 425
13.2.4 页面代码 425
13.2.5 运行效果 427
13.2.6 DWR与直接使用XMLHttpRequest对象的比较 428
13.2.7 在DWR中操纵自定义的对象 430
13.2.8 查看DWR的输出日志 435
13.3 dwr.xml的配置 436
13.3.1 dwr.xml的标准结构 436
13.3.2 <init>标签与DWR自带的converter和creator 437
13.3.3 <allow>标签 441
13.3.4 <signature>标签 442
13.3.5 另一个例子 443
13.4 util.js 446
13.4.1 调用util.js 447
13.4.2 使用useLoadingMessage()方法显示提示图标 447
13.4.3 DWRUtil.setValue()和DWRUtil.getValue() 451
13.4.4 DWRUtil.getValues和DWRUtil.setValues 454
13.4.5 DWRUtil.addOptions和DWRUtil.removeAllOptions 458
13.4.6 DWRUtil.addRows和DWRUtil.removeAllRows 463
6. DWRUtil.toDescriptiveString方法 469
13.5 小结 470
第14章 实现Web界面 471
14.1 配置文件 471
14.1.1 Spring配置文件 471
14.1.2 DWR配置文件 472
14.1.3 web.xml 473
14.2 各种Bean类 474
14.2.1 SearchResult 475
14.2.2 SearchResults 477
14.2.3 SearchRequest 478
14.3 SearchService的实现 479
14.4 SearchResultDAO 483
14.5 前台部分 486
14.5.1 搜索主页面main.jsp 486
14.5.2 图片的显示 491
14.5.3 详细信息页面detail.jsp 493
14.6 问题 495
14.7 小结 497
第1章 搜索引擎与信息检索 1
1.1 搜索引擎的历史 1
1.1.1 萌芽:Archie、Gopher 1
1.1.2 起步:Robot(网络机器人)的出现与Spider(网络爬虫) 3
1.1.3 发展:Excite、Galaxy、Yahoo等 4
1.1.4 繁荣:Infoseek、AltaVista、Google和Baidu 6
1.2 信息检索系统的基本知识 8
1.2.1 什么是信息检索系统 8
1.2.2 信息检索的过程 10
1.2.3 传统查找的优点和不足 11
1.2.4 使用索引提高检索速度 12
1.2.5 倒排索引 12
1.2.4 评价信息检索系统的标准 14
1.3 Lucene的简介 14
1.4 小结 15
第二篇 Lucene开发详解
第2章 Lucene入门实例 16
2.1 实例介绍 16
2.1.1 实例说明 16
2.1.2 开发过程 16
2.2 准备工作 17
2.2.1 将文档的全角标点转成半角标点 18
2.2.2 将大文档切分成多个小文档 20
2.2.3 预处理源文件的统一接口 21
2.3 创建Eclipse工程 22
2.3.1 准备工作 22
2.3.2 创建工程并引入Lucene的JAR包 24
2.3.3 运行文档预处理类 32
2.3.4 创建处理文档的索引类:IndexProcessor 33
2.3.5 创建检索索引的搜索类 36
2.4 运行效果 39
2.5 小结 41
第3章 索引的建立 42
3.1 Document逻辑文件 42
3.1.1 Lucene的Document 42
3.1.2 为Document添加多种Field 43
3.1.3 Document的内部实现 44
3.2 Field的内部实现 46
3.2.1 Field包含的类 46
3.2.2 Field类的构造方法 47
3.2 Lucene的索引工具IndexWriter 49
3.2.1 IndexWriter的初始化 49
3.2.2 向索引添加文档 51
3.2.3 限制每个Field中的词条的数量 52
3.3 Lucene索引过程详解 53
3.3.1 Lucene索引建立过程概览 53
3.3.2 使用addDocument方法向索引添加文档 54
3.3.3 DocumentWriter的addDocument方法 56
3.3.4 文档的倒排 61
3.3.5 对postingTable进行排序 66
3.3.6 将Posting信息写入索引 67
3.4 索引文件格式 68
3.4.1 索引的segment 68
3.4.2 .fnm格式 68
3.4.3 .fdx与.fdt格式 69
3.4.4 .tii与.tis格式 70
3.4.5 deletable格式 70
3.4.6 复合索引格式.cfs 70
3.5 索引过程的调优 71
3.5.1 合并因子mergeFactor 71
3.5.2 maxMergeDocs 72
3.5.3 minMergeDocs 72
3.6 索引的合并与索引的优化 72
3.6.1 FSDirectory与RAMDirectory 72
3.6.2 使用IndexWriter来合并索引 73
3.6.3 索引的优化 75
3.7 从索引中删除文档 76
3.7.1 索引的读取工具IndexReader 76
3.7.1 使用文档id号来删除特定文档 80
3.7.2 使用Field信息来删除批量文档 82
3.8 Lucene的同步问题 82
3.8.1 为什么要进行同步以及Lucene的同步法则 82
3.8.2 commit.lock与write.lock 83
3.9 Lucene 2.0的新类:IndexModifier类 84
3.10 小结 85
第4章 Lucene搜索 86
4.1 使用IndexSearcher进行搜索 86
4.1.1 初始化IndexSearcher 86
4.1.2 IndexSearcher的最简单使用 86
4.1.3 IndexSearcher的多种search方法 87
4.2 Hits类详解 89
4.2.1 Hits类的公有接口 89
4.2.2 效率分析 90
4.2.3 Hits内部的缓存 93
4.2.4 Hits类的工作原理 95
4.3 对搜索结果的评分 96
4.3.1 文档与词条的向量空间 96
4.3.2 Lucene的文档得分算法 97
4.4 构建各种Lucene内建的Query对象 100
4.4.1 toString:查看原子查询 100
4.4.2 查询重写与权重 101
4.4.3 TermQuery词条搜索 101
4.4.4 BooleanQuery布尔搜索 102
4.4.5 RangeQuery范围搜索 110
4.4.6 PrefixQuery前缀搜索 113
4.4.7 PhraseQuery:短语搜索 116
4.4.8 MultiPhraseQuery:多短语搜索 119
4.4.9 FuzzyQuery模糊搜索 124
4.4.10 WildcardQuery通配符搜索 127
4.4.11 SpanQuery跨度搜索 128
4.5 第三方提供的Query对象:RegexQuery 136
4.6 通过QueryParser转换用户关键字 138
4.6.1 词条的定义 139
4.6.2 QueryParser初始化 139
4.6.3 改变QueryParser默认的布尔逻辑 140
4.6.4 短语和QueryParser 141
4.6.5 FuzzyQuery和QueryParser 142
4.6.6 通配符与QueryParser 143
4.6.7 查找指定的Field 143
4.6.8 RangeQuery与QueryParser 147
4.6.9 QueryParser和SpanQuery 148
4.7 多Field搜索与多索引搜索 148
4.7.1 多域搜索MultiFieldQueryParser 149
4.7.2 MultiSearcher在多个索引上搜索 150
4.7.3 ParalellMultiSearcher:多线程搜索 154
4.7.4 Searchable和RMI 156
4.8 小结 158
第5章 排序、过滤和分页 159
5.1 相关度排序 159
5.1.1 使用Score进行自然排序 159
5.1.2 Searcher的explain方法 161
5.1.3 通过改变boost值来改变文档的得分 162
5.2 使用Sort来排序 166
5.2.1 Sort简介 166
5.2.2 SortField 166
5.2.3 按文档得分进行排序 168
5.2.4 按文档的内部id号来排序 171
5.2.5 按一个或多个Field来排序 172
5.2.6 改变SortField中的Locale信息 179
5.3 搜索的过滤器 180
5.3.1 过滤器的基本结构 180
5.3.2 一个简单的Filter:建立索引 181
5.3.3 一个简单的Filter:打印索引文档信息 183
5.3.4 一个简单的Filter:安全级别与过滤器代码 184
5.3.5 一个简单的Filter:在搜索时应用过滤器 185
5.3.6 一个简单的Filter:总结 187
5.3.7 按范围过滤RangeFilter 187
5.3.8 在结果中查询QueryFilter 191
5.3.9 缓存结果:CachingWrapperFilter 194
5.4 翻页问题 195
5.4.1 依赖于session的翻页 195
5.4.2 多次查询 195
5.4.3 缓存+多次查询 195
5.4.4 缓存+多次查询+数据库 196
5.5 小结 196
第6章 Lucene的分析器 197
6.1 分析 197
6.1.1 分词 197
6.1.2 Lucene的分析器结构 198
6.1.3 Lucene的分析器实现 199
6.2 Lucene与JavaCC 201
6.2.1 JavaCC简介 201
6.2.2 JavaCC为Lucene提供的分析器脚本 202
6.2.3 Lucene的标准分析器 205
6.2.4 标准过滤器:StandardFilter 207
6.2.5 大小写转换器:LowerCaseFilter 208
6.2.6 忽略词过滤器:StopFilter 208
6.3 分析器的进阶 209
6.3.1 再看StandardAnalyzer中的管道过滤器结构 209
6.3.2 长度过滤器:LengthFilter 210
6.3.3 PerFieldAnalyzerWrapper 210
6.3.4 其他 211
6.4 对中文的分析 211
6.4.1 现有的中文分词方式简介 211
6.4.2 中科院的分词软件和JE分词 213
6.5 小结 219
第三篇 Lucene相关话题
第7章 Word、Excel和PDF的处理 220
7.1 使用PDFBox处理PDF文档 220
7.1.1 PDFBox的下载 220
7.1.2 在Eclipse中配置 220
7.1.3 使用PDFBox解析PDF内容 221
7.1.4 运行效果 223
7.1.5 与Lucene的集成 224
7.2 使用xpdf来处理中文PDF文档 226
7.2.1 xpdf的下载 226
7.2.2 配置 227
7.2.3 提取中文 227
7.2.4 运行效果 230
7.3 使用POI来处理Excel和Word文件格式 231
7.3.1 对Excel的处理类 231
7.3.2 ExcelReader的运行效果 235
7.3.3 POI中Excel文件Cell的类型 236
7.3.4 对Word的处理类 238
7.4 使用Jacob来处理Word文档 239
7.4.1 Jacob的下载 240
7.4.2 在Eclipse中配置 240
7.5 小结 242
第8章 Compass:封装了Lucene的框架 243
8.1 Compass简介 243
8.1.1 Compass的下载 243
8.1.2 Compass的代码片断 244
8.2 Compass的初始配置 245
8.2.1 Compass的配置文件 245
8.2.2 将索引存放于内存中 246
8.2.3 使用JDBC来存储索引 246
8.2.4 使用连接池来存储索引 247
8.2.5 加载compass.cfg.xml文件 248
8.3 域模型的配置 248
8.3.1 实体代码 248
8.3.2 实体关系 254
8.3.3 实体Book的配置文件 255
8.3.4 通用元数据定义文件(.cmd.xml) 255
8.3.5 Author和Article的配置文件 259
8.4 使用Compass来建立索引 261
8.4.1 索引代码 262
8.4.2 对象关系图和运行结果 263
8.5 使用Compass来搜索 264
8.5.1 使用find()方法搜索 264
8.5.2 CompassHits类型 265
8.5.3 CompassHit类型 266
8.5.4 使用Lucene语法来查找 267
8.6 配置Analyzer和Optimizer 269
8.7 小结 269
第9章 Lucene分布式和Google Search API 271
9.1 Lucene与分布式 271
9.1.1 什么是GFS 271
9.1.2 为Lucene提供分布式的几点设想 272
9.2 Google的Search API 274
9.2.1 搭建环境 274
9.2.2 构建搜索类 275
9.2.3 设置查询时的参数和查询语法 277
9.2.4 运行测试 278
9.3 小结 279
第四篇 网络爬虫Heritrix
第10章 无比强大的网络爬虫Heritrix 280
10.1 Heritrix的使用入门 280
10.1.1 下载和运行Heritrix 280
10.1.2 在Eclipse里配置Heritrix的开发环境 283
10.1.3 创建一个新的抓取任务 288
10.1.4 设置抓取时的处理链 289
10.1.5 设置运行时的参数 293
10.1.6 运行抓取任务 294
10.1.7 Heritrix的镜象存储结构 298
10.1.8 终止抓取或终止Heritrix的运行 299
10.2 Heritrix的架构 300
10.2.1 抓取任务CrawlOrder 300
10.2.2 中央控制器CrawlController 301
10.2.3 Frontier链接制造工厂 304
10.2.4 用Berkeley DB实现的BdbFrontier 309
10.2.5 Heritrix的多线程ToeThread和ToePool 312
10.2.6 处理链和Processor 315
10.3 扩展和定制Heritrix 318
10.3.1 向Heritrix中添加自己的Extractor 318
10.3.2 定制Queue-assignment-policy两个问题 323
10.3.3 定制Queue-assignment-policy继承QueueAssignmentPolicy类 324
10.3.4 扩展FrontierScheduler来抓取特定的内容 324
10.3.5 在Prefetcher中取消robots.txt的限制 326
10.4 小结 327
第五篇 构建垂直搜索引擎
第11章 搜索引擎的数据准备 328
11.1 实例简介以及实现途径 328
11.1.1 选择网站 328
11.1.2 太平洋电脑网和网易手机频道 329
11.1.3 分析网站内容,准备抓取清单 330
11.1.4 从下拉列表获得手机品牌首页 333
11.1.5 解析出手机品牌页面 336
11.2 在Heritrix中为pconline开发抓取所需的定制类 339
11.2.1 保存所有产品的页面和图片 339
11.2.2 不保存其他无关页面 340
11.2.3 开始抓取 341
11.3 在Heritrix中为网易手机频道开发抓取所需的定制类 343
11.3.1 分析网易手机频道 343
11.3.2 设计抓取代码 345
11.4 在Eclipse中创建工程结构 351
11.2.1 下载插件 351
11.2.2 在Eclipse中配置插件 351
11.2.3 创建工程 353
11.2.3 设置工程的Context 354
11.2.3 设定源代码存放和输出路径 355
11.2.3 添加Java代码 356
11.2.3 添加Jar包 357
11.2.3 创建JSP文件 359
11.2.3 工程整体结构一览 361
11.5 设定配置文件及其相关类 362
11.5.1 系统属性配置文件 362
11.5.2 封装配置文件 363
11.6 产品详细信息文件格式 365
11.7 解析网页信息的基类Extractor 366
11.8 太平洋电脑网手机产品页面Extractor 370
11.9 pconline产品信息运行效果测试 374
11.9.1 编写测试函数 374
11.9.2 执行测试 375
11.10 网易手机频道的产品信息运行效果 378
11.11 构建产品信息词库 381
11.12 数据库与索引结构 384
11.12.1 定义Product类 384
11.12.2 确定数据库与索引的结构 386
11.13 数据库处理和索引处理 389
11.13.1 对数据库进行操作 389
11.13.2 对索引进行操作 391
11.14 调用数据库处理类和索引处理类 393
11.15 运行 397
11.3 小结 400
第12章 使用正则表达式与HTMLParser提取网页内容 402
12.1 HTML的基本知识 402
12.2 JDK中的正则表达式提取网页内容 403
12.2.1 java.util.regex包 403
12.2.2 正则表达式提取网页内容实例 404
12.3 HTMLParser提取网页内容 409
12.3.1 HTMLParser的下载 409
12.3.2 HTMLParser概述 409
12.3.3 Lexer功能及实现 410
12.3.4 HTMLParser功能及实现 415
12.3.5 HTMLParser实例 420
12.4 小结 422
第13章 使用Ajax框架:DWR 423
13.1 DWR的下载 423
13.2 DWR入门与实例演示 423
13.2.1 创建工程结构 423
13.2.2 在web.xml中配置DWR 424
13.2.3 配置dwr.xml 425
13.2.4 页面代码 425
13.2.5 运行效果 427
13.2.6 DWR与直接使用XMLHttpRequest对象的比较 428
13.2.7 在DWR中操纵自定义的对象 430
13.2.8 查看DWR的输出日志 435
13.3 dwr.xml的配置 436
13.3.1 dwr.xml的标准结构 436
13.3.2 <init>标签与DWR自带的converter和creator 437
13.3.3 <allow>标签 441
13.3.4 <signature>标签 442
13.3.5 另一个例子 443
13.4 util.js 446
13.4.1 调用util.js 447
13.4.2 使用useLoadingMessage()方法显示提示图标 447
13.4.3 DWRUtil.setValue()和DWRUtil.getValue() 451
13.4.4 DWRUtil.getValues和DWRUtil.setValues 454
13.4.5 DWRUtil.addOptions和DWRUtil.removeAllOptions 458
13.4.6 DWRUtil.addRows和DWRUtil.removeAllRows 463
6. DWRUtil.toDescriptiveString方法 469
13.5 小结 470
第14章 实现Web界面 471
14.1 配置文件 471
14.1.1 Spring配置文件 471
14.1.2 DWR配置文件 472
14.1.3 web.xml 473
14.2 各种Bean类 474
14.2.1 SearchResult 475
14.2.2 SearchResults 477
14.2.3 SearchRequest 478
14.3 SearchService的实现 479
14.4 SearchResultDAO 483
14.5 前台部分 486
14.5.1 搜索主页面main.jsp 486
14.5.2 图片的显示 491
14.5.3 详细信息页面detail.jsp 493
14.6 问题 495
14.7 小结 497