基于Servlet的搜索引擎

时间:2022-05-17 09:42:43

基于Servlet的搜索引擎

摘要 基于Servlet技术和数据结构中的哈希映射,以构建索引表的方式对网页关键字进行组织。根据客户端提供的关键字对索引表分析,得到搜索结果。由于搜索过程是访问缓存,因而有较高的搜索效率,在中小型服务器中可以广泛采用此技术作为站内搜索引擎,对于大中型服务器可以提供广域网web搜索服务。

关键词 J2EE;Servlet;搜索引擎;索引表

中图分类号 TP312 文献标识码A

Based on Servlet search engine

ZHANG Wen1

1(Central South University of Forestry and Technology, Changsha 410004,China)

【Abstract 】Based on Servlet technology and the data structure of the hash mapping, to construct the 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

0 引言

随着因特网的迅猛发展,网络信息量的增加,如何从海量的信息中找到所需要的信息已经成为当今社会人们需要关注的问题,信息检索也成为计算机领域的热点问题。从海量数据中找到所需要的信息首先需要将海量的数据组织成便于查找的数据结构,其次在组织过程中必须体现关键字的作用,即以关键字为标识,标识记录条目,再者,能够随着网络信息的不断更新,信息数据库能够实现自我维护,从而确保信息数据库的全面性和及时性。

本文从搜索引擎的角度出发,以J2EE[1]为基础,介绍一种基于Servlet和索引表结构的搜索引擎。该搜索引擎以用户的输入作为关键字来查询索引表,并在用户使用搜索引擎的过程中不断维护和重构索引结构,以实现索引表(也可理解为信息数据库)的自我更新。此搜索引擎是以文件的型式作为信息数据库保存在磁盘上,并在内存中设置缓存来实现信息的备份与更新。此搜索引擎作者已经实现,可广泛应用在中小型服务器上作为站内搜索引擎,同时也在可在大中型服务器上作为web搜索引擎。

1 索引的磁盘文件结构

索引在搜索引擎中的作用可以理解为目录对于一本字典的作用,当我们需要查找某个单词时,通过目录找到该单词所在字典中的页码,往往比随机翻查字典快得多,搜索引擎中的索引同样也是这个作用。为了在最短的时间内找到所需的信息,需要为所有现存信息构建一个便于组织和查找的数据结构――索引。当接收到用户提出的关键字时,对此索引表进行查找,从而找到所需的信息。该索引表的数据结构以及相应的查找算法[2]决定着搜索引擎的性能。

索引表[3]中的索引条目模仿了字典中的目录项结构,以关键字作为标识,另一端指向目标URL的唯一标识。目标URL的结构采用单独的字符串结构,按顺序排列,并以其顺序值作为唯一标识。构建好索引条目后,将目标URL和索引条目组织在一起就形成了索引表的磁盘文件。

图1索引表的磁盘文件结构

2 索引逻辑结构

2.1数据结构

哈希表类型的theIndex,是整个索引表在内存中的结构(缓存)[4],也是搜索引擎主要的数据结构。由索引表的文件结构可以发现每一个关键字对应着一个记录条目,可以认为这个记录条目为一行字符串,如“add|2 1|3 3|4 1|5 7”表示“add”关键字在2号URL中出现1次,在3号URL中出现3次,在4号URL中出现1次,在5号URL中出现7次。

2.2延迟加载

为了能够在最短时间内得到与关键字对应的URL,需要把字符串结构的索引条目解析为URL数组结构(将“|2 1|3 3|4 1|5 7”解析成含有四个元素的URL数组),存放到theIndex中作为与关键字的对应值,从而在以后的查找过程中省去解析字符串过程进而直接使用URL数组。但是如果在搜索引擎初始化时对所有的字符串索引项进行解析,势必大大降低效率,因而可行的办法是使用延迟加载[5],当初始化时以字符串作为与关键字对应的值,在第一次使用时对其进行解析,使其变成URL数组结构,并替代字符串,作为该关键字对应的值(利用了java语言中HashTable的特性),以后再使用时直接使用URL数组而不需要再次解析。

2.3搜索过程

根据关键字通过查找theIndex哈希映射表得到该关键字对应的URL信息,由于一个键对应的值在java语言下的HashTable中为Object类型(所有数据类型的父类),因而返回一个Object类型对象,如果该对象为数组类型的对象,则说明缓存中的关键字已经过解析,形成了可以直接使用的查询结果,否则需要对字符串进行解析,最后得到数组类型的结果。并将theIndex表中的数据更新。

3 索引表的管理维护

