- 1 -
中国科技论文在线
基于 Servlet 的搜索引擎
张文*
作者简介:张文(1989~),本科生。研究方向 J2EE,数据结构与算法分析
(中南林业科技大学计算机与信息工程学院,长沙 410004)
摘要:基于 Servlet 技术和数据结构中的哈希映射,以构建索引表的方式对网页关键字进行5
组织。根据客户端提供的关键字对索引表分析,得到搜索结果。由于搜索过程是访问缓存,
因而有较高的搜索效率,在中小型服务器中可以广泛采用此技术作为站内搜索引擎,对于大
中型服务器可以提供广域网 web搜索服务。
关键词:J2EE;Servlet;搜索引擎;索引表
中图分类号:TP312 10
Based on Servlet search engine
Zhang Wen
(Central South University of Forestry and Technology, Changsha 410004)
Abstract: Based on Servlet technology and the data structure of the hash mapping, to construct the 15
index table way realization for web keyword organization. According to client provides key word to
index table analysis, get the search results. As search process is to visit cache, which have higher search
efficiency, in the small server can widely used this technique as stand inside search engine, for medium
and the server can provide wan web search services.
Key words: J2EE;Servlet;Search engine ;Index table 20
0 引言
随着因特网的迅猛发展,网络信息量的增加,如何从海量的信息中找到所需要的信息已
经成为当今社会人们需要关注的问题,信息检索也成为计算机领域的热点问题。从海量数据
中找到所需要的信息首先需要将海量的数据组织成便于查找的数据结构,其次在组织过程中25
必须体现关键字的作用,即以关键字为标识,标识记录条目,再者,能够随着网络信息的不
断更新,信息数据库能够实现自我维护,从而确保信息数据库的全面性和及时性。
本文从搜索引擎的角度出发,以 J2EE[1]为基础,介绍一种基于 Servlet和索引表结构的
搜索引擎。该搜索引擎以用户的输入作为关键字来查询索引表,并在用户使用搜索引擎的过
程中不断维护和重构索引结构,以实现索引表(也可理解为信息数据库)的自我更新。此搜30
索引擎是以文件的型式作为信息数据库保存在磁盘上,并在内存中设置缓存来实现信息的备
份与更新。此搜索引擎作者已经实现,可广泛应用在中小型服务器上作为站内搜索引擎,同
时也在可在大中型服务器上作为 web搜索引擎。
1 索引的磁盘文件结构
索引在搜索引擎中的作用可以理解为目录对于一本字典的作用,当我们需要查找某个单35
词时,通过目录找到该单词所在字典中的页码,往往比随机翻查字典快得多,搜索引擎中的
索引同样也是这个作用。为了在最短的时间内找到所需的信息,需要为所有现存信息构建一
个便于组织和查找的数据结构——索引。当接收到用户提出的关键字时,对此索引表进行查
找,从而找到所需的信息。该索引表的数据结构以及相应的查找算法[2]决定着搜索引擎的性
- 2 -
中国科技论文在线
能。 40
索引表[3]中的索引条目模仿了字典中的目录项结构,以关键字作为标识,另一端指向目
标 URL的唯一标识。目标 URL的结构采用单独的字符串结构,按顺序排列,并以其顺序值
作为唯一标识。构建好索引条目后,将目标 URL和索引条目组织在一起就形成了索引表的
磁盘文件。
45
图 1 索引表的磁盘文件结构
2 索引逻辑结构
数据结构
哈希表类型的 theIndex,是整个索引表在内存中的结构(缓存)[4],也是搜索引擎主要的
数据结构。由索引表的文件结构可以发现每一个关键字对应着一个记录条目,可以认为这个50
记录条目为一行字符串,如“add|2 1|3 3|4 1|5 7”表示“add”关键字在 2号 URL中出现 1次,在
3号 URL中出现 3次,在 4号 URL中出现 1次,在 5号 URL中出现 7次。
延迟加载
为了能够在最短时间内得到与关键字对应的 URL,需要把字符串结构的索引条目解析
为 URL数组结构(将“|2 1|3 3|4 1|5 7”解析成含有四个元素的 URL数组),存放到 theIndex55
中作为与关键字的对应值,从而在以后的查找过程中省去解析字符串过程进而直接使用
URL 数组。但是如果在搜索引擎初始化时对所有的字符串索引项进行解析,势必大大降低
效率,因而可行的办法是使用延迟加载[5],当初始化时以字符串作为与关键字对应的值,在
第一次使用时对其进行解析,使其变成 URL数组结构,并替代字符串,作为该关键字对应
的值(利用了 java 语言中 HashTable 的特性),以后再使用时直接使用 URL数组而不需要再60
次解析。
搜索过程
根据关键字通过查找 theIndex哈希映射表得到该关键字对应的 URL信息,由于一个键
- 3 -
中国科技论文在线
对应的值在 java 语言下的 HashTable 中为 Object 类型(所有数据类型的父类),因而返回
一个 Object类型对象,如果该对象为数组类型的对象,则说明缓存中的关键字已经过解析,65
形成了可以直接使用的查询结果,否则需要对字符串进行解析,最后得到数组类型的结果。
并将 theIndex表中的数据更新。
图 2 搜索引擎工作过程 70
//从HashTable中取出索引项
Object data = (());
if (data instanceof String) { 75
//根据关键字返回对应的数组
dataForWord = cacheFilesForWord(word);
} else {
dataForWord = (Vector) data;
} 80
if (dataForWord != null) {
int i, max;
85
max = ();
//初始化结果集result
for (i = 0; i < max; i++) {
- 4 -
中国科技论文在线
//取出索引项 90
entry = (IndexEntry) (i);
//根据索引中的文件标号从files中找到相应的文件路径
//加载到resluts中
(());
} 95
}
return results;
3 索引表的管理维护
由于索引表作为搜索引擎的关键,对其的维护显得十分重要,因而需要设置相应的索引100
管理器来对其结构进行维护。对于索引表的维护主要表现在索引表的定期更新[6]。因而,需
要设置时间记录表(哈希映射集)的数据结构来记录索引表的更新时间,从而达到对索引表
的定期维护。对于索引表的维护工作[7],可以采取两种方案,一种是构建一个单独的计时线
程,定期进行索引维护工作;第二种方案是每次在用户搜索时触发索引管理器,根据系统时
间决定是否进行维护工作,这里我们采用第二种方案。当索引管理器被触发后,进行索引管105
理工作,如果达到更新时间,则对索引文件进行更新,由于更新磁盘索引文件涉及到 I\O操
作,因而是一个比较费时的过程,所以需要单独启动一个读写线程来对磁盘文件进行更新。
以上便是索引管理器的工作过程。
110
图 3 索引管理器的执行过程
HTMLIndex retVal = null;
Object test = null;
IndexLoader loader = null; 115
if (fulldir == null)
return null;
synchronized (indices) {
- 5 -
中国科技论文在线
test = (fulldir); 120
// 第一次建立索引
if (test == null) {
// 加载更新器
loader = new IndexLoader(fulldir, dir, indices);
// 加入加载器记录表,在目录下建立索引 125
(fulldir, loader);
// 加入时间记录表
(fulldir, new Date());
} 130
else if (test instanceof HTMLIndex) {
retVal = (HTMLIndex) test;
// 何时重新检查目录是否变化
if (updateInterval > 0) {
try { 135
Date now = new Date(), load;
long nw, ld;
load = (Date) (fulldir);
nw = ();
ld = (); 140
//大于规定时间,需要重新加载
if (nw > (ld + (updateInterval * 1000))) {
if (()) {
// 重新加载
loader = new IndexLoader(fulldir, dir, indices); 145
(fulldir, loader);
(fulldir, new Date());
retVal = null;
} else {
(fulldir, new Date()); 150
}
}
} catch (Exception exp) {
retVal = (HTMLIndex) test;
(fulldir, retVal); 155
(fulldir, new Date());
}
}
// 检查结束
} 160
}
4 搜索引擎实现
类之间的依赖关系
MySearchServlet 为接收 HTTPRequest 请求入口,解析浏览器端参数(关键字),加载165
索引管理器,调用索引查询方法。IndexEntry为索引条目的模型对象,记录着关键字在指定
URL 中出现的次数,可以理解为索引文件中的“|2 1”为一个 IndexEntity 对象。HTMLIndex
为系统整个索引表的模型对象,包含着全局索引信息,以及一系列相关查询方法。
IndexBuilder 为构建索引文件的模型对象,用来读取站点信息,按照指定的格式,在磁盘上
构建索引文件[8]。IndexManager为索引管理器对象,用于定期维护磁盘的索引文件。 170
- 6 -
中国科技论文在线
图 4 搜索引擎核心类之间的依赖关系
测试关键字搜索
用户输入要搜索的关键字(英文单词)后单击 search 返回搜索结果,搜索结果以 URL
的方式反映到浏览器端,并通过超链接跳转到指定网页。 175
图 5 测试界面
5 结束语
本文介绍了一种基于 Servlet的搜索引擎,其核心数据结构为索引表和哈希映射。这种
搜索引擎具有实现简单,性能优良,维护成本低等特点,尤其适合于中小站点作为站内搜索180
引擎。虽然索引文件是以文件的型式存储在磁盘上,但是由于缓存的作用使得搜索的过程中
大大减少了 IO操作,从而提高了效率。此外由于索引管理器的存在,在维护索引文件时,
会不断的将新的索引信息加入索引文件以实现索引文件的自我更新。由于缓存索引在数据结
构上采用了哈希映射,同时结合了 java语言的特点,从而实现了索引信息的延迟加载,大
大的提升了站点的整体性能。 185
- 7 -
中国科技论文在线
[参考文献] (References)
[1] David in Java,Third Edition by Bruce Eckel ,2003. 190
[2] 蒋凯,武港山.基于 Web 的信息检索技术综述.计算机工程,2005,12:7-9
[3] Peter Structures and Algorithms in java.朱剑平.北京:清华大学出版社,2006
[4] Stephen Asbary,Developing Java Enterprise Applications,王强,机械工业出版社,2004.
[5] 白胜普,J2EE企业级应用测试实践,北京:清华大学出版社,2009
[6] W Bruce Creeft,搜索引擎:信息检索实践,刘挺.机械工业出版社,2010 195
[7] Witten .深入搜索引擎,电子工业出版社,2009.
[8] Jaimie Sirovich,搜索引擎优化高级编程.邓少鹍,北京:清华大学出版社,2008