分类号:TP391.

1

单位代码:11232
密级:

区域内 校际搜 索引擎 技术的
研究与 实现

二○○八年五月

摘要

摘要

随着高校网络建设的迅速发展,高校网络上的资源也越来越丰
富,而这些资源集中了大量高校间可以共享的信息,为了便于某一
特定区域高校间的信息沟通,资源共享,节省查询时间,提高效率,
有必要建立一个基于限定区域高校的搜索引擎。
本文对搜索引擎的原理、组成、数据结构、关键技术等方面做了深入而细致
地研究和分析。在理论研究的基础上,本文还利用 java 技术对搜索引擎的三个
核心部分即网络蜘蛛、网页索引、检索进行了实现。网络蜘蛛部分采用了非递归
爬取方式和 java 的多线程机制,利用一个基于内存的作业队列管理器负责网页
抓取过程中 URL 链接的加入、分配、处理等作业,同时使用多线程技术并发抓取
网页。索引和搜索部分借助 Lucene 全文搜索引擎库中的 java 类进行实现。Lucene
是 Apache 软件基金会的一个开源项目,完全由 Java 类进行实现,适用于需要
全文搜索能力的应用程序,并具有良好的跨平台能力。本系统在其基础上对中
文分词方面进行了改进并设计了适合高校网页的查询结果排序算法。 采用
JSP(Java Server Pages)技术设计了一个简易的搜索引擎客户端,最终开发实
现了一个基于区域内高校的资源搜索平台。
关键词: 搜索引擎;网络蜘蛛;索引;Lucene;Java

ABSTRACT

ABSTRACT
With the rapid development of University network construction, university
network resources has become increasingly rich. And these resources among colleges
and universities have a lot of information that can be shared. In order to facilitate
communication of information, share resources ,save the query time and improve the
efficiency in a particular region between colleges and universities, it is necessary to
establish a search engine based on limited regional colleges and universities. 
This paper dose a thorough and detailed study and analysis on the principle of
search engines, components, data structure and key technology. On the basis of theory
research, this paper also uses java technology to achieve three core parts of the search
engine: network spider, page index, and the searcher. Web spider uses a non-recursive
crawling way and the multi-threading mechanism in java, uses a task queue manager
based on the memory to responsible for the adding, distribution, processing of URL
link in the process of web accession, in the meanwhile uses the multi-threading
technology so as to snatch the webs concurrently. Indexer and searcher are realized by
the java class in the Lucene full-text search engine library. Lucene is an open source
project of Apache Software Foundation. It is conducted entirely by the Java class
realization of the need to apply the full text search capability of the applications, and
offers well cross-platform capabilities. Based on it, this system does some
improvements in the Chinese word segmentation and designs the algorithm of search
results in order. The search engine user interface is designed by JSP(Java Server
Pages) technology. Finally, the resources search platform based on regional colleges
and universities is realized.
Key Words: Search Engine;Web Spider;Index;Lucene;Java

目录

目录
摘要..............................................................................................................................3
ABSTRACT..................................................................................................................4
第 1 章 引言..................................................................................................................8
1.1 研究背景....................................................8
1.2 研究现状....................................................8
1.3 主要搜索引擎的性能比较.....................................10
1.4 本文内容...................................................12
第 2 章 系统设计及主要数据结构............................................................................14
2.1 搜索引擎的工作原理.........................................14
2.2 系统设计...................................................15
2.3 存储结构...................................................17
2.3.1 页面存储库..........................................................................................18
2.3.2 词典库..................................................................................................18
2.3.3 Hits 列表...............................................................................................20
2.4 索引结构...................................................21
第 3 章 网页抓取技术................................................................................................22
3.1 网络蜘蛛的工作原理.........................................22
3.2 相关技术...................................................23
3.2.1 HTTP 协议............................................................................................23
3.2.2 起始地址的选择..................................................................................24

目录

3.2.3 爬虫的控制原则..................................................................................24
3.3 搜索策略...................................................25
3.4 SPIDER 程序的结构............................................27
3.4.1 递归方式..............................................................................................27
3.4.2 非递归方式..........................................................................................27
3.4.3 队列的使用..........................................................................................28
3.5 网页地址的过滤机制.........................................29
3.6 多线程技术在网络蜘蛛程序中的应用...........................32
3.7 网页更新...................................................35
第 4 章 索引技术与查询检索....................................................................................37
4.1 网页内容分析...............................................38
4.1.1 中文分词..............................................................................................40
4.1.2 Lucene 中文分词的局限性 ................................................................40
4.1.3 分词算法..............................................................................................40
4.1.4 本系统使用的分词..............................................................................43
4.1.5 中文分词需要解决的关键问题..........................................................43
4.2 建立索引...................................................45
4.2.1 索引的组织结构..................................................................................45
4.2.2 倒排索引的压缩技术..........................................................................48
4.3 查询结果排序...............................................49

目录

4.3.1 基于网页内容的算法..........................................................................50
4.3.2 基于链接分析的算法..........................................................................50
4.3.3 高校网页结构和内容的分析..............................................................51
4.3.4 排序算法的设计..................................................................................51
第 5 章 软件实现........................................................................................................54
5.1 开发环境...................................................54
5.2 网页抓取模块的实现.........................................55
5.3 页面更新模块...............................................57
5.4 分词器的实现...............................................59
5.5 常用文档处理模块框架.......................................63
5.5.1 HTML 处理模块..................................................................................64
5.5.2 WORD 处理模块..................................................................................65
5.5.3 EXCEL 处理模块.................................................................................65
5.5.4 PowerPoint 处理模块...........................................................................66
5.6 系统演示 ..................................................67
第 6 章 总结与展望....................................................................................................69
6.1 总结.......................................................69
6.2 展望.......................................................70
参考文献....................................................................................................................72

目录

第 1章

引言

1.1 研究 背景
互联网已成为人们获取信息的一个重要途径,随着互联网信息的日益增长,
人们不得不花费大量的时间去搜索浏览自己需要的信息。如何快速、准确、方便
地从如此庞大的信息库中获取自己需要的信息,是互联网用户面临的一个重要
问题。搜索引擎随之成为人们最普遍使用的信息检索的工具。该工具涉及到信息
检索、数据库、数据挖掘、人工智能、分布式处理、自然语言处理等多个领域的理
论和技术,因而具有综合性和挑战性。
随着网络技术的应用与发展,互连网已经成为信息的重要来源地。文献[1]
的统计结果表明,截止2007年1月,国内上网计算机总数为5940万台,域名总
数为4,109,020个,全国网页数为44.7亿个。搜索引擎以一定的策略在互联网
中搜集、发现信息,对信息进行理解、提取、组织和处理,并为用户提供检索服
务,从而起到信息导航的目的,互联网用户使用网络获取信息过程中,搜索引
擎也成为必不可少的工具。调查表明,当前的所有互连网应用中,网络信息搜
索是仅次于电子邮件的第二大应用,而这些搜索绝大多数是采用专门的、高度
复杂的搜索引擎实现的。

随着高校网络建设的迅速发展,高校网络上的资源也越来越丰
富,而这些资源集中了大量高校间可以共享的信息,为了便于某一
特定区域高校间的信息沟通,资源共享,节省查询时间,提高效率,
我的目标是设计一套基于限定区域内的校际搜索引擎。

1.2 研究 现状
按照信息搜集方法和服务提供方式的不同,目前Internet上的搜索引擎大
致可分为基于Directory的、基于Robot的和基于Meta的三大类型[2]。
(1)基于Directory的搜索引擎
基于Directory的搜索引擎由人工发现、抓取、辨别网上信息,然后编目人

目录

员按照某种分类法,建立主题树分层目录,将采集、筛选后的信息分门别类的
放入各大类或子类下面。目录的数据库是依靠专职编辑或志愿人员建立起来的,
这些编辑人员在访问了某个Web站点后撰写一段对该站点的描述,并根据站点
的内容和性质将其归为一个预先分好的类别,把站点的URL和描述放在这个类
别中,当用户查询某个关键词时,搜索软件只在这些描述中进行搜索。很多目
录也接受用户提交的网站和描述,当目录的编辑人员认可该网站及描述后,就
会将之添加到合适的类别中。
目录的结构为树形结构,首页提供了最基本的几个大类的入口,用户可以
一级一级地向下访问,直至找到自己感兴趣的类别,另外,用户也可以利用目
录提供的搜索功能直接查找一个关键词,不过,由于目录只在保存的对站点的
描述中进行搜索,因此站点本身的动态变化不会反映到搜索结果中来,这也是
目录与基于Robot的搜索引擎之间的一大区别。
这类搜索引擎所收录的网络资源经过了专业人员的鉴别、选择和组织,所
以信息准确,导航质量高,但是由于采用了人工方式,成本较高,维护比较困
难。现在很多搜索站点都同时提供有目录和基于Robot的搜索服务,以便尽可能
地为用户提供全面的查询结果。例如著名的搜索引擎Yahoo!、Open Directory等。
(2)基于Robot的搜索引擎
基于Robot的搜索引擎利用一个称为Robot(也叫做Spider、WebCrawler或
Web Wanderer)的程序自动访问Web站点,提取站点上的网页,并根据网页中
的链接进一步提取其它网页,或转移到其它站点上。Robot搜集的网页被加入到
搜索引擎的数据库中,供用户查询使用。Internet上最早出现的搜索引擎就是
利用Robot来建立数据库,“搜索引擎”这个词的原义也只是指这种狭义上的
基于Robot的搜索引擎。基于Robot的搜索引擎由三个主要部分构成:
Robot、Index和搜索软件。Robot从一个事先制定好的URLs列表出发,这个列表
中的URLs通常是从以往访问记录中提取出来的,特别是一些热门站点和
“What's New”网页,从Usenet等地方检索得到的URLs也常被用作起始URLs,
此外,很多搜索引擎还接受用户提交的URLs,这些URLs也会被安排在列表中供
Robot访问。Robot访问了一个网页后,会对它进行分析,提取出新的URLs,将
之加入到访问列表中,如此递归地访问Web。
Robot作为一个程序,可以用C、Perl、Java等语言来编写,可以运行在
Unix、Solaris、Windows、NT、OS2和MAC等平台上。Robot设计是否合理将直接影响
它访问Web的效率,影响搜索数据库的质量,另外,在设计Robot时还必须考虑
它对网络和被访问站点的影响,因为Robot一般都运行在速度快、带宽高的主机
上,如果它快速访问一个速度比较慢的目标站点,就有可能会导致该站点出现
阻塞甚至当机。Robot还应遵守一些协议,以便被访问站点的管理员能够确定哪
些内容能被访问,哪些不能。
Index是一个庞大的数据库,Robot提取的网页将被放入到Index中以便建
立索引,不同的搜索引擎会采取不同方式来建立索引,有的对整个HTML文件的
所有单词都建立索引,有的只分析HTML文件的标题或前几段内容,还有的能处
理HTML文件中的META标记或其它不可见的特殊标记。

目录

基于Robot的搜索引擎一般要定期访问大多数以前搜集的网页,刷新
Index,以反映出网页的更新情况,去除一些死链接,网页的部分内容和变化
情况将会反映到用户查询的结果中,这是基于Robot的搜索引擎的一个重要特
征。
Index在建立索引时,一般会给网页中每个关键词赋予一个等级值,表示
该网页与关键词之间的符合程度。当用户查询一个关键词时,搜索软件将搜
Index,找出所有与关键词相符合的网页,有时候这些网页可能有成千上万,
等级值的用途就是作为一种排序的依据,搜索软件将按照等级值从高到低的顺
序把搜索结果送回到用户的浏览器中。
这类搜索引擎因为依靠程序搜集数据,所以其数据库相当庞大,搜索的结
果查全率较高,但查准率较低。例如著名的搜索引擎
Google、Baidu、AltaVista、InfoSeek等。
(3)基于Meta的搜索引擎
Meta搜索引擎也叫做Multiple Search Engine,它的特点是本身并没有存
放网页信息的数据库,当用户查询一个关键词时,它把用户的查询请求转换成
其它搜索引擎能够接受的命令格式,并行地访问数个搜索引擎来查询这个关键
词,将结果进行相关处理,以整体统一的格式反馈给用户。
严格意义上来讲,Meta搜索引擎只能算是一种用户代理,而不是真正的搜
索引擎。多数Meta搜索引擎在处理其它的搜索引擎返回结果时,只提取出每个
搜索引擎的结果中前面10~50条,并将这些条目合并在一起返回给用户,因此
最后结果的数量可能会远少于直接在一个搜索引擎上进行查找所得到的数量,
这就是为什么很多Internet用户都喜欢使用Meta搜索引擎来查找信息的原因。
Meta搜索引擎实现起来比较简单,但是它也有一定的局限性,例如多数
Meta搜索引擎都只能访问少数几个搜索引擎,并且通常不支持这些搜索引擎的
高级搜索功能,在处理逻辑查询时也常常会出现错误。还有其他的分类方式,
例如按查询方式可分为浏览式搜索引擎、关键词搜索引擎、全文搜索引擎、智能
搜索引擎;按语种又分为单语种搜索引擎、多语种搜索引擎和跨语言搜索引擎
等。