由于索引表作为搜索引擎的关键,对其的维护显得十分重要,因而需要设置相应的索引管理器来对其结构进行维护。对于索引表的维护主要表现在索引表的定期更新[6]。因而,需要设置时间记录表(哈希映射集)的数据结构来记录索引表的更新时间,从而达到对索引表的定期维护。对于索引表的维护工作[7],可以采取两种方案,一种是构建一个单独的计时线程,定期进行索引维护工作;第二种方案是每次在用户搜索时触发索引管理器,根据系统时间决定是否进行维护工作,这里我们采用第二种方案。当索引管理器被触发后,进行索引管理工作,如果达到更新时间,则对索引文件进行更新,由于更新磁盘索引文件涉及到I\O操作,因而是一个比较费时的过程,所以需要单独启动一个读写线程来对磁盘文件进行更新。以上便是索引管理器的工作过程。

图3索引管理器的执行过程

HTMLIndex retVal = null;

Object test = null;

IndexLoader loader = null;

if (fulldir == null)

return null;

synchronized (indices) {

test = indices.get(fulldir);

// 第一次建立索引

if (test == null) {

// 加载更新器

loader = new IndexLoader(fulldir, dir, indices);

// 加入加载器记录表,在目录下建立索引

indices.put(fulldir, loader);

// 加入时间记录表

loadtimes.put(fulldir, new Date());

}

else if (test instanceof HTMLIndex) {

retVal = (HTMLIndex) test;

// 何时重新检查目录是否变化

if (updateInterval > 0) {

try {

Date now = new Date(), load;

long nw, ld;

load = (Date) loadtimes.get(fulldir);

nw = now.getTime();

ld = load.getTime();

//大于规定时间,需要重新加载

if (nw > (ld + (updateInterval * 1000))) {

if (retVal.indexNeedsRebuilding()) { // 重新加载

loader = new IndexLoader(fulldir, dir, indices); indices.put(fulldir, loader); loadtimes.put(fulldir, new Date());

retVal = null;

} else { loadtimes.put(fulldir, new Date());

}

}

} catch (Exception exp) {

retVal = (HTMLIndex) test;

indices.put(fulldir, retVal); loadtimes.put(fulldir, new Date());

}

}

}

}

4 搜索引擎实现

4.1类之间的依赖关系

MySearchServlet为接收HTTPRequest请求入口,解析浏览器端参数(关键字),加载索引管理器,调用索引查询方法。IndexEntry为索引条目的模型对象,记录着关键字在指定URL中出现的次数,可以理解为索引文件中的“|2 1”为一个IndexEntity对象。HTMLIndex为系统整个索引表的模型对象,包含着全局索引信息,以及一系列相关查询方法。IndexBuilder为构建索引文件的模型对象,用来读取站点信息,按照指定的格式,在磁盘上构建索引文件[8]。IndexManager为索引管理器对象,用于定期维护磁盘的索引文件。

图4搜索引擎核心类之间的依赖关系

4.2 测试关键字搜索

用户输入要搜索的关键字(英文单词)后单击search返回搜索结果,搜索结果以URL的方式反映到浏览器端,并通过超链接跳转到指定网页。

图5测试界面(一)

图6测试界面(二)

5 结束语

本文介绍了一种基于Servlet的搜索引擎,其核心数据结构为索引表和哈希映射。这种搜索引擎具有实现简单,性能优良,维护成本低等特点,尤其适合于中小站点作为站内搜索引擎。虽然索引文件是以文件的型式存储在磁盘上,但是由于缓存的作用使得搜索的过程中大大减少了IO操作,从而提高了效率。此外由于索引管理器的存在,在维护索引文件时,会不断的将新的索引信息加入索引文件以实现索引文件的自我更新。由于缓存索引在数据结构上采用了哈希映射,同时结合了java语言的特点,从而实现了索引信息的延迟加载,大大的提升了站点的整体性能。

参考文献:

[1] 蒋凯,武港山. 基于Web 的信息检索技术综述. 计算机工程, 2005,12:7-9.

[2] David Flanagan. Thinking in Java, Third Edition by Bruce Eckel,2003

[3] Peter Drake. Data Structures and Algorithms in java. 朱剑平,译. 北京:清华大学出版社, 2006

[4] Stephen Asbary. Developing Java Enterprise Applications. 王强,译. 机械工业出版社, 2004

[5] 白胜普. J2EE企业级应用测试实践. 北京:清华大学出版社, 2009.

[6] W Bruce Creeft. 搜索引擎:信息检索实践. 刘挺,译. 机械工业出版社, 2010

[7] Witten I.H. 深入搜索引擎.电子工业出版社, 2009

[8] Jaimie Sirovich. 搜索引擎优化高级编程. 邓少d,.译. 北京:清华大学出版社, 2009

上一篇:浅析中俄能源外交的开展对两国的影响 下一篇:基于Delphi7.0的学生档案管理系统设计与实现