1.3 主要 搜索引 擎的性 能比较

本着科学性、全面性、操作性强的原则,以三级指标体系[3],分别对现有的
主要搜索引擎产品进行评价以下各项,各级指标以及指标的综合权重见表 1.1。
一级指标

二级指标

三级指标

序号

权值

目录

搜索结果

搜索过程

搜全率

1

0.268

搜准率

2

0.239

搜快率

3

0.099

无错率

4

0.0589

相关率

5

0.0675

是否有高级搜索

6

0.0361

是否支持多国语言

7

0.0127

是否有网页快照

8

0.0077

是否有类似搜索

9

0.01

是否有附加功能:词典,计

10

0.0072

11

0.0289

进入搜索产品的速度

12

0.0145

翻页速度

13

0.0081

数据库更新速度

14

0.03

是否有使用帮助

15

0.0136

是否有下载功能条

16

0.0127

是否有纠错能力(错别字)

17

0.0099

支持关键词的多种输入方式

18

0.0096

19

0.0223

20

0.0227

21

0.0113

22

0.0104

功能性

算器…
是否有分类:图片,图像,
mp3,论坛,网站,新闻…
反映速度

方便性

(拼音)
搜索界面

页面美观

页面设计(美观,简洁,重
点突出)
结果排列(整齐,清晰,重
点突出)

个性化

搜索页面设置(显示条目设
置)
语言设置(语言偏好设置)
表 1.1 搜索引擎的三级指标体系

搜索引擎总评测结果,见表 1.2

目录

名称

分数

Google

91.43

Yahoo

90.29

一搜

87.81

百度

83.12

3721

81.85

中搜

77.84

TOM

71.00

新浪

70.36

搜狐

65.23

网易

57.70
表 1.2 搜索引擎总评测结果表

通过各种评测数据,我们可以看出,Google、Yahoo!的综合性能较高;通
过各种数据的综合分析,我们可以对一些主要的搜索引擎做一个全面的定位,
也为本系统的开发提供一些借鉴。

1.4 本文 内容
本文主要对现有的一些搜索系统进行考察,摸清它的系统架构和工作流程。
采用技术追踪的方法,把国内外一些相关的技术文章进行归类总结。跟踪相关开
源项目的最新发展,使用案例学习法,先实现 Demo,再从 Demo 的功能去阅读
源代码,搞清楚项目的架构和思路。运用面向对象思想,采用良好的架构,对
开源项目进行改进,达到既改进系统又不破坏项目原有架构的目的。最终完成
了一个简单而又较为完整的基于区域内的校际搜索引擎系统。

共由六章组成。本章为引言,说明了课题的研究背景和发展现状,
分析了搜索引擎的三级指标体系,并且对一些主要搜索引擎的性能
进行了比较。
第二章 对搜索引擎的原理、结构、工作流程做了分析和研究,设

目录

计了本课题的整体架构,说明了搜索引擎用到的主要数据结构。
第三章 系统的分析研究了网页抓取技术,首先对网络蜘蛛的工
作原理和工作流程进行说明,然后介绍了一些网页抓取时的相关技
术和搜索策略,并详细介绍了 Spider 程序的结构,以及网页地址的
过滤机制和多线程技术在网络蜘蛛程序中的应用,最后说明了网页
更新采用的技术。
第四章 阐述了索引技术及检索。从网页内容分析,建立索引,查询结果排
序三个方面进行了详细的论述。网页内容分析首先介绍了中文分词,指出
Lucene 中文分词的局限性,然后说明了三大类分词算法,在此基础上给出了本
系统使用的分词;建立索引部分首先介绍了索引的组织结构,然后通过一个例
子说明倒排索引的建立过程,并且介绍了倒排索引的压缩技术;查询结果排序
方面先是说明了查询结果排序涉及到的两个方面因素,然后分析了高校的网页
结构,最后设计了适合本系统的排序算法。
第五章 介绍了本课题系统的软件实现。重点介绍了网页抓取模块、页面更
新模块、分词器以及常用文档处理模块的实现。
第六章 对该研究工作进行了总结,并对未来在此基础上的研究方向和研
究问题进行了展望。

第二章

第 2章

系统设计及主要数据结构

系统 设计及 主要数 据结构

本文提到的搜索引擎如果没有特殊说明都是指基于网络蜘蛛 Spider 的搜索
引擎。

2.1

搜索引 擎的工 作原理

搜索引擎并不真正搜索互联网,它搜索的实际上是预先整理好的网页索引
数据库。搜索引擎,也不能真正理解网页上的内容,它只能机械的匹配网页上
的文字。真正意义上的搜索引擎,通常指的是收集了互联网上几千万到几十亿
个网页并对网页中的每一个文字(即关键词)进行索引,建立索引数据库的全
文搜索引擎。我们平时看到的搜索引擎,实际上只是一个搜索引擎系统的检索
界面,当用户输入关键词进行查询时,搜索引擎会从庞大的数据库中找到符合
该关键词的所有相关网页的索引,并按一定的排名规则呈现给我们。不同的搜
索引擎,网页索引数据库不同,排名规则也不尽相同,所以,当我们以同一关
键词用不同的搜索引擎查询时,搜索结果也就不尽相同。但他们的基本原理都
是相同的,搜索引擎的原理,可以看作三步[4]:
a)从互联网上抓取网页;
b)建立索引数据库;
c)在索引数据库中搜索排序。
1.从互联网上抓取网页
抓取页面主要完成从互联网上获取网页和网页间超链结构信息的工作。互
联网可以抽象为一个以网页为结点,超链为边的有向图,网页抓取器的工作则
可以抽象为一个有向图的遍历过程。它从用户配置的一些“种子”网页出发,
根据一定的算法,获取新的网页和超链,从而实现不停的从互联网获取网页的
功能。这种能够从互联网上自动收集网页的程序被称为 Crawler(抓取器)或
Spider(蜘蛛程序)。被抓取的网页按一定的存储结构存入网页库,同时被保存
的还有被抓取网页之间的超链关系,这些信息将被索引分析系统程序用来构建
索引库。
2.建立索引数据库
由分析索引系统程序对收集回来的网页进行分析,提取相关网页信息(包
括网页所在URL、编码类型、页面内容包含的所有关键词、关键词位置、生成时间、
大小、与其它网页的链接关系等),根据一定的相关度算法进行大量复杂计算,

第二章

系统设计及主要数据结构

得到每一个网页针对页面文字中及超链中每一个关键词的相关度(或重要性),
然后用这些相关信息建立网页索引数据库。
3.在索引数据库中搜索排序
当用户输入关键词搜索后,搜索请求经过分解,由搜索系统程序从网页索
引数据库中找到符合该关键词的所有相关网页。因为所有相关网页针对该关键
词的相关信息在索引库中都有记录,只需综合相关信息和网页级别形成相关度
数值,然后进行排序,相关度越高,排名越靠前。最后,由页面生成系统将搜
索结果的链接地址和页面内容摘要等内容组织起来返回给用户。
作为对搜索引擎工作原理的基本了解,需要首先澄清两个问题。
1、 当用户提交查询的时候,搜索引擎并不是即刻在 Web上“搜索”一通,发
现那些相关的网页,形成列表呈现给用户;而是事先已“搜集”了一批网
页,以某种方式存放在系统中,此时的搜索只是在系统内部进行而已。
2、 当用户感到返回结果列表中的某一项很可能是他需要的,从而点击 URL,
获得网页全文的时候,他此时访问的则是网页的原始出处。于是,从理论
上讲搜索引擎并不保证用户在返回结果列表上看到的标题和摘要内容与他
点击URL所看到的内容一致,甚至不保证那个网页还存在。

2.2

系统设 计
网络蜘蛛 Spider 部分采用了非递归爬取方式和 Java 的多线程机制,利用一

个基于内存的作业队列管理器负责网页抓取过程中 URL 链接的加入、分配、处理
等作业,同时使用线程管理池管理多个抓取线程,并发抓取网页。
索引和搜索部分借助 Lucene 全文搜索引擎库中的 java 类进行实现。Lucene
是 Apache 软件基金会的一个开源项目,完全由 Java 类进行实现,适用于需要
全文搜索能力的应用程序,并具有良好的跨平台能力。本系统通过对 Lucene 工
具包的深入剖析,结合中文分词分析器,实现对中英文文档的全文索引,并对
Lucene 设计了适合高校网页的查询结果排序算法。
首先 Spider 到网络上下载类文本文件,可以转换为文本文件的文件,如网
页文件、Excel 文档、Word 文档、PowerPoint 文档等,并将下载到的文件保存在本
地的硬盘上。之后,文件处理器将 Spider 下载的文件转换为统一编码格式的文

第二章

系统设计及主要数据结构

本文件。中文分词模块读入文件处理器处理生成的文本文件进行分词处理,并
提供词元序列供进行索引。索引器从中文分词模块提供的词元序列中读入词元,
然后对词元进行索引,并将索引结果保存到索引数据库中。使用 Tomcat web 服
务器发布系统的检索页而,当用户通过 Web 界面输入要查询的关键词并提交后,
关键词被传递到搜索器中,搜索器到索引数据库中进行检索,提取满足条件的
网页,然后计算网页相关度,根据相关度的数值排序处理后,作为响应发送给
用户。图 3.1 为系统设计图。

第二章

系统设计及主要数据结构

Web 页面

Spider
文档处理器
Analyzer 分词
建立 Lucene 索引

索引库
Analyzer 分词
Lucene 查询器

Tomcat 服务器

图 3.1 系统设计图

2.3

存储结 构

由于搜索引擎对海量文件的存储要求,而操作系统对大型文件的支持局限
性,搜索引擎有必要自行定义和管理大型文件系统。大型文件时跨多文件系统
的虚拟文件,并可以支持 64 位寻址方式。大型文件对于多文件系统的分配和寻
址是自动处理的,并可支持文件描述符的分配和回收,还支持基本的压缩功能。
下面对搜索引擎中用到的存储数据结构做一详细探讨。

第二章

系统设计及主要数据结构

2.3.1 页面存储 库

页面存储库存储网络蜘蛛爬取到的每个 Web 页面完整的 HTML 代码和相应
的 URL 信息,并采取了如图 2.1 所示的压缩存储方式。页面存储不需要其他额
外的数据结构来管理和维护,简化了数据一致性维护的复杂度和工作量。并且,
从页面存储库能够重建其他相关的数据结构。
Sync
Length
Compressed
Sync
Length
Compressed
Packet

Packet

图 2.1 页面存储库存储结构

Sync:同步标志。用于标识压缩包之间的分隔;
Length:压缩包的长度。用于表明压缩包长度和定位;
Compressed Packet:压缩包数据。
页面存储采取紧缩存储方式,利用同步标志和压缩包长度来进行定位和查找。
压缩包主要记录了文档标识号(DocID)和 URL、页面信息等,如图 2.2
DocID

Encode

URLLen

PageLe

URL

Page

n
图 2.2 压缩包(Compressed packet)存储结构

DocID:文档标识号。用于标识页面存储库中唯一的Web页面;
Encode:表示存放文档时采用的编码方式;
URLLen:表示该文档来源的URL的长度;
PageLen:表示文档的长度;
URL:表示文档来源的URL;
Page:文档内容。

2.3.2 词典库
词典库最主要的作用是为检索器提供单词查找帮助,即将待查的文本单词
转化为单词标识号( WordID),以便在倒排索引表中能够整个放入内存当中。
因此词典采取紧缩存储方式显得尤其重要。由于每个单词长度变化很大,单词

第二章

系统设计及主要数据结构

总数到达数百万个,因此词典库采取不定长记录紧缩存储方式,附加一个哈希
表辅助查询。
Word1
Null
Word2
Null

图 2.3 词典库(Lexicon)存储结构

图 2.3 中所有的单词(Word)的字符紧接着依次存储,Null 为 Word 间分隔
标识。
Hash 值

Hash 值冲突链表头指针

001

Pointer to collision link

002

Pointer to collision link


表 2.1 哈希表

表 2.1 中的 Hash 值是根据各单词的所有字符运用一定的算法(比如各字符
的 ASCII 值相加)得出的,哈希表以哈希值排序。对于相同哈希值的单词,则
顺次加入其后的冲突链表中。冲突链表项结构如图 2.4:
WordID

Pointer to Lexicon

Pointer to next item

图 2.4 冲突链表项结构图

WordID:为单词标识符,用于标识单词字符文本。检索器(Searcher)依据用户
待检索单词,在词典表中查出对应得单词标识符,然后到倒排索引表中查找与
该单词标识符对应的各个相关文档;
Pointer to Lexicon:为单词在词典库中的位置指针,用于核对哈希值冲突的单词
(在词典库中按单词的字符逐一核对);
Pointer to Next Item:为指向链表下一项的指针,用于链表的遍历查找。
以上三者的组织结构关系如图 2.5

词典库

第二章

Word1

Null

系统设计及主要数据结构

Word2

Null

WordN

Null

哈希表
Hash 值
001

WordID

WordID Pointer

002

Pointer

冲突链
图 2.5 词典库、哈希表和冲突链关系图

2.3.3 Hits 列表

Hits 列表示指特定单词 Word 在某个页面文档( Document )中每次出现时
的出现状态(occurrences)的列表,包括单词出现位置、出现频率、字体大小和
单词大写等信息。Hits 存储的信息对于搜索引擎的页面优先度算法非常有用,往
往决定着单词在页面文档中的重要程度,因此对用户查询的相关度影响重大。
例如:单词出现的位置,如果单词出现在标题、或在头一段,以及保持适当的
出现频次和平均间隔,往往表明单词较高的重要性,反映出该页面文档具有较
高的用户查询相关度。又如字体大小,在上下文中字体相对较大的,单词重要
性较高。注意字体大小是相对大小,因为通篇大字体的页面文档不能表明其重
要性超过通篇小字体的页面文档。而西文单词的大写也表明其较为重要。Hits 分
为两类:普通 Hits 和特殊 Hits。普通 Hits 指出现在页面文档正文里面、或者非特
殊位置的 Hits。特殊 Hits 包括出现在 URL、标题、锚点文本、或者 meta 标签里的
hits。其存储方式如表 2.2。
普通 Hit 大写标志 字体大小 出现位置
特殊 Hit 大写标志 字体大小 类型 出现位置
锚点 Hit 大写标志 字体大小 类型 Hash 值 锚点内位置
表 2.2 Hits 列表存储方式

普通 hits :指出现在页面文档正文里面、或者非特殊位置的 hits。

第二章

系统设计及主要数据结构

特殊 hits:包括出现在标题、锚点(URL)的文本、或者 meta 标签里的 hits。
锚点 hits:其意义和存储方式比较特殊。锚点文本所描述的是锚点链接指向的页
面文档的说明性信息,而不是其所在页面文档的信息。锚点 hits 实际上表示了单
词与锚点链接指向的页面文档的相关性。因而,锚点 hits 需要记录的是锚点链接
指向的页面文档标识号 DocID,以及单词在锚点文本中的位置。由于锚点 hits 存
储长度的限制,不能够完整记录锚点链接指向的页面文档标识号 DocID,只能
计算并存储该页面文档标识号 DocID 的 hash 值。

2.4

索引结 构

当用户在搜索引擎中提交查询请求后,要求瞬间返回搜索结果。为了有效
提高搜索效率,检索器并不对存储库中的信息进行直接查找,而是先查找索引
库。索引库的建立在搜索引擎中占有相当重要的地位,对搜索效率、查找精度等
方面有非常大的影响。索引的结构在 4.2.1 节介绍。

第三章 网页抓取技术

第 3章

网页 抓取技 术

3.1 网络 蜘蛛的 工作原 理
搜索引擎的第一步工作就是在网络中收集网页并将其整理入库,也就是网
页抓取过程,是由搜索引擎系统中的搜索器完成得。搜索器是一个沿着链接漫
游互联网文档集合的程序。
它一般驻留在服务器上,在自动加载方式下,它首先以一个或一组地址链
接为搜索起点,利用HTTP(超文本传输协议)等标准协议对相应的网络文档
进行访问。当文档被取走后,它所包含的信息将被搜索引擎用于建立文档索引,
同时它所包含的超级链接将被搜索器作为访问新文档的起点。如此循环反复,
从而实现了对互联网上大范围网络文档信息的收集。因为其工作过程类似蜘蛛
在蜘蛛网中爬来爬去,所以习惯把这种机器人程序称为网络蜘蛛[5]。其基本工
作流程如图3.1所示。

图 3.1 网
蛛基本工
程图

络蜘
作流

第三章 网页抓取技术

3.2 相关 技术

3.2.1 HTTP 协议
HTTP (Hyper Text Transfer Protocol,超文本传输协议)[6]是为分布式
和合作式超媒体信息系统设计的协议,是一种无状态、无连接、面向对象的协议,
具有简单、灵活等特点,能满足简单数据传输的需要,是WWW的标准通信协议。
网络爬虫在万维网上的信息采集都是通过HTTP协议实现的,在第六章实现网络
爬虫中需要用到的HTTP主要方法和信息头格式。
一、HTTP的信息头
HTTP协议利用信息头来描述每次事务的处理,主要的信息头和信息域的定
义如下:
(1) 请求头(Request Headers)
User-Agent : 客户名及版本号:
From : 客户端使用者信息;
Accept : 客户端可接受的数据类型;
Accept-Charset : 客户端可接受的字符集;
Accept-Language : 客户端能理解的语言。
(2) 应答头(Response Headers)
HTTP-Version : 服务器支持的HTTP版本号
Status-code : 服务器处理本次请求的状态码,常见的有:
200 正常
400 请求错误
404 请求的资源未找到
500 服务器内部错误
301 请求的资源己经移动
302 请求的资源被临时移动
Server : Web 服务器软件名和版本号;
Last-Modified : 客户端请求资源的最后修改时间;
Content–Length : 本次传输数据的长度;
Content-Type : 本次传送数据的类型,由服务器根据文件扩展名决定;
Content-Transrer-Encoding : 表示服务器采用的编码机制;
Content-Language : 标识本次传送数据采用的语言种类。
二、HTTP的主要方法
HTTP 方 法 (Method)描述了在指定资源上将要执行的动作,HTTP协议中定
义了多种方法,其中最常用的如下:

第三章 网页抓取技术

(l) GET : 负责取回指定资源
(2)HEAD : 请求服务器传送指定资源的大小、最后更改时间等描述性信息
(3) POST : 用于客户端向服务器发送数据,主要是发送HTTP FORM内容,
供服务器端处理。

3.2.2 起始地址 的选择
起始URL是网络爬虫的搜索起点,起点选择的不同会影响到信息搜集的效
果,在实际应用中,根据信息发现系统的具体目的选择适当的起始地址。搜索
引擎系统的目标是尽量广泛地采集和索引Web页面,对采集文档有质量性和覆
盖性的要求,即采集的Web文档应该是那些质量较好、用户认可度高且是平均分
散在整个网络中的页面。因此,搜索引擎系统中网络爬虫的起始地址选择比较
关键,一般采用如下的策略:
1. 选择访问人数多的站点地址为起始地址;
2. 选择高质量的综合性站点地址为起始地址;
3. 根据域名的划分选择起始地址;
4. 根据地理区域的划分选择起始地址:
5. 根据IP地址的区段选择起始地址
在搜索引擎中,由于系统对信息的需求是有目标的,因而对网络所抓取的
文档有目的性要求,即所抓取的文档应尽量与信息发现目标相关。结合本课题
是区域内高校间的搜索引擎,可将特定区域高校的首页地址放入初始URL列表
中,作为网络爬虫采集的起始地址。

3.2.3 爬虫的控 制原则
网络爬虫是搜索引擎系统的重要组成部分,几乎每一个搜索引擎系统都运
行自己的网络爬虫进行信息采集。每个Web页面的采集都要经过资源请求、服务
器应答和网络信息传送三个阶段才能下载到本地,所有服务器间的通信与文档
下载都需要经过Internet的传送,网络中传输的数据量很大,将大幅度增加网
络和服务器的负载。因此,网络爬虫使用不当或过分使用都会使网络和被访问
服务器的负载增大,甚至造成网络传输的拥塞和Web应用服务器的崩溃。另一方
面,由于万维网是一个复杂的异构信息服务网络,网络中可能存在一些链接“
黑洞”(如由一些数据库或CGI程序动态生成的页面,网络爬虫一旦陷入就很难
摆脱)和一些废弃的页面,网络爬虫不应去采集这些信息。所以为了减轻网络爬
虫程序对网络和服务器的巨大负载,保证网络爬虫不影响其他系统正常工作,
并使网络爬虫保持正常、有效地运行,有必要对爬虫的漫游行为采取适当的控
制。主要有下面几个原则:
(1) 标识网络爬虫

第三章 网页抓取技术

爬虫在运行时,应在HTTP协议的User-Agent域中标识出是网络爬虫客户,
并在From域中标识出使用者的联系方法。这样做可以使得被访问用户能够与网
络爬虫的使用者保持联系,若被访问系统受到爬虫的干扰,可及时通知爬虫的
使用者进行修正。并且网络爬虫应在拥有域名的机器上运行,使被访问用户能
识别网络爬虫的运行位置。
(2) 合理采集资源
为了降低爬虫对网络和被访问系统的影响,应合理采集资源。爬虫发送请
求的速度不要太快,否则被访问系统可能会因为过多的服务请求而崩溃。因此,
在向同一个服务器发送请求时,应保持一定的时间间隔,此间隔需根据网络状
况与服务器能力而定,并且爬虫应在网络负载较轻的夜间运行.在对一个服务
器进行刷新访问时,应先读取请求页面的头信息,判断页面自上次访问后有无
变化,若确定发生变化再进行读取,并根据各服务器信息资源的更新周期确定
对服务器资源的刷新访问频率。在发送请求时还应在请求头的Accept域中标识
出爬虫需要的资源种类,减轻服务器的压力。
(3) 利用Robot.txt
Robot .txt是web应用服务器专门向爬虫程序提供的用来描述本身资源的
信息元文件,一般存储于服务器的根目录。Robot.txt包含了自身资源结构描述、
内容描述和更新时间等信息,并注明了哪些资源爬虫可以采集、哪些禁止采集.
Robot.txt中不允许采集的内容一般是黑洞页面、动态页面、过期页面、未完成或
有错误的页面和拥有者不愿公开的页面。现在Robot.txt所采用的描述格式一般
都遵循MartinKoster所制订的网络爬虫排他标准(Standard for Robot
Exclusion,SRE),在SRE中定义了User-Agent和Disallow,两个描述域,用来
标识对特定网络爬虫的禁止访问区域。因此在爬虫访问某台服务器时,应首先
读取并分析服务器的Robot.txt文件(绝大多数正式Web应用服务器都向网络爬
虫程序提供此文件),这样既可以提高网络爬虫的运行效率和文档采集的有效
性,又可以减少对被访问系统的不利影响。

3.3 搜索 策略

在抓取网页的时候[7][8],网络蜘蛛一般有两种策略:广度优先和深度优先。
广度优先是指网络蜘蛛会先抓取起始网页中链接的所有网页,然后再选择
其中的一个链接网页,继续抓取在此网页中链接的所有网页。这是最常用的方
式,因为这个方法可以让网络蜘蛛并行处理,提高其抓取速度。
深度优先是指网络蜘蛛会从起始页开始,一个链接一个链接跟踪下去,处
理完这条线路之后再转入下一个起始页,继续跟踪链接。这个方法有个优点是
网络蜘蛛在设计的时候比较容易。

第三章 网页抓取技术

E

A

C

F

G

广度优先的抓取顺
序:
A 一 B,C,E 一 D,F 一
G

D

B

D

B

E

A

C

F

G

深度优先的抓取顺
序:
A一 B
C一 D
E一 F一 G

图 3.1 网页抓取策略示例图

第三章 网页抓取技术

3.4 Spider 程序的 结构

构造Spider程序有两种方式[9],第一种把Spider程序设计为递归的程序。
第二种是编写一个非递归的程序,它要维护一个要访问的网页列表。

3.4.1 递归方式
递归是一种通过调用自身来完成任务的程序设计技术,对网页爬取来说使
用递归看似非常合理,因为Web Spider执行的是重复的操作。例如考虑如下算
法:
Void Recursivespider(StringURL)
{
下载URL
处理URL
对每一个发现的URL,开始循环
调用Recursivespider方法
结束循环
处理下载的网页数据……
}
在这一段程序代码中,查看单独的一个Web页的任务放在一个称为
Reeurslvespider的方法中。
尽管看起来递归是构建Spider的合理的选择,但这种情况仅在访问的网页
相对较少时适用。在运用多线程时递归程序也不适用,因为每一个线程有它自
己独立的堆栈,这样就造成了递归程序的不兼容。

3.4.2 非递归方 式
构造Spider程序的第二种方法是通过非递归的途径。这样,Spider程序在
发现每个新网页时,它将使用一个不调用自身的方法。这种方法使用一个队列。
非递归的程序使用队列,为得到Spider程序的处理,每一个新发现的网页必须
在队列中等待。
当使用非递归的方法时,给定Spider程序一个要访问的网页,它会把这一
网页加入到它的队列中去。当Spider程序发现新的网页时,会把它们加入到该
队列。当Spider程序处理完当前的页,它会在队列中查找要处理的下一页。

第三章 网页抓取技术

在本系统的设计中采用非递归的方式,Spider 程序总共使用了四个队列。
它们是:等待队列、处理队列、错误队列、完成队列。在下节中详细介绍。

3.4.3 队列的使 用
当采用非递归方法时,网络蜘蛛程序总共使用了四个队列,它们的总结如
下。每一个这样的队列保存着同一处理状态的URL。
等待队列   在这个队列中,URL等待被Spider程序处理。新发现的URL被加入
到这个队列中。
处理队列   当Spider程序开始处理URL时,它们被传送到这一队列。重要的是
同一个URL不能被多次处理,因为这是浪费的。当一个URL被处理后,它被移送
到错误队列或者完成队列。
错误队列   如果在下载这一网页时发生错误,它的URL将被加入到这一队列。
该URL到达这一队列后,不再移入其他队列。一旦网页移入错误队列,Spider
程序将不会再对它做进一步处理。
完成队列   如果在下载网页时没有发生错误,该URL将被加入到完成队列。
该URL到达这一队列后不再移入其他队列。
根据用户提供的一组URL地址列表,然后进行扫描获得正处于工作状态的
URL列表;从活动URL列表取一个URL地址放入运行队列后访问该Web站点首页;
解析该网页获得所有的内部链接并添加到等待队列当中;从等待队列中移出一
个URL放入运行队列进行解析。如果在解析时发现错误,则将该URL放入错误队
列,否则放入完成队列。上述操作直到活动URL列表为空。
同一时间一个URL只能在一个队列中。这也叫URL的状态。当一个URL被加入
到等待队列中时网络蜘蛛程序就开始工作,只要等待队列中有一个任务正在被
处理,网络蜘蛛程序就会继续它的工作。当等待队列为空并且当前没有处理任
何网页,搜索器程序就会停止运行。下图说明了这些状态是如何相互关联的,
以及网页如何从一个状态转换到另一个状态。

图 3.3 URL 状态流程图

第三章 网页抓取技术

3.5 网页 地址的 过滤机 制
搜索器要从一个网页移动到另一个网页才能达到搜索的目的。而网页中的
链接互相连通着,要限定搜索器的搜索范围,就要对链接进行分析、限定。
网页使用 HREF(Hyper Reference)链接在一起, HREF 是指定其他网页链接
的 HTML 属性。所有的 HTML 链接均包含在 HTML 的 HREF 属性中。HREF 不是
一个 HTML 标签,它只是一个属性。它总是和其他的锚标签结合在一起使用的。
从搜索器的观点来看,锚标签和图像映射的功能都是指向搜索器要访问的另一
个网页。然而,搜索器仅仅查看包含锚标签和图像映射的部分 HREF 属性。
根据 HREF 所包含的数据,搜索器会遇到三种链接。内部链接指向的网页与
包含该链接网页在同一台 web 服务器中。外部链接指向的网页所在的 web 站点
与包含该链接的 web 站点不同。还有第三类链接,即其他链接,它指向非网页
的资源。
基于区域高校的搜索器是把链接限制在指定一些高校站点内的。那么,对
于搜索器来说,如何确定一个链接是内部链接还是外部链接,有两种方法:一
种是根据域名,另一种根据 IP 地址(因为对于教育网用户来说,都有一定的 IP
地址范围段)。经过考察,由于一些高校网站的特殊性,既有以域名命名的又
有以 IP 命名的。本课题采用的是将所有的域名解析为 IP 地址,然后根据各个高
校对应的 IP 段来确定是否为区域内高校的链接。
下面我们详细介绍一下有关域名和 IP 之间转换的技术[10]:
在网络上,符号名用来命名主机和网络,例如 www.biti.edu.cn。这些符号名
的学名叫做“Domain Name”,即域名。虽然域名对我们来说方便得多,但在它
们用作通信标识之前,必须转换为 IP 地址(Internet Protocol Address)。IP 地址是
一个 32 位的标识符,包括一个网络标识和主机标识,以便唯一地标识主机和网

第三章 网页抓取技术

络。域名转换为 IP 地址的工作是由专门的系统完成,这就是域名系统 (Domain
Name SystemDNS)。
同一网络或不同网络主机之间进行数据的发送 /接收时,IP 地址就开始起作
用了。如果是同一网络中主机之间的数据传递,则仅利用 IP 地址中的主机标识,
来确定网络中主机的所在。另一方面,如果是不同网络中主机之间的通信,则
要同时利用主机标识和网络标识来确定相应的主机。定位网络和主机,再进行
数据传送的过程称为路由 (routing) 。网络中的路由器 (router) 包含一个 IP 层 (IP
Layer),它负责执行路由算法,将数据包发送到目的地。在因特网上,将数据库
发送到目的地是 IP 层份内之事。
IP 地址是因特网注册部门 Network Information Center(网络信息中心 NIC)分
配给不同的组织,各组织再下放给多个部门。IP 地址要占用 4 个字节。
目前,共计有 3 类(或 3 个级别的)IP 地址:A 类、B 类和 C 类。另外,还有一
类 IP 地址叫作“Multicast”,在某些因特网主机上使用。这些不同类别的 IP 地址
满足了不同组织的需要。例如,A 类地址主要用于主机数目超过 65536 的大型网
络系统;B 类地址则用于中型网络系统,其主机数大于 255,却小于 65536;C
类地址则用于那些主机数量小于 256 的小型网络。
不同类别地址的十进制表示如下,其中的十进制数代表允许的地址范围:
·A类
网络 ID 主机 ID
1~127 0~255 0~255 0~255
·B类

第三章 网页抓取技术

网络 ID 主机 ID
128~191 0~255 0~255 0~255
·C类
网络 ID 主机 ID
191~233 0~255 0~255 0~254
· Multicast
网络 ID 主机 ID
191~233 0~255 0~255 0~254
数字 0 和 255 另有特殊的含意。数字 0 是为那些地址不明的主机保留的。某
些情况下,如错误的系统配置,主机标识或网络标识不明的情况也会发生。例
如,某个主机的 C 类地址为 0.0.0.42,则说明其主机标识为 42,而它所处网络
的网络标识则是“未知数” 0。数字 255 则用于广播发送方式,即一台主机发出
的信息会传送到网络中所有的主机上。
为了获得所在网络的 IP 地址,或者网络中其他主机的 IP 地址,我们可以
用 java.net 软件包中的 java.net.InetAddress 类加以实现。例如,如果我们希望得
到 所 在 网 络 的 IP 地 址 , 我 们 可 以 调 用 InetAddress 类 中 的 getLocalHost() 和
getAddress()方法。getLocalHost()返回一个 InetAddress 对象;而 getAddress()则返
回一个长度为 4 的字节数组(IP 地址为 4 个字节)。
InetAddress 是 java.net 软件开发包中的一个“现成”的类。编制一个基于网
络 的 应 用 程 序 , 可 以 这 样 进 行 : 设 置 变 量 host 就 是 一 个 InetAddress ;
InetAddress.getLocalHost() 返 回 一 个 InetAddress 。 例 如 , 某 个 主 机 域 名 为

第三章 网页抓取技术

“sample”,其 IP 地址为“128.118.2.10”,那么,InetAddress.getLocalHost()调用
返回后,变量 host 的值就成了“sample/128.118.2.10”。如果只对其中的主机域名
感兴趣,则可以调用 getHostname()。
import java.net.*;
public class GetAddress {
public static void main (String argv〔〕) throws Exception {
InetAddress host=null;
host=InetAddress.getLocalHost();
System.out.println(host.getHostName());
}}

3.6 多线 程技术 在网络 蜘蛛程 序中的 应用

网络程序下载的网页数量是海量的,即使对于限定区域的搜索引擎来说如
果用单线程进行下载,它的速度都肯定会让人难以忍受。例如:一个搜索器需
要下载十个网页,要完成这一任务,它必须向服务器发出请求然后接受这些网
页。当搜索器等待响应时就是一个瓶颈。因为搜索器已经请求了网页,这时它必
须等待请求经过因特网向Web服务器传输。在这种情况下,使用多线程技术[11]
来改善搜索器的性能和效率是非常有效的。众多的线程允许这十个网页的等待
时间结合在一起,而不是让他们一个接一个地执行。同时等待大量网页肯定比
仅等待一个网页效率要高很多。网页多了以后更能突出多线程对效率的影响。
多线程是一个程序在同一时刻运行超过一个任务的能力。每个线程都是一
个不同的控制流,可以独立地执行它的指令,允许多线程进程同时完成多项任
务。一个线程在运行GUI时,第二个线程可以执行某些I/O,而第三个则进行计
算。由于多线程发生在程序内部,它们使用同一内存空间,所以线程可以很容
易地共享数据。在同一个时刻运行超过一个程序任务的多线程能力对spider程
序的效率是非常重要的。
线程是一个抽象的概念,包括了计算机在执行一个传统程序时的每一件事。
它是在CPU上进行调度的程序状态:是进行上作的“事情”。如果一个进程是由
数据、代码、内核状态和一组CPU寄存器所组成,那么一个线程就被嵌入了这些
寄存器(程序计数器、通用寄存器、堆栈指针,以及堆栈)的内容中。看上去,一
个线程就是计算的状态。

第三章 网页抓取技术

多线程是Java语言的一大特性,多线程就是同时存在N个执行体,按几条
不同的执行线索共同工作的情况。
线程也是有状态和声明周期的,每个Java程序都会有一个缺省的主线程,
对于应用程序即application来说main方法就是一个主线程。Java语言使用的是
Thread类及其子类的对象来表示线程的。创建一个新的线程的生命周期如下状
态。
1)新建:当一个Thread类或者其子类的对象被声明并创建时,新的线程对
象处于新建状态,此时它已经有了相应的内存空间和其他资源。
2)就绪:处于新建状态的线程被启动后,将进入线程队列排队等待CPU服
务,这个时候具备了运行的条件,一旦轮到CPU的时候,就可以脱离创建它的
主线程独立开始自己的生命周期。
3)运行:就绪的线程被调度并获得CPU的处理边进入了运行状态,每一个
Thread类及其子类的对象都有一个重要的run()方法,当线程对象被调度执行
的时候,它将自动调用本对象的run()方法,从第一句代码开始执行。所以说对
线程的操作应该写到run()方法中。
4)阻塞:一个正在执行的线程如果在某种情况下不能执行了。进入阻塞状
态,这个时候它不能进入排队状态,只有引起了阻塞的原因消失的时候,线程
才可以继续进入排队状态等待CPU处理。
5)死亡:处于死亡状态的线程不具有继续执行的能力,线程死亡主要的原
因是正常运行的线程完成了全部工作,即执行完了run()方法,另外就是被提
前强制的终止了。
Java中编程实现多线程应有两种途径,一种是创建自己的线程子类,另外
是实现一个接口Runnable。无论是那种途径最终都需要使用Thread类及其方法。
Thread类有两种构造方法,public Thread()用来创建一个线程对象。Public
Thread(Runnable r)创建线程对象,参数r成为被创建的目标对象。这个目标必
须实现Runnbale接口,给出该接口的run()方法的方法体,在方法体中操作。用
两个构造方法创建完的线程就是一个新建的状态,等待处理。然后启动线程的
start()方法,启动线程对象,线程进入排队状态也就是就绪状态。然后线程操
作run()方法这个方法里的内容是被系统处理的内容。如果想使线程进入休眠状
态可以调用sleep()方法,可以给一个参数,代表体眠的毫秒。终止线程用
yield()方法来完成。判断线程是否销毁可以用idAlive()方法判断线程是否活
着。
Runnable接口只有一个方法run()方法,我们实现这个接口把要操作的代码写
到这个方法中,然后再把实现了整个接口的类的实例传给Thread类的构造方法
即可操作线程。
当一个新线程执行run时,另一个线程正调用Thread或其子类对象的
start()方法。例如,要开始第二个线程,应用程序的开始线程─它执行main─
调用Start。作为响应,JVM和平台一起工作的线程操作代码确保线程正确地初
始化并调用Thread或其子类对象的run()方法。
一旦start()完成,多重线程便运行。因为我们趋向于在一种线性的方式中

第三章 网页抓取技术

思维,我们常发现当两个或更多线程正运行时理解并发(同时)行为是困难的。
因此,你应该看看显示与时间对比一个线程正在哪里执行(它的位置)的图表。
图3.4就是这样一个图表。
图表显示了几个重要的时间段:
·开始线程的初始化
·线程开始执行main()瞬间
·线程开始执行start()的瞬间
·start()创建一个新线程并返回main()的瞬间
·新线程的初始化
·新线程开始执行run()的瞬间
·每个线程结束的不同瞬间
注意新线程的初始化,它对run()的执行,和它的结束都与开始线程的执
行同时发生。
一个线程调用start()后,在run()方法退出前并发调用那方法将导致
start()抛出一个java.lang.IllegalThreadStateExeeption对象。

图 3.4 多线程机制

第三章 网页抓取技术

3.7 网页 更新

由于网站的内容经常在变化,在网络蜘蛛进行页面资源采集的过程中,需
要对页面进行周期性的更新,才能确保把更新内容加入到索引中去,这里引入
开源项目 Quartz[12],作为作业调度框架,主要解决的问题是在某个时间对某些
对象作某些动作。
我们将系统的资源更新作为一项周期性的作业来处理,WebSiteQuartz 类负
责这一工作,WebSiteQuartz 类的运行由 Quartz 软件包进行控制,可以在 Quartz
的配置文件里设置更新的周期和时间。WebSiteQuartz 类采用代理模式,它负责
对作业的调度进行控制,此类实现了 Job 接口,添加一些逻辑到 execute()方法。
一旦配置好 Job 实现类并设定好调度时间表,Quartz 将密切注意剩余时间。当
调度程序确定该是通知你的作业的时候, Quartz 框架将调用 Job 实现类(作业类)
上的以 execute()方法并允许做它该做的事情。无需报告任何东西给调度器或调用
任何特定的东西。仅仅执行任务和结束任务即可。如果配置作业在随后再次被调
用,Quartz 框架将在恰当的时间再次调用它。
通过 Quartz 的 XML 配置文件完成对作业的调度控制,包括作业调度的开

执行时间,周期,要执行的类。通过对作业的调度,可以对网络蜘蛛的搜索时
间,周期进行控制,以做到资源更新。
搜索引擎的更新周期对搜索的查全率有很大影响.如果更新周期太长,则
总会有一部分新生成的网页搜索不到;周期过短,技术实现会有一定难度,而
且会对带宽、服务器的资源都有浪费。一般来说,网络蜘蛛在更新网站内容的时
候,不用把网站网页重新抓取一遍,对于大部分的网页,只需要判断网页的属
性(主要是日期),把得到的属性和上次抓取的属性相比较,如果一样就不用更
新。
搜索器的更新周期根据实际情况而定,对于区域内的高校网,抓取范围、
抓取量相对较小,信息更新较快,以目前的情况,定为一天一次较为适宜。

第三章 网页抓取技术

第四章

第 4章

索引技术与查询检索

索引 技术与 查询检 索

搜索引擎利用网络蜘蛛将网页抓取回来并放入页面存储库后,下一步的工
作就是建立索引库为查询检索提供检索基础。为网页建立全文索引包括网页内
容分析和建立倒排索引文件。二者是顺序进行,先分析网页,后建立倒排文件,
如图 4.1 所示。

图 4.1 分析网页与建立倒排文件流程

信息的查询服务是由检索器实现的,检索器是搜索引擎系统中最后一个环
节。信息检索的过程是对用户的检索请求进行满足的过程,检索器通过 Web 页
面接受用户输入的检索字串,对检索字串进行分词后得到若干个关键词,搜索
关键词字典,得到 WordID 并进一步通过倒排文档获得对应的 DocID,提取满足
条件的网页,然后计算网页相关度,根据相关度的数值排序返回前 N 项满足条
件的网页,分页后显示到用户查询页面上。图 4.2 为查询服务流程图。
索引和查询检索部分借助 Lucene 全文搜索引擎库中的 java 类进行实现。
Lucene 是 Apache 软件基金会的一个开源项目,完全由 Java 类进行实现,适用
于需要全文搜索能力的应用程序,并具有良好的跨平台能力。Lucene 作为一项
开源项目,具有良好的可扩展性,本系统对中文分词方面进行了改进,借助中
文词典编写另外的词法分析器,达到较好的分词效果,并且根据高校网站中网
页的结构特点设计了检索结果排序算法。

第四章

索引技术与查询检索

4.1 网页 内容分 析

对于索引来说,只处理文本信息。因此需要把网络蜘蛛抓取下来的网页中
的文本内容提取出来,过滤掉一些脚本标示符和一些无用的广告信息,同时记
录文本的版面格式信息。网页在经过处理后被放入页面存储库以便后续建立索
引。
网页内容分析中最重要的部分就是词的识别,因为搜索引擎是以词为基本

第四章

索引技术与查询检索

用户输入查询内容
对查询内容分词
查询词典,讲分词后关键字转换为 WordID
利用 WordID 查找对应的 DocID

是否有对应的文档

N

Y
遍历得到的 Doc 列表

列表为空或者到达列表末尾

Y

N
计算当前 Doc 的相关度
继续遍历 Doc 列表

N

是否到达 Doc 列表末尾
Y
将结果按相关度排序输出给用户
图 4.2 查询服务流程图

搜索单位的。对于西文信息来说,由于词之间以空格分开,从而只需要识别词
的不同形式,例如:单复数、过去式、组合词、词根等。而对于一些亚洲语言(中
文、日文、韩文等),由于词之间没有自然的分隔,就需要进行分词处理。下面
对中文分词技术[13][14]做一简要介绍。

第四章

索引技术与查询检索

4.1.1 中文分词
众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以
字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子 I am a
student ,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道
student 是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示
一个词。把中文的汉字序列切分成有意义的词,就是中文分词。我是一个学生,
分词的结果是:我、是、一个、学生。
中文分词对中文搜索引擎有很大的影响。对于搜索引擎来说,最重要的并
不是找到所有的结果,因为在上百亿的网页中找到所有结果没有太多的意义,
没有人能看得完,最重要的是把最相关的结果排在最前面,这也称为相关度排
序。中文分词的准确与否,常常直接影响到对搜索结果的相关度排序。

4.1.2 Lucene 中文分词的局限 性
Lucene 作为一个开放源码的搜索软件包应用越来越广泛,但是对于中文用
户来说其提供的两个中文分词器(CJKAnalyzer、ChineseAnalyzer)的功能太
弱了, 仅仅支持二元切分,分词准确率是较低的。
二元切分原理是以两个相连的汉字为单位,并且两个词之间有交叉。即:
它是将字符串“C1C2C3C4…” ,按 C1C2 和 C2C3 和 C3C4 等进行分词。例如:
“北京信息科技大学”经过二元分词后,结果为“北京/京信/信息/息科/科技/技
大/大学”七个词。二元分词实现原理比较简单,但其缺陷也比较明显。二元分词
则分出了太多的没有实际意义词,如“京信”、“息科”和“技大”,降低检
索结果的准确率。
所以要想实现 Lucene 的中文应用,实现自己的中文分词是十分必要的。

4.1.3 分词算法
中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己
的知识来明白哪些是词,哪些不是词,但让计算机能理解的处理过程就是分词
算法。现有的分词算法可以分为三大类:基于字符串匹配的分词方法、基于理解

第四章

索引技术与查询检索

的分词方法和基于统计的分词方法[15]-[20]。
1. 基于字符串匹配的分词方法
这种方法又称为机械分词法,它是按照一定的策略将待分析的汉字串与一
个“充分大”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配
成功(识别出一个词)。基本的机械分词方法有以下两种:
(1)最大匹配法(Maximum Matching Method)最大匹配法可分为正向最大匹配
法(MM)和逆向最大匹配法(RMM)。最大正向匹配法的基本思想是:假设自动分
词词库中的最长词条中汉字个数为 n,则取被处理材料当前字符序序列中的前 n
个字作为匹配字段,查找分词词库,若词库中有这样一个 n 字词,则匹配成功,
匹配字段作为一个词被切分出来;如果词库中找不到这样一个 n 字词,则匹配
失败,重复以上过程,直到匹配成功为止。这样就完成了一次匹配,即匹配出
一个词。然后再按上面的步骤进行下去,直到切分出语料中的所有词为止。这是
一种减字的匹配法。
例如现有短语“计算机科学和工程”,假设词库中最长词为 7 字词,于是
先取“计算机科学和工”为匹配字段,来匹配分词词库,由于词库中没有该词,
故匹配失败,去掉最后一个汉字成为“计算机科学和”作为新的匹配字段,重
新匹配词库,同样匹配失败,取“计算机科学”作为新的匹配字段,来匹配词
库,由于词库中有“计算机科学”一词,从而匹配成功,切分出第一个词“计
算机科学”。用同样的方法可以继续切分出第二、第三个词……。
MM 法的的原理简单,易于在计算机上实现,时间复杂度也比较低。但是,
最大词长的长度比较难于确定,如果定得太长,则匹配时花费的时间就多,算
法的时间复杂度明显提高,如果定得太短,则不能切分长度超过它的词,导致
切分正确率的降低。统计表明,MM 方法的错误切分率为 1/169。所以,该方法一
般不单独使用,而是作为一种基本的方法和其它方法配合使用。
逆向最大匹配法(The Reverse Directional Maximum Matching Method),也称
为 RMM 方法。它的分词过程与 MM 方法相同,不同的是每次是从待处理语料
的末尾开始处理,每次匹配不成功时去掉的是前面一个汉字。RMM 方法的精度

第四章

索引技术与查询检索

要高一些,它的错误切分率为 1/245。
(2)最小匹配法

最小匹配法也分为正向匹配和逆向匹配两种。它是一种增

字的匹配方法,其基本原理与最大匹配法相似。
例如“计算机科学和工程”,首先取“计”作为字段来匹配,由于词库中
没有该词,故匹配失败。再增加一个字,取“计算”作为字段来匹配,在词库
中进行匹配,这时匹配成功,把“计算”作为词切分出来。然后再对“机科学
和工程”字串重复上面的过程,直到所有的词都被切分出来。
2. 基于理解的分词方法
这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。
其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息
来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部
分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信
息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需
要使用大量的语言知识和信息。由于汉语语言只是的笼统、复杂性,难以将各种
语言信息组织成机器可以直接读取的形式,因此目前基于理解的分词系统还处
在试验阶段。
3. 基于统计的分词方法
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现
的次数越多,就越有可能构成一个词。因此字与字相邻出现的频率或概率能够
较好的反应成词的可信度。可以对语料中相邻出现的各个字的组合频度进行统
计,计算两个汉字的相邻出现概率。计算汉字 X 和 Y 的互现信息公式为:
M ( X , Y ) = log

P( X , Y )
P ( X ) P (Y )

, 其中 P(X , Y) 是汉字 X 、 Y 的相邻共现概率,

P(X)、
P(Y)分别是 X、Y 在语句中出现的概率。
互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈
值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度
进行统计,不需要切分词典,因而又叫做无词典分词法或者统计取词方法。但
这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用
字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常
用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本
的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的

第四章

索引技术与查询检索

词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的
特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。

4.1.4 本系统使 用的分词
鉴于 Lucene 在中文分词方面的局限性,所以迫切需要开发自己的中文分词
器,而开发适用的分词器是一项很有挑战的工作。我想在系统中实现一个中文
分词器,让它实现机械分词[21]-[25]中最简单的算法--正向最大匹配法。目前普
遍认为这一算法的错分率为 1/169,虽然这不是一个精确的分词算法,但是它
的实现却很简单。我想它已经可以满足本系统的应用了。这一算法是依赖于词库
的,词库的好坏对于错分率有重要影响。
本系统使用的是基于字符串匹配的分词技术,这种技术也被称为机械分词。
它是按照一定的策略将待分析的汉字串与一个“充分大的”词库中的词条进行
匹配。若在词库中找到某个字符串则匹配成功(识别出一个词)。这个实现了机
械 分 词 中 正 向 最 大 匹 配 法 的 Lucene 分 词 器 包 括 两 个 类 , CJKAnalyzer 和
CJKTokenizer,用来替代 Lucene 提供的标准分析器。

4.1.5 中文分词 需要解决的关 键问题
一、歧义的识别
歧义是指可能有两种或者更多的切分方法。例如:“表面的”这个词组,
因为“表面”和“面的”都是词,那么这个短语就可以分成“表面 +的”和“
表+面的”。这种称为交叉歧义。像这种交叉歧义十分常见,“化妆和服装”可
以分成“化妆+和+服装”或者“化妆+和服+装”。由于没有人的知识去理解,
计算机很难知道到底哪个方案正确。
交叉歧义相对组合歧义来说是还算比较容易处理,组合歧义就必须根据整
个句子来判断了。
例如,在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把
手拿开”中,“把手”就不是一个词;在句子“将军任命了一名中将”中,“
中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。
这些词计算机又如何去识别?
对歧义现象的处理方法一般采用类似于动态规划的算法将歧义问题的求解
转化为一个优化问题的求解。在求解过程中,一般使用词频或概率等辅助信息

第四章

索引技术与查询检索

求得一个最大可能的分词结果,这个结果在某种意义下是最佳的。
二、未登录词的识别
未登录词就是分词词典中没有的词,也称为新词。最典型的是人名、地名、
专业术语等。例如,人可以很容易理解句子“王军虎去广州了”中,“王军虎
”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“
王军虎”作为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都
有新增的人名,收录这些人名本身就是一项巨大的工程。即使这项工作可以完
成,还是会存在问题,例如 : 在句子“王军虎头虎脑”中的,“王军虎”还能
不能算词?
未登录词中除了人名以外,还有机构名、地名、产品名、商标名、简称、省略
语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜
索引擎来说,分词系统中的新词识别十分重要。目前,对未登录词的处理一般
采用统计的方法,首先从语料中统计出出现频率较高的字组,然后按照某种规
则把它们作为新词添加到辅助词典中。
目前,中文自动分词技术在搜索引擎中已经得到广泛应用,分词准确度已
经达到 96%以上,但是在对大规模网页进行分析处理的时候,现有的中文自动
分词技术还存在许多不足,例如上面提到的歧义问题和未登录词的处理问题等。
因此,国内外的很多科研院校都一直关注并研究中文自动分词技术,这主要是
因为网络上的中文信息越来越多,对网络上的中文信息的处理必将成为一个巨
大的产业和广阔的市场,存在无限的商机。但是,中文自动分词技术要想更好
地服务于网络中文信息的处理并形成产品,还要在基础研究方面和系统的集成
方面做许多工作。
本系统中,在高校网上的信息中主要有两类未登录词[26]-[31]需要识别:一
类是人名;另一类是机构名。
(1) 人名识别规则
人名的识别通常根据姓氏来识别。例如:“马志强”可以根据“马”去识
别。因此,可以建立姓氏驱动的规则,实现人名识别。
同时,为了提高姓氏规则识别的准确率和召回率,根据人名后的称谓设计
了约束规则(也是补充规则)。例如:在人名的后面常常会有“教授”、“老师
”、“校长”、“处长”、“主任”等称谓。
因此,人名的识别规则为:一是姓氏规则,即:姓+*;二是约束规则,即:
*+约束条件。其中“*”表示任意汉字串。

第四章

索引技术与查询检索

(2) 机构识别规则
校内的机构一般包含“中心”、“室”、“系”、“院”等后缀,所以,依
据对人名约束条件的定义,制定了机构识别的规则。
机构识别规则为:*+机构后缀。“*”的意义同上。

4.2 建立 索引

索引(index)最早出现在文献系统中,从这个意义上讲,索引是指文献集
合中包含的事项或从文献集合中引出的概念的一种系统指南,这些事项或引出
的概念是由按已知的或已说明了的可检顺序排列的款目表达出来的。
由于计算机的出现,索引技术在现代得到了迅速的发展,特别是数据库系
统中的索引技术。“索引”在数据库的术语中是指根据某特定域(或属性)对
数据库中数据的一种排序,这一特定域(或属性)称为关键域或关键属性。对
应的索引服务就是根据索引从数据中提取信息,再对这些信息进行有效的组织、
分析后,提供给用户。数据库中采用了类似于看书查目录一样的索引技术,使
得查询时不必扫描整个数据库就能迅速查到所需要的内容。
搜索引擎的索引不同与数据库中的索引,但它们的作用是相同的。搜索引
擎索引的建立是为了支持有效快捷的检索,为用户与无结构数据之间建立接口。

4.2.1 索引的组 织结构
全文检索中索引的组织结构有两种,即正排表和倒排表。
正排表是以文档的 ID 为关键字,表中记录项记录文档中每个字或词的位置
信息,查找时扫描表中每个文档中字或词的信息直到找出所有包含查询关键字
的文档。这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于
维护;当时在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使
得检索时间大大延长,检索效率低下。正排表的结构如图 4.3 所示。

第四章

DocID
文档标识号

索引技术与查询检索

WordID 单词标识号

nhits:hits 列表长度 Hits 条目

WordID 单词标识号

nhits:hits 列表长度 Hits 条目

Null 空标识
图 4.3 正排表结构

实际上通常采用另一种词表组织方法:倒排表,其结构如图 4.4 所示。倒排
表与正排表的主要区别在于:正排表的主关键字为 DocID,倒排表的主关键字
为 WordID。这是因为正排表是以每个页面文档为基础,对其包含的单词进行分
析后形成的,自然以页面标识号 DocID 为主关键字;而倒排表的功能是为了搜
索引擎能够通过某个关键词查找到与之相关的页面文档,需要以单词标识号
WordID 为主关键字。倒排表的表项结构如图 4.4 所示。
WordID
单词标识号

DocID 文档标识号

nhits:hits 列表长度 Hits 条目

DocID 文档标识号

nhits:hits 列表长度 Hits 条目

Null 空标识
图 4.4 倒排表的表项结构

倒排表存储序列与正排表不同,它是采用 <DocID,nhits,hitlist> 序列的存储
结构,并不直接存储 WordID,相应的功能放入词典库<Lexicon>中。
在 词典 库 <Lexicon> 中, 每个 WordID 都 有一 个指 针项 ,指 向其 对应 的
<DocID,nhits,hitlist>序列在存储桶中的相对位置。而从 WordID 本身可以算出其
所在的存储桶编号,所以指针项指向的事在存储桶中的相对位置。如图 4.5 所示。
词典库
WordID nDocs pointer
WordID nDocs pointer

倒排表
DocID nhits Hits 列表
图 4.5 词
典库、倒排
表关系图

DocID nhits Hits 列表

第四章

索引技术与查询检索

下面通过一个例子说明倒排索引的建立过程:
1)
1
2







文 章 1 的 内 容 为 : Tom 住 在 广 州 , 我 也 住 在 广 州 。
文章 2 的内容为:我曾经住在上海。
2)由于是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通
:











a.我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有的
词,即分词。英文单词由于用空格分隔,比较好处理。中文单词间是连在一起的










b.文章中的”在”, “曾经” “也”等词没有什么实际意义,中文中的“的”
“是”等字通常也无具体含义,这些不代表概念的词可以过滤掉。
c.对于英文,所有单词需要统一大小写,而且要将不同时态的动词还原为原型。
d. 文 章 中 的 标 点 符 号 通 常 不 表 示 某 种 概 念 , 也 可 以 过 滤 掉 。







文 章 1 的 所 有 关 键 词 为 : [tom] [ 住 ] [ 广 州 ] [ 我 ] [ 住 ] [ 广 州 ]
文章 2 的所有关键词为:[他] [住] [上海]
3) 有了关键词后,我们就可以建立倒排索引了。上面的对应关系是:“文章号
”对“文章中所有关键词”。倒排索引把这个关系倒过来,变成:“关键词”
对“拥有该关键词的所有文章号”。文章 1,2 经过倒排后变成






1
广

2

1

1,2

2


tom 1
通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中
出现次数和出现的位置,通常有两种位置:a)字符位置,即记录该词是文章中
第几个字符(优点是关键词亮显时定位快);b)关键词位置,即记录该词是文
章中第几个关键词(优点是节约索引空间、词组(phase)查询快)。
加上“出现频率”和“出现位置”信息后,我们的索引结构变为:
关 键 词
文 章 号 [ 出 现 频 率 ]
出 现 位 置
1[2]
3
6
广


2[1]
1

1[1]
4

第四章



tom 1[1] 1

1[2],2[1]

索引技术与查询检索

2


2[1]

5

2


3

以住这行为例我们说明一下该结构:“住”在文章 1 中出现了 2 次,文章 2 中
出现了一次,它的出现位置为“2,5,2”这表示什么呢?我们需要结合文章号和
出现频率来分析,文章 1 中出现了 2 次,那么“2,5”就表示“住”在文章 1 中
出现的两个位置,文章 2 中出现了一次,剩下的“2”就表示“住”是文章 2 中
第 2 个关键字。
以上就是索引结构中最核心的部分。实现时将上面三列分别作为词典文件
(Term Dictionary)、频率文件(frequencies)、位置文件(positions)保存。其
中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,
通过指针可以找到该关键字的频率信息和位置信息。另外有的索引中还使用了
field 的概念,用于表达信息所在位置(如标题中,文章中, url 中),在建索
引中,该 field 信息也记录在词典文件中,每个关键词都有一个 field 信息(因
为每个关键字一定属于一个或多个 field)。
下面我们可以通过对该索引的查询来解释一下为什么要建立索引。假设要
查询单词 “住”,索引器先对词典查找、找到该词,通过指向频率文件的指针
读出所有文章号,然后返回结果。词典通常非常小,因而,整个过程的时间是
毫秒级的。而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行
字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍
受的。

4.2.2 倒排索引 的压缩技术
对于大型搜索引擎来说,其索引数量巨大,对索引进行压缩存放可以减少
所需的存储空间。另外,检索系统执行检索时,通常需要读取一定的索引数据,
采用压缩技术 [32]-[35],可以减少读取数据所需的 I/O 时间,从而有可能提高检索
速度。
首先,对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后
缀>,例如:当前词为“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯
语”压缩为<3,语>。
其次大量用到的是对数字的压缩,数字只保存与上一个值的差值(这样可
以减小数字的长度,进而减少保存该数字需要的字节数)。一个关键词对应的
倒排索引表通常可以表示为:

< n , < d1 , f1 , <P11 , P12 ,… P1n>> , < d2 , f2 , <P21 , P22 ,…

第四章

索引技术与查询检索

P2n>>,…,< dn,fn ,<Pn1,Pn2,…Pnn>>>
其中,n 表示关键词在 n 个网页中出现,di 为网页的编号,fi 为单词在网页

di 中出现的频率,<Pi1,Pi2,…Pin>表示关键词出现在 di 网页中的位置信息列
表。事实上,对于一个关键词,可以将倒排索引分成三部分看待:
1. 一个网页编号的序列<d1,d2,…dn>
2. n 个网页位置编号序列<Pi1,Pi2,…Pin>
3. 一个单词频率序列<f1,f2,…fn>
通常情况下,倒排索引中关键词对应的网页编号序列以及关键词在网页中
出现的位置编号序列都是按照递增的顺序进行排列的,所以可以采用间隔 di+1di 和 Pik+1-Pik 来代替原序列中的值,则上述三个序列可以用以下形式描述:
1.一个网页编号的间隔序列<d1,d2– d1,…dn– dn -1>
2.n 个网页位置编号间隔序列<Pi1,Pi2,…Pin–Pin-1>
3.一个单词频率序列<f1,f2,…fn>
转化成间隔后,不会损失任何信息,但却减少了索引的存储所占用的空间。
对索引压缩比较常用的编码有:Golomb编码、字节对齐压缩(Byte-Aligned)编
码、Elias gamma(γ)编码等。

4.3 查询 结果排 序

查询结果排序是搜索引擎系统中一项非常重要的技术,其涉及到两个方面
的因素:一是网页自身的相关性[36];二是网页的链接分析[37]。

第四章

索引技术与查询检索

4.3.1 基于网页 内容的算法
(1)锚文本
锚文本就是链接文本。例如,网站首页把“招生就业”作为招生就业办公
室的链接,访问者通过点击网站首页的“招生就业”就能进入招生就业办公室
首页,那么“招生就业”就是招生就业办公室首页的锚文本。锚文本可以作为
锚文本所在的页面的内容的评估。锚文本能作为对所指向页面的评估,一般能
精确的描述所指向页面的内容。
(2)TF/IDF
TF/IDF(Term Frequency /Inverse Document Frequency) 的概念被认为
是信息检索中最重要的发明。TF(Term Frequency)——单文本词汇频率,根据
网页的长度,对关键词的次数进行归一化,也就是用关键词的次数除以网页的
总字数,这个商称为“关键词的频率”或者“单文本词汇频率”;
IDF(Inverse Document Frequency)——逆文本频率指数,假定一个关键词
W 在 DW 个网页中出现过,那么 DW 越大,W 的权重越小,反之亦然。在信息
检索中,使用最多的权重是“逆文本频率指数”,它的公式为 log(D/
DW),其中 D 是全部网页数。TF/IDF 算法就是把关键词的 TF 值和 IDF 值的加
权求和 TF1*IDF1+TF2*IDF2+…+TFN*IDFN 做为网页的相关度。
(3)页面版式
每个网页都有版式,包括标题、字体、标签等。搜索引擎可以利用这些版式
来识别搜索词与页面内容的相关程度。以静态的 html 格式的网页为例,搜索引
擎通过网络蜘蛛把网页抓取下来后,需要提取里面的正文内容,过滤其他 html
代码。在提取内容的时候,搜索引擎就可以记录所有版式信息,包括:哪些词
是在标题中出现,哪些词是在正文中出现,哪些词的字体比其他的字体大,哪
些词是加粗过,哪些词是用 KeyWord 标识过的等。这样在搜索结果中就可以根
据这些信息来确定所搜索的结果和搜索词的相关程度。

4.3.2 基于链接 分析的算法

(1)PageRank
Google 革命性的发明是它名为 PageRank 的网页排名算法,PageRank 的
原理类似于科技论文中的引用机制:谁的论文被引用次数多,谁就是权威。在
互联网上,链接就相当于“引用”,在 B 网页中链接了 A,相当于 B 在谈话时
提到了 A,如果在 C、D、E、F 中都链接了 A,那么说明 A 网页是最重要的,A 网
页的 PageRank 值也就最高。PageRank 的简单公式如下:

第四章

索引技术与查询检索

网 页 A 级 别 = ( 1- 系 数 ) + 系 数 * (
网页N级别
网页N链出个数

网页1级别
网页1链出个数

+

网页 2级别
网页 2 链出个数

+···+

(2)超链分析
百度(baidu)的网页排名技术,基本原理是:在某次搜索的所有结果中,
被其他网页用超链指向得越多的网页,其价值就越高,就越应该在结果排序中
排到前面。
(3)HillTop
HillTop 算法的指导思想和 PageRank 的是一致的,都是通过网页被链接的
数量和质量来确定搜索结果的排序权重。但 HillTop 认为只计算来自具有相同主
题的相关文档链接对于搜索者的价值会更大,即主题相关网页之间的链接对于
权重计算的贡献比主题不相关的链接价值要更高,这种与主题相关的文档为“
专家”文档,从这些专家文档页面到目标文档的链接决定了被链接网页“权重
得分”的主要部分。

4.3.3 高校网页 结构和内容的 分析
为了更好的适应用户的搜索要求,需要对高校网页的结构、内容等进行分
析。分析发现,高校网站的网页分类比较明确,网页都是一层一层按分类链接
下来而没有形成错综无序的“网状”结构,因此可以确定 PageRank 等链接分
析算法不适合应用在校园网的网页评级中。
分析还发现,校园网的很多网页使用了锚文本,例如前面提到的“招生就
业“等职能部门的锚文本链接,虽然这些锚文本很清晰的描述了所指网页的内
容,但是对其所在网页的评估上会起到误导的作用,产生”主题漂移“的现象;
同时查看网页源文件可发现, <Title>标签设计规范,基本已经能评估该网页的
内容,例如研究生部首页源文件中的 <title>北京信息科技大学(筹)研究生部欢迎
您!</Title>,因此校园网中的网页相关度计算摒弃锚文本算法而使用页面版式
算法来计算网页相关度是比较合适的。
仅使用一种算法来对网页排序是不明智的,这极容易差生“主题漂移“和
”主题扩大化“现象。综合考虑更多的因素,对网页的权值做加权,这样能最
大限度的避免”主题漂移“和”主题扩大化“现象的产生。

4.3.4 排序算法 的设计
根据对高校网页结构和内容的分析,检索器系统综合以下三种算法来实现
网页相关度的计算,完成对网页的排序。

第四章

索引技术与查询检索

(1) 页面版式
该算法将页面关键词分为三级,通过 HTML 标签确定关键词级别,其中
<title>(标题)修饰的关键词为最高级,设定值为“ 3”;正文中的 <hn>(字体大
小)、<u>(下划线)、<b>(黑体字)、<i>(斜体字)、<em>(强调文本)、
<strong>(加重文本)、<big>(字体加大)、<font color>(字体颜色)、<font
size>(字体大小)等标签修饰的关键词为第二级,设定值为“ 2”,正文中无以
上标签修饰的关键词定义为第三级,设定值为“1”。网络蜘蛛在解析文档提取标
题、正文时记录级别信息,在建立文档索引结构时填入版式信息字段。
(2) TF/IDF 算法
TF/IDF 算 法 就 是 把 关 键 词 的 TF 值 和 IDF 值 的 加 权 求 和
TF1*IDF1+TF2*IDF2+…+TFN*IDFN 做为网页的相关度。 TF(单文本词汇频率)
就是用关键词的次数除以网页的总字数得到的商; IDF (逆文本频率指数)的
值为log(D/DW),其中 DW 为含有关键词 W 的网页数,其中 D 是全部
网页数。例如用户输入的查询字串为“计算机研究生招生”,分词系统将字串
分解成“计算机”、“研究生”和“招生”三个关键词,网页 Dk 中共有 1000 个
字,其中“计算机”出现了 5 次,“研究生”出现了 10 次,“招生”出现了 3
次,索引库中共有 1,000,000 网页,其中含有“计算机”的网页数为 100,000,
含有“研究生”的网页数为 10,000,含有“招生”的网页数为 10,000。则网页
Dk

(5/1000*log(1,000,000/100,000)+10/1000*log(1,000,000/10,000)
+3/1000*log(1,000,000/10,000))=0.0713。

第四章

索引技术与查询检索

(3) 网页层次
网站的结构决定了越上层的页面越重要,例如网站首页的电子公告一定比某
个部门的电子公告重要。考虑到网站的这种特性,可以利用网页的层次结构来
做为页面相关度计算的一种算法。
根据对以上三种算法的分析和研究,新算法将在 TF/IDF 算法的基础上,添
加对页面版式和网页层次的综合因素来计算页面的相关度,新算法思想如下:
计算页面的 TF 值时,同时考虑关键词的页面版式信息,而不再单纯的用“关
键词次数 / 网页总字数”,即“每一个关键词的版式值相加 /网页总字数”,然
后乘上该网页的网页层次值作为网页最终的相关度。计算公式如下:
m

Score(W , Dk ) = LevelValue( Dk ) × ∑ (
i =1

∑ FormatValue(W ) log(D
i

WordCount ( Dk )

Di

))

其中 W 为查询字串, Dk 为待计算的网页, LevelValue ( Dk )为网页 Dk 的
网页层次值,W 字串分词为( W1…Wm),FormatValue(Wi)为关键词 Wi 的版式
值,WordCount(Dk)为网页 Dk 的总字数, D 为索引库中网页总数, Di 为含有
关键词 Wi 网页数。

第 5章

软件实 现

课题设计了 Spider 蜘蛛程序根据 URL 数据库对一定量的网络资源进行采集,
利 用 Lucene 建 立 全 文 检 索 系 统 , 并 加 入 自 己 的 修 改 , 增 加 对
Word、Excel、PowerPoint 的检索,利用 Quartz 完成周期性更新,最后适合指定区
域高校网络使用的全文检索系统。

5.1 开发 环境

开发此搜索引擎系统,利用了Lucene工具软件包;采用了Java语言进行主
体代码的开发;采用了JSP进行用户界面的设计;PC服务器上的数据库采用
Oracle数据库系统;采用ApacheT omcat作为Web服务器软件。
之所以采用以上工具进行开发,主要是出于以下考虑:
1) Java[38]-[40]是一种简单的,面向对象的,分布式的,解释的,键壮的安全
的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言。具体来
说Java具有如下特性:简单性、面向对象、分布式、解释型、可靠、安全平台无关、
可移植、高性能、多线程、动态性等。Java还提供了大量的类以满足网络化、多线程、
面向对象系统的需要,因此Java非常适合于跨平台、分布式计算环境的面向对象
编程。
2) Lucene[41]是一个用Java写的全文索引引擎工具包,利用它可以方便的嵌
入到各种应用中实现针对应用的全文索引/检索功能。

第五章 软件实现

3) JSP[42] (Java Server Pages)是由 Sun Microsystems 公司倡导、许多公司参与
一起建立的一种动态网页技术标准,该技术为创建显示动态生成内容的 Web 页
面提供了一个简捷而快速的方法。JSP 技术的设计目的是使得构造基于 Web 的应
用程序更加容易和快捷,而这些应用程序能够与各种 Web 服务器,应用服务器,
浏览器和开发工具共同工作。
4) Oracle[43]是一个面向 Internet 计算环境的数据库。Oracle 关系数据库系统
可移植性好、使用方便、功能强。现在版本的 Oracle 数据库管理系统内核都允许
Java 对象在其内运行,Oracle JVM(其前身为 Jserver)提供了健壮的基础体系
结构(基于会话的、优化的进程、内存管理和 Unicode 支持),这一体系结构协
调了与 J2SE 完全兼容的传统的 JDK 虚拟机和自身带有内存模型的 Oracle 数据
库、错误处理以及可伸缩性之间的差异。
5) Tomcat[44]是 Jakarta 项目中的一个重要的子项目,是 Sun 公司官方推荐的
Servlet 和 JSP 容器,因此其越来越多的受到软件公司和开发人员的喜爱。Servlet
和 JSP 的最新规范都可以在 Tomcat 的新版本中得到实现。
综合以上因素考虑,我们选择了 Java+lucene+JSP+Oracle+Tomcat 作为系统
开发的软件平台。

5.2 网页 抓取模 块的实 现

Searcher 类:网络蜘蛛的入口,网络蜘蛛的核心类,该类派生 Thread 方法,负
责对站点的页面资源采集,它包含了 Searcher 和 run 两个方法,前者为构造方

第五章 软件实现

法,后者负责线程的运行,processPage 方法多线程调用 CrtIndex 类。
public class Searcher extends Thread
implements ISpiderReportable
private String url
protected statie Searcher searcher
IworkloadStorable wl
+Searcher(String url)
+void run()
+void processPage(HTTP http)
表 5.1 搜索类

CrtIndex 类:HTML 解析类,包含 start 方法,使用多线程技术。功能包括对页面
URL 的采集,更新到数据库,建立索引。
public class CrtIndex
HTTP http
Index index
private final Lock
+ synchronized void start()
+ static String input
表 5.2 CrtIndex 类

Linkpaser 类:超链接过滤类,包含 Linkpaser , input , isValidate , isCurrentSite
等 4 个方法, Linkpaser 负责对过滤去超链接中的无效链接 (例如图片, E-MAIL
等 ) , input 方 法 进 行 中 文 编 码 的 处 理 , isValidate 判 断 是 否 有 效 链 接 ,
isCurrentSite 返回是否为站内链接。
public class Linkpaser
HTTP http

第五章 软件实现

+ Vector parseLink(Vector links)
+ static String input(String str)
+boolean is validate(String_herf)
+boolean isCurrentSite(String_herf)
表 5.3 超链接过滤类

Utils

getInstance,addUrl,changeModefied,
isUpdate,cheekModefied 五个方法,getInstance 负责获取实例,isUpdate 判断网
页是否更新,若为新网页则将其加入到数据库中,而 addurl 方法则将新网页添
加到 URL 数据库中去, changeModefied 方法负责将网页的更新标识改为 l(1 为
己更新,0 为未更新),checkModefied 判断网页是否已更新过[22]。
public class Utils
static Util futils
+ synchronized static Util getInstance()
+ boolean is Update(String URL)
+ void addUrl(String url)
+ void changeModefied(String url)
+boolean cheekModefied(String url)
表 5.4 数据库方法类

5.3 页面 更新模 块

WebSiteQuartz 类:作业调度类,包含 execute 方法,当作业触发时调用此方法。

第五章 软件实现

public class WebSiteQuartz implements
Job
+execute
表 5.5 页面更新类

页面更新模块和网络蜘蛛模块共同协作完成系统的采集,模块的详细划分如下:
6

作业更新模块:由 quartz 调度完成对作业的调度控制,包括作业调度的
开始执行时间,周期,要执行的类,调用相应的功能。

7

信息采集模块:Searcher 类是整个系统的核心,它负责线程的整个运行过
程,而线程的启动和结束由作业调度类进行控制。作业调度类
WebSiteQuartz 获取 URL 数据中心的站点 URL ,然后构造线程,各子线
程对各自的页面进行资源采集。当线程结束之后,系统继续在 URL 数据
库中提取一个 URL 然后启动线程进行页面采集,如此不断的循环下去,
直到 URL 数据库中所有网页资源被更新完为止。

8

信息处理模块:HTTP 解析类负责 URL 的解析工作,对此 URL 的网页进
行访问并通过 Utils 类的 changeModefied 方法改变其在 URL 数据库中的
更新标识。然后,信息处理模块提取此网页上的所有链接交由超链接过滤
类 Linkpaser 进行处理,Linkpaser 超链接过滤队列算法返回一个有效链接
队列列表,HTTP 解析类将此队列中链接的标题内容等相关的数据进行索
引(通过下面的文档处理模块 ),此时,如果遇到新的网页资源 (即未加入
到 URL 数据库中的新网页),则将其加入到 URL 数据库中去。至此,负责
采集这个 URL 网页的线程就运行完毕了。

第五章 软件实现

5.4 分词 器的实 现

系统实现了机械分词中正向最大匹配法的 Lucene 分词器包括两个类,
CJKAnalyzer 和 CJKTokenizer,它们的源代码如下:

package org.solol.analysis;

import java.io.Reader;
import java.util.Set;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.StopFilter;
import org.apache.lucene.analysis.TokenStream;
/**
* @author solo L
*
*/
public class CJKAnalyzer extends Analyzer {// 实现了 Analyzer 接口,这是 lucene
的要求
public final static String[] STOP_WORDS = {};
private Set stopTable;
public CJKAnalyzer() {
stopTable = StopFilter.makeStopSet(STOP_WORDS);
}
@Override

第五章 软件实现

public TokenStream tokenStream(String fieldName, Reader reader) {
return new StopFilter(new CJKTokenizer(reader), stopTable);
}
}

package org.solol.analysis;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.TreeMap;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.Tokenizer;
/**
* @author solo L
*
*/
public class CJKTokenizer extends Tokenizer {
//这个 TreeMap 用来缓存词库
private static TreeMap simWords = null;
private static final int IO_BUFFER_SIZE = 256;
private int bufferIndex = 0;
private int dataLen = 0;
private final char[] ioBuffer = new char[IO_BUFFER_SIZE];

第五章 软件实现

private String tokenType = "word";
public CJKTokenizer(Reader input) {
this.input = input;
}
//这里是 lucene 分词器实现的最关键的地方
public Token next() throws IOException {
loadWords();
StringBuffer currentWord = new StringBuffer();
while (true) {
char c;
Character.UnicodeBlock ub;
if (bufferIndex >= dataLen) {
dataLen = input.read(ioBuffer);
bufferIndex = 0;
}
if (dataLen == -1) {
if (currentWord.length() == 0) {
return null;
} else {
break;
}
} else {
c = ioBuffer[bufferIndex++];
ub = Character.UnicodeBlock.of(c);
}
//通过这个条件不难看出这里只处理了 CJK_UNIFIED_IDEOGRAPHS,
//因此会丢掉其它的字符,如它会丢掉 LATIN 字符和数字

第五章 软件实现

//这也是该 lucene 分词器的一个限制,在此基础之上有待完善
if (Character.isLetter(c) && ub = =
Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS) {
tokenType = "double";
if (currentWord.length() = = 0) {
currentWord.append(c);
} else {
//这里实现了正向最大匹配法
String temp = (currentWord.toString() + c).intern();
if (simWords.containsKey(temp)) {
currentWord.append(c);
} else {
bufferIndex--;
break;
}
}
}
}
Token token = new Token(currentWord.toString(), bufferIndex currentWord.length(), bufferIndex, tokenType);
currentWord.setLength(0);
return token;
}
//装载词库,正向最大匹配法的实现
public void loadWords() {
if (simWords != null)return;
simWords = new TreeMap();
try {
InputStream words = new FileInputStream("simchinese.txt");
BufferedReader in = new BufferedReader(new
InputStreamReader(words,"UTF-8"));
String word = null;
while ((word = in.readLine()) != null) {

第五章 软件实现

//#使得我们可以在词库中进行必要的注释
if ((word.indexOf("#") == -1) && (word.length() < 5)) {
simWords.put(word.intern(), "1");
if (word.length() == 3) {
if (!simWords.containsKey(word.substring(0, 2).intern())) {
simWords.put(word.substring(0, 2).intern(), "2");
}
}
if (word.length() = = 4) {
if (!simWords.containsKey(word.substring(0, 2).intern())) {
simWords.put(word.substring(0, 2).intern(), "2");
}
if (!simWords.containsKey(word.substring(0, 3).intern())) {
simWords.put(word.substring(0, 3).intern(), "2");
}
}
}
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

5.5 常用 文档处 理模块 框架

DocCenter: 接 口 : 提 供 各 种 格 式 文 档 解 析 器 的 统 一 处 理 接 口 。 定 义
getDocument(String url , InputStream is) 方法,该方法将由所有的文档解析器实

第五章 软件实现

现。getDocument 方法的两个参数,url 为地址,is 为文档。
public interface DocCenter
+Document gctDocument(String url,
InputStream is)
表 5.6 文档统一接口

DocCenterException 类:遇到错误情况时,该类将检测所有从文档解析器抛
出的异常,继承自 Java 核心类 Exception。
public class DocCenterException extends Exception
+DocCenterException()
+DocCenterException(String message)
+DocCenterException(Throwable cause)
+DocCenterException(String message,Throwable
cause)
+Throwable getException()
+void printStackTrace()
+void printStackTrace(PrintStream ps)
+void printStackTrace(PrintWriter pw)
表 5.7 文档统一异常处理

5.5.1 HTML 处理模块

HTMLCenter 类:实现 DocCenter 接口,将后缀名为.html 或.htm 的文档解析成为
Lucene 可以识别和处理的抽象文档 (Document 对象 ) 。 getDocument 通过调用
DoM4J 的 DOM 解析器,对 InputStream 对象指向的 HTML 文档进行处理,建
立一个 Lucene 的 Document 对象 ;getTitle 方法获得 HTML 文档标题的文本类型
值,这些文本用于构成 Lucene 的 Document 实例;getBody 方法获得 HTML 文档

第五章 软件实现

的正文全文,这些文本用于构成 Lucene 的 Document 实例;getText 是用于提取特
定 DOM 节点下所有元素中的文本的一般方法。
public class HTMLCenter
+Document getDocument(String url,InputStream is)
+String getTitle(Element rawDoc)
+String getBody(Element rawDoc)
+String getText(Node node)
表 5.8 文档统一异常处理

5.5.2 WORD 处理模块

WordCenter 类:将后缀名为.doc 的 Word 文档解析成为 Lucene 可以识别和处理的
抽象文档(Document 对象)。通过 POI 中的 HWPF 接口处理 Microsoft Word 文档,
这个方法能够将 Microsoft Word 文档中的文本转换为一个字符串对象—这样得
到的数据将保存在 body 域中;元数据的获得与此类似,保存在 mata 域中;由此可
以组装成 Lucene Document 类的一个实例。
public class WordCenter
+Document getDocument(String url,InputStream is)
表 5.9 WORD 模块

5.5.3 EXCEL 处理模块

ExcelCenter 类 : 实现 DocCenter 接口,将后缀名为 .xls 的 Excel 文档解析成为
Lucene 可以识别和处理的抽象文档(Document 对象)。通过 POI 包中的 HSSF 接口
可以处理 EXCEL 文档,HSSF 提供给用户使用的对象在

第五章 软件实现

org.apache.poi.hssf.usermodel 包中,主要部分包括 Excel 对象,样式和格式,还
有辅助操作。
public class ExcelCenter
+Document getDocument(String url,InputStream is)
表 5.10 Excel 模块

5.5.4 PowerPoint 处理模块

PPTCenter 类:实现 DocCenter 接口,将后缀名为.ppt 的 PowerPoint 文档解析成为
Lucene 可以识别和处理的抽象文档 (Document 对象)。通过 POI 包中的 HSLF 接
口 可 以 处 理 PowerPoint 文 档 , HSLF 提 供 给 用 户 使 用 的 对 象 在
org.apache.poi.hslf.usermodel 包中,主要部分包括 PowerPoint 对象,样式和格式,
还有辅助操作。
public class PPTCenter
+Document getDocument(String url,InputStream is)
模块

表 5.11 Excel

第五章 软件实现

5.6 系统 演示

图 5.1 搜索引擎的入口界面

图 5.2 查询结果显示界面

本课题的设计与实现,参考了搜索引擎评价的三级指标体系。搜索结果方
面,能够搜索 html 网页和多种类型文档,并且利用 Quartz 完成周期性更新,具
备较好的搜全率;采用多线程技术和倒排索引机制,具备较好的搜快率和搜准
率。搜索过程方面,支持网页快照功能。搜索界面方面,采用 jsp 技术设计了系
统的入口界面和查询结果显示界面,页面设计做到了美观、简洁,结果排序做
到了整齐、清晰、重点突出。系统的入口界面和查询结果显示界面如图 5.1 和图

第五章 软件实现

5.2 所示。

第六章

第 6章

总结与展望

总结 与展望

6.1 总结

本文追溯搜索引擎的发展历程,对国内外搜索引擎进行对比分析,剖析了
搜索引擎的组成、工作原理及工作流程。并在高性能可扩展的 Java 全文索引工具
包 Lucene 的基础上,设计了整个搜索引擎的架构。对网络蜘蛛、索引、检索结果
排序等搜索引擎的主要技术进行研究。使用 Java 语言实现了一个可扩展的基于
区域内的校际搜索引擎。通过对本课题的设计与实现,主要取得了以下研究成
果:
1) 构建的网络蜘蛛程序采用非递归爬取方式,利用一个基于内存的作业队列
管理器负责网页抓取过程中 URL 链接的加入、分配、处理等作业,同时使用
多线程技术并发抓取网页,具有较高的效率。
2) 以开源项目 QUARZ 为基础的网络资源更新策略。
3) 将网络蜘蛛结合 Lucene 建立全文检索系统,提供了基于特定区域高校资源
的全文检索平台。
4) Lucene 作为一项开源项目,在中文分词和查询结果排序方面仍不完善。由于
Lucene 具有良好的可扩展性,本系统借助中文词典编写另外的词法分析器,
达到较好的分词效果,并设计了基于高校网页结构的检索结果排序算法。
5) 在 Lucene 只 能 处 理 文 本 文 档 的 基 础 上 , 添 加 对 常 用 文 档
HTML,Word,Excel,PPT 的全文检索。

第六章

总结与展望

6.2 展望

整个系统涵盖的范围很大,涉及到的技术细节很多,在以下方面,将来还
有待于进一步改进。
1) 增加网络蜘蛛对 JSP、ASP 等动态生成网页的抓取能力,进一步提高网络蜘
蛛的搜全率。
2) 中文分词对搜索引擎的索引和搜索都至关重要,因此还必须在中文分词的
准确度上下功夫。

致谢

2008-6-2

参考文献

参考文 献
[1] 《中国互联网络发展状况统计报告(2007 年 1 月)》,
http://www. cnnic .cn/uploadfiles/pdf/2007/1/23/113114pdf
[2] 刘海涛.Web 信息抽取及搜索引擎的研究.南京大学 博士学位论文,2002,6-16
[3] 互联网实验室.中国互联网搜索引擎评测研究报告.互联网实验室,
Http://www.chinalabs.com/servsurvery/doc0806.shtml
[4] 李耀辉,周丽莉.搜索引擎技术分析.中国科技信息,2006,12
[5] 杨娜.校园网搜索引擎—搜索器技术:[硕士学位论文].北京机械工业学院,2007
[6] CSDN.rfc1945-http1.0 自译本.http://dev.csdn.net/article/4/4391.shtm
[7] Heaton J. Programming Spiders, Bots, and Aggregators in Java ( 童兆丰,李纯译.北京:电
子工业出版社,2002-07
[8] 谭淑英,刘丽华.Web Robot技术及其Java实现.中南工业大学学报.2001,32(3)
[9] Jeff Heaton.Programming Spiders,Bots,Aggregators in Java[M].Sybex,2002
[10] 冯博,应群 编著. 面向对象的 Java 网络编程.清华大学出版社,2005 年 4 月
[11] Jeffheaton 薯.童兆丰,李纯,刘润杰译.网络机器人 Java 编程指南.
[12] http://www.opensymphony.com/quartz.
[13] 龚汉明,周长胜.汉语分词技术综述.北京机械工业学报,2004,(3):52-55
[14] 殷建平.汉语自动分词方法.计算机工程与科学,1998,20(3):61-66
[15] 张华平,刘群. 基于 N-最短路径方法的中文词语粗分模型.中文信息学报,2002,16(5):1-7
[16] 郑逢斌,付征叶,乔保军等. HENU 汉语自动分词系统中歧义字段消除算法. 河南大学学
报(自然科学版),2004,34(4):49-52
[17] 王 笑 旻 . 基 于 Bigram 的 特 征 词 抽 取 及 自 动 分 类 方 法 研 究 . 计 算 机 工 程 与 应 用 ,
2005.22:172-179,210
[18] 李 振星 , 徐泽 平 , 唐 卫清 等. 全二 分最 大匹 配快 速分 词算 法. 计算 机工 程与 应用 .
2002,11:106-109
[19] 金翔宇 , 孙正兴 , 张福炎.一种中文文档的非受限无词典抽词方法 . 中文信息学报 .
2001,15(6):33-39
[20] 黄昌宁.中文信息处理中的分词问题.语言文字应用,1997,1:72-78
[21] 孙茂松,左正平,黄昌宁.汉语自动分词词典机制的实验研究.中文信息学报,
1999, 14 (1) :1-6
[22] 李庆虎 , 陈玉健 , 孙家广.一种中文分词词典新机制—双字哈希机制 . 中文信息学报 ,
2002,17(4):13-18
[23] 王秀坤,李政,简幼良等.基于 Hash 方法的机器翻译词典的组织与构造 .大连理工大学学
报,1996,36(3):352-355
[24] 梁南元.书面汉语自动分词综述.计算机应用与软件,1987,(3)44-50

参考文献
[25] 揭春雨,刘源,梁南元.论汉语自动分词.中文信息学报,1990,(1):1-9
[26] 韩客松,王永成,陈桂林.无词典高频字串快速提取和统计算法研究.中文信息学报,
2005,15(2):23-30
[27] 张仰森,曹元大,俞士汶.基于规则与统计相结合的中文文本自动查错模型与算法.中
文信息学报,2006,20(4):1-7,55
[28] 张仰森,徐波,曹元大等.基于姓氏驱动的中国姓名自动识别方法.计算机工程与应用,
2003,4:62-65
[29] 刘挺,吴岩,王开铸.串频统计和词形匹配相结合的汉语自动分词系统.中文信息学报,
1997,12(1):17-25
[30] 韩客松,王永成,陈桂林.汉语语言的无词典分词模型系统.计算机应用研究,1999,10:89
[31] 张江.基于规则的分词方法.计算机与现代化,2005,4:18-20
[32] Scholer F,Wiliams H,iannis J. Compression of Inverted Indexes for Fast
Query Evaluation [ J ].ACM Transactions on Information Systems,2002 (8):222229
[33] P.Elias.Universal Codeword Sets and Representations of the Integers. IEEE
Transactions on Information Theory, IT-21(2):194-203, Mar. 1975.
[34] Jim Meany. Gomoly Coding Notes. 2005(10).
[35] Moffat and L.Stuiver. Binary interpolative coding for effective index
compression. Information Retrieval, 3(1):25–47, July 2000.
[36] 江娟,郑玲,海涛.搜索引擎的结果相关性排序的度量方法.中国电力教育,2007年
研究综述与技术论坛专刊:325-327
[37] 朱炜,王超.Web超链分析算法研究.计算机科学,2003,30 (9):89-92
[38] Cay S.Horstmann,Gary Cornell.Java2核心技术卷Ⅰ原理(李如豹,刚冬梅译).北京:机械
工业出版社,2003
[39] Cay S.Horstmann,Gary Cornell.Java2核心技术卷Ⅱ高级特性(王建华,董志敏,杨保明译).
北京:机械工业出版社,2003
[40] 林智扬,范明翔,陈锦辉.深入浅出Java Swing程序设计.中国铁道出版社,2005
[41] http://lucene.apache.org/
[42] (美)Marty Hall.Servlet与JSP权威指南.北京:机械工业出版社,2002
[43] (美)JasnoPriee.Oracle9iJDBC程序设计.北京:机械工业出版社,2003
[44] Tomcat.Http://java.sun.com/products/jsp/tomcat

个人简历 在读期间发表的论文