基于JAVA语言的搜索引擎开发论文.doc_第1页
基于JAVA语言的搜索引擎开发论文.doc_第2页
基于JAVA语言的搜索引擎开发论文.doc_第3页
基于JAVA语言的搜索引擎开发论文.doc_第4页
基于JAVA语言的搜索引擎开发论文.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于JAVA语言的搜索引擎开发摘 要:随着计算机和网络技术的发展与普及,如何在较短的时间内从海量的网络数据中搜索全面且准确的信息成为人们越来越关注的问题。搜索引擎的出现为人们在网络中查找信息提供了极大的方便。因此,网络搜索引擎的开发及相关技术的研究有着重要的意义。本毕业设计利用JAVA语言开发了一个基于机器人和全文索引技术的网络搜索引擎。该搜索引擎能根据输入的关键字查询所需要网页连接,能较好地完成一般的搜索任务。本文在介绍网络搜索引擎开发相关技术的基础上,详细阐述了本次毕业设计所完成的基于机器人和全文索引技术的搜索引擎的开发过程。关键词:JAVA;搜索引擎;机器人Development of Search Engines Based on Java Language Abstract: With the development and universality of computer and network technology, how to search the comprehensive and accurate information from mass network data in a short time which become a serious problem that many people pay attention to. Therefore, it is important to develop network search engine and study it s technology. This paper develops a network search engine with JAVA which based on robot and full text index technology. Using this system, you can search the website which you want, when you entered the keywords. Also, it can fulfill the duty of search. According to the introduction of the development technology of network search engine, this paper carries on a detailed description to the development and process of search engine which based on robot and full text index technology. Key Words: JAVA; Search engine; Robot1. 引言随着社会的不断进步和信息科学技术的迅速发展,网络上的信息资源越来越多,信息更新速度也日益提高。公用数据库的飞速发展为用户查询各种信息提供了可能。网络搜索引擎也应运而生。网络搜索引擎的使用为人们的网络生活带来了无比的便捷和方便,为网络信息的爆炸式发展提供了条件。正因为如此,网络编程语言以及网络搜索引擎开发技术得以快速地发展。设计搜索引擎是为了在非常短的时间内搜索全面并且准确的信息。传统信息检索系统的性能参数召回率和精度同样可以衡量一个搜索引擎的性能。召回率是检索出的相关文档数和文档库中所有的相关文档数的比率,它用于衡量检索系统(搜索引擎)的查全率;精度是检索出的相关文档数与检索出的文档总数的比率,用于衡量检索系统(搜索引擎)的查准率。对于一个检索系统来讲,召回率和精度不可能两全其美:召回率高时,精度低;精度高时,召回率低。因为没有一个搜索引擎系统能够搜集到所有的WEB网页,所以召回率很难计算。对于网民来说,互联网上的信息不是不够,而是“过剩”,如何精确查找到信息是大家所关心的问题。因此,目前的搜索引擎系统都非常关心精度。目前,国内外比较有名的网络搜索引擎主要有:搜狐()、天网(:8000/gbindex.htm)、新浪()、悠游()、搜索客()、茉莉之窗()和蕃薯藤(http:/.tw)等等。现有的这些网络搜索引擎存在一些不足,比如:大多数中文搜索引擎的查询方式较为单一、采用的开发技术比较落后等。近年来国内外出现了一批开发搜索引擎的新技术,如机器人技术、中文文本的过滤信息分流机制、分词技术与XML技术的有机结合等。2. 网络搜索引擎相关技术2.1 机器人技术2.1.1机器人搜索引擎的起源世界上第一个用于监测互联网发展规模的“机器人”程序是Matthew Gray开发的World wide Web Wanderer。刚开始它只用来统计互联网上的服务器数量,后来发展为检索网站域名。与Wanderer相对应,Martin Koster于1993年10月创建了ALIWEB,它是Archie的HTTP版本。ALIWEB不使用“机器人”程序,而是靠网站主动提交信息来建立自己的链接索引,类似于现在我们熟知的Yahoo。随着互联网的迅速发展,使得检索所有新出现的网页变得越来越困难,因此,在Matthew Gray的Wanderer基础上,一些编程者将传统的“蜘蛛”程序工作原理作了些改进。其设想是,既然所有网页都可能有连向其他网站的链接,那么从跟踪一个网站的链接开始,就有可能检索整个互联网。到1993年底,一些基于此原理的搜索引擎开始纷纷涌现,其中以JumpStation、The World Wide Web Worm(Goto的前身,也就是今天Overture),和Repository-Based Software Engineering (RBSE) spider最负盛名。然而JumpStation和WWW Worm只是以搜索工具在数据库中找到匹配信息的先后次序排列搜索结果,因此毫无信息关联度可言。而RBSE是第一个在搜索结果排列中引入关键字串匹配程度概念的引擎。最早现代意义上的搜索引擎出现于1994年7月。当时Michael Mauldin将John Leavitt的蜘蛛程序接入到其索引程序中,创建了大家现在熟知的Lycos。同年4月,斯坦福(Stanford)大学的两名博士生,David Filo和美籍华人杨致远(Gerry Yang)共同创办了超级目录索引Yahoo,并成功地使搜索引擎的概念深入人心。从此搜索引擎进入了高速发展时期。目前,互联网上有名有姓的搜索引擎已达数百家,其检索的信息量也与从前不可同日而语。比如最近风头正劲的Google,其数据库中存放的网页已达30亿之巨!机器人搜索引擎,是一种全文搜索引擎,是由一种叫“蜘蛛”的计算机程序在网络中爬行,依据一定的网络协议在互联网中发现、加工、整理信息,并为用户提供检索服务。其优点是信息量大,耗费资源少,缺点是精确度不高。从国外搜索引擎的发展趋势来看,将人工发现信息并依靠编目员的知识分类与机器人搜索引擎二者融合,优缺互补,以便提高智能化程度和准确度。电脑“机器人”(Computer Robot)是指能以人类无法达到的速度不间断地执行某项任务的软件程序。由于专门用于检索信息的“机器人”程序像蜘蛛一样在网络间爬来爬去,以实现对目标信息的检索。2.1.2 机器人搜索引擎核心思想在网站建设过程中,网站内容总是按一定的目录层次组织的,如果在蜘蛛程序获取页面的过程中,同时获取网页所属的网站目录层次信息;在返回用户的查询结果时,结果集按此目录层次信息组织,用户可以通过选择感兴趣目录缩小结果集,提高浏览效率(browseability)。由于当前搜索引擎是平坦(flat)的返回结果集,结果集一般很大,所以用户往往不会看到后面的结果。采用上面的方法,能很好的解决这个问题,提高搜索引擎的服务质量和满意度。2.1.3 机器人搜索引擎实现方案(1) 网站目录信息的提取为了方便用户浏览,网页中一般都设有导航栏,导航栏是按层次组织的。导航栏的各项一般为某种分类方式下的一个类别。所以,根据导航栏的层次,我们可以提取出网站的层次目录信息。由于html语法的不严格性,同样的视觉内容,可能会有不同的html源文件形式。在加上不同风格下,导航栏所处位置不同,所以如何准确的确定导航栏对应的html源文件,从而进一步分析是问题的关键。目前,从给的页面html源文件中,确定导航栏部分的方法有两种:l基于页面分块确定导航栏。这种方法的优点是通用性好,能方便的适应多种网站风格。缺点是处理量较大,且涉及数据库操作过多。l基于标签定位导航栏。这种方法是基于当前较为规范的中文网页,基本满足一下几个假设而做的:a)导航栏包含在一个内层中(即这个table中不再嵌套table),并且此table的width值不少于500(只适用于上方导航栏);b)导航栏所含超链接不少于五个;c)导航栏中各项的显示字符不能过长;d)导航栏中的超链接项大部分为站内链接;e)导航栏中的超链接项中,大部分链接的层次不能太深,并且不含query。f)在一网页中,根网站组织目录层次相关的导航栏只有一个,从而在网页中,只需找到一个导航栏即可。将以上假设作为过滤条件,一般可以准确的找出规范网站的导航栏及层次,从而确定目录层次。这种方法的优点是快速,逻辑简单。缺点是适用风格单一,当网站风格变化后,将不再适用。所以,我们在两种方式中动态变化,从而达到效率和通用性的统一。(2)页面所属目录层次的确定在分析页面新链接时,把本页url作为这些新链接的父亲,在页面库中记录下来。每个页面最多有三个父亲节点,所以可记录三个father。分析页面所属类别时,父亲属于网站目录层次的最下端目录,就是该页所属的目录。(目前成功运行的蜘蛛只记录了一个父亲,这种实现方式有待讨论)。2.1.4 机器人搜索引擎流程说明(1)进入一个网站时,我们默认第一次处理的页面为网站首页,如果不是,则经过相应的处理得到首页url,并从该url开始处理。(2)在当前页面中,找到导航栏,并把其中的项目作为网站的栏目,栏目级别初始时为0,向下递增(目前可准确确定0、1两级栏目,基本正确的确定0、2、3三级栏目)。栏目信息写入栏目库。(3)分析当前页面,提取内容,写入页面库;提取页面中的所有超链接,将未遇到的链接放入待处理对列。对已经遇见过的链接,在网页库中,以当前页面url更新其该链接对应项的father。(4)判断待处理队列是否空,空则程序结束。否则取出队列中首部url。(5)当前url是否为栏目项,并且该栏目的级别在我们欲找级别内。是则转向(2);否则转向(3)。2.2 Lucene全文索引技术网络机器人将遍历得到的页面存放在临时数据库中,如果通过SQL直接查询信息速度将会难以忍受。为了提高检索效率,需要建立索引,按照倒排文件的格式存放。如果索引不及时更新的话,用户用搜索引擎也不能检索到。也正因为如此,在代码中引入Lucene全文索引。2.2.1 Lucene全文索引的起源Lucene的贡献者Doug Cutting是一位资深的全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。Lucene是Jakarta Apache的开源项目。它是一个用Java写的全文索引引擎工具包,可以方便的嵌入到各种应用中,实现针对应用的全文索引/检索功能。Lucene最核心的特征是通过特殊的索引结构实现传统数据库不擅长的全文索引机制,并提供了扩展接口,以方便针对不同应用的定制。2.2.2 Lucene全文索引的实现机制 Lucene的API接口设计比较通用,输入输出结构都很像数据库的表=记录=字段,所以很多传统的应用文件、数据库等都可以比较方便的映射到Lucene的存储结构和接口中。而表2.1中是Lucene和数据库的比较:表 2.1 Lucene和数据库的比较Lucene数据库索引数据源:doc(field1,field2.) doc(field1,field2.) indexer / _ | Lucene Index| - / searcher 结果输出:Hits(doc(field1,field2) doc(field1.) 索引数据源:record(field1,field2.) record(field1.) SQL: insert/ _ | DB Index | - / SQL: select 结果输出:results(record(field1,field2.) record(field1.)Document:一个需要进行索引的“单元”一个Document由多个字段组成Record:记录,包含多个字段Field:字段Field:字段Hits:查询结果集,由匹配的Document组成RecordSet:查询结果集,由多个Record组成建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个已排好序的关键词列表,用于存储关键词=文章映射关系,利用这样的映射关系索引:关键词=出现关键词的文章编号,出现次数(甚至包括位置:起始偏移量,结束偏移量),出现频率,检索过程就是把模糊查询变成多个可以利用索引进行精确查询的逻辑组合过程。从而大大提高了关键词查询的效率。在运行时,不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些新的小索引文件合并到原先的大索引中(针对不同的更新策略,批次的大小可以调整),这样在不影响检索的效率的前提下,提高了索引的效率。而下表2.2表示的正是Lucene全文索引与其他开源全文检索系统在各个方面的比较:表 2.2 Lucene全文索引与其他开源全文检索系统在各个方面的比较Lucene其他开源全文检索系统增量索引和批量索引可以进行增量的索引(Append),可以对于大量数据进行批量索引,并且接口设计用于优化批量索引和小批量的增量索引。很多系统只支持批量的索引,有时数据源有一点增加也需要重建索引。数据源Lucene没有定义具体的数据源,而是一个文档的结构,因此可以非常灵活的适应各种应用(只要前端有合适的转换器把数据源转换成相应结构),很多系统只针对网页,缺乏其他格式文档的灵活性。索引内容抓取Lucene的文档是由多个字段组成的,甚至可以控制那些字段需要进行索引,那些字段不需要索引,近一步索引的字段也分为需要分词和不需要分词的类型: 需要进行分词的索引,比如:标题,文章内容字段 不需要进行分词的索引,比如:作者/日期字段缺乏通用性,往往将文档整个索引了语言分析通过语言分析器的不同扩展实现:可以过滤掉不需要的词:an the of 等,西文语法分析:将jumps jumped jumper都归结成jump进行索引/检索非英文支持:对亚洲语言,阿了伯语言的索引支持缺乏通用接口实现查询分析通过查询分析接口的实现,可以定制自己的查询语法规则:比如: 多个关键词之间的 + - and or关系等并发访问能够支持多用户的使用2.2.3 Lucene的使用lucene的组成结构:对于外部应用来说索引模块(index)和检索模块(search)是主要的外部应用入口。几个常见的lucene的外部应用入口如表2.3所示:表 2.3 常见的lucene的外部应用入口org.apache.Lucene.search/搜索入口org.apache.Lucene.index/索引入口org.apache.Lucene.analysis/语言分析器org.apache.Lucene.queryParser/查询分析器org.apache.Lucene.document/存储结构org.apache.Lucene.store/底层IO/存储结构org.apache.Lucene.util/一些公用的数据结构其中: 语言分析器提供了抽象的接口,因此语言分析(Analyser)是可以定制的,虽然lucene缺省提供了2个比较通用的分析器SimpleAnalyser和StandardAnalyser,这2个分析器缺省都不支持中文,所以要加入对中文语言的切分规则,需要修改这2个分析器。 Lucene并没有规定数据源的格式,只提供了一个通用的结构(Document对象)来接受索引的输入,因此输入的数据源可以是:数据库,WORD文档,PDF文档,HTML文档只要能够设计相应的解析转换器将数据源构造成Docuement对象即可进行索引。 对于大批量的数据索引,还可以通过调整IndexerWrite的文件合并频率属性(mergeFactor)来提高批量索引的效率。2.2.4 Lucene输入输出接口虽然lucene没有定义一个确定的输入文档格式,但越来越多的人想到使用一个标准的中间格式作为Lucene的数据导入接口,然后将其他数据,比如PDF只需要通过解析器转换成标准的中间格式就可以进行数据索引了。这个中间格式主要以XML为主,类似实现已经不下4,5个,图3.1所示就是5个Lucene的数据导入接口实现:数据源: WORD PDF HTML DB other | | | / XML中间格式 | Lucene INDEX图 3.1 Lucene的数据导入接口2.2.5 索引过程优化索引一般分2种情况,一种是小批量的索引扩展,一种是大批量的索引重建。在索引过程中,并不是每次新的DOC加入进去索引都重新进行一次索引文件的写入操作(文件I/O是一件非常消耗资源的事情)。 Lucene先在内存中进行索引操作,并根据一定的批量进行文件的写入。这个批次的间隔越大,文件的写入次数越少,但占用内存会很多。反之占用内存少,但文件IO操作频繁,索引速度会很慢。在IndexWriter中有一MERGE_FACTOR参数可以帮助你在构造索引器后根据应用环境的情况充分利用内存减少文件的操作。根据我的使用经验:缺省Indexer是每20条记录索引后写入一次,每当MERGE_FACTOR增加50倍,索引速度可以提高1倍左右。2.2.6 搜索过程优化Lucene面向全文检索的优化在于首次索引检索后,并不把所有的记录(Document)具体内容读取出来,而只将所有结果中匹配度最高的头100条结果(TopDocs)的ID放到结果集缓存中并返回,这里可以比较一下数据库检索:如果是一个10,000条的数据库检索结果集,数据库是一定要把所有记录内容都取得以后再开始返回给应用结果集的。所以即使检索匹配总数很多,Lucene的结果集占用的内存空间也不会很多。对于一般的模糊检索应用是用不到这么多的结果的,头100条已经可以满足90%以上的检索需求。如果首批缓存结果数用完后还要读取更后面的结果时Searcher会再次检索并生成一个比上次的搜索缓存数大1倍的缓存,再重新向后抓取。所以如果构造一个Searcher去查1120条结果,Searcher其实是进行了2次搜索过程:头100条取完后,缓存结果用完,Searcher重新检索,再构造一个200条的结果缓存,依此类推,400条缓存,800条缓存。由于每次Searcher对象消失后,这些缓存也就访问不到了,你有可能想将结果记录缓存下来,缓存数尽量保证在100以下以充分利用首次的结果缓存,不让Lucene浪费多次检索,而且可以分级进行结果缓存。Lucene的另外一个特点是在收集结果的过程中将匹配度低的结果自动过滤掉了。这也是和数据库应用中需要将搜索的结果全部返回不同之处。3. 开发环境 信息技术的不断发展,特别是互联网应用的迅速普及,深入到了人们生活的各个方面,改变了人们的生活方式和思维方式,方便了全球信息资源共享。全球目前的网页超过100亿,每天新增加数百万网页,电子信息爆炸似的丰富起来。要在如此浩瀚的海洋里寻找信息,就像“大海捞针”一样。能有一种工具使我们可以在不到1秒钟的时间就迅速找到我们想要的内容吗?答案是“有”,这就是搜索引擎。今天,搜索引擎已成为人们在网络信息海洋中自如冲浪必不可少的利器。而随着网络技术的进步,网络编程语言的开发以及进步,给网络搜索引擎的开发提供了前提条件。网络信息量的集聚增加,寻找有用信息难度的大幅度增加,成为网络搜索引擎的开发原因。3.1 网络编程语言JAVAJAVA语言自从诞生以来,以其平台无关性,面向对象,多线程,半编译半解释等特点而成为网络时代的编程语言。Java是一种简单的,面向对象的,分布式的,解释的,健壮的,安全的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言。正是因为这些原因,JAVA语言无可厚非成为最优秀的网络编程语言,正因为如此,我选JAVA语言作为我开发网络搜索引擎的工具。本课题所使用的网络编程语言均为JAVA。3.1.1 Java的特点(1) 平台无关性平台无关性是指Java能运行于不同的平台。Java引进虚拟机原理,并运行于虚拟机,实现于不同平台的Java接口之间。使用Java编写的程序能在世界范围内共享。Java的数据类型与机器无关,Java虚拟机(Java Virtual Machine)是建立在硬件和操作系统之上,实现Java二进制代码的解释执行功能,提供于不同平台的接口的。(2) 安全性Java的编程类似C+,学习过C+的读者将很快掌握Java的精髓。Java舍弃了C+的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针侵入系统。Java对程序提供了安全管理器,防止程序的非法访问。(3) 面向对象Java 吸取了C+面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁性和便于维护性。类的封装性、继承性等有关对象的特性,使程序代码只需一次编译,然后通过上述特性反复利用。程序员只需把主要精力用在类和接口的设计和应用上。Java提供了众多的一般对象的类,通过继承即可使用父类的方法。在 Java中,类的继承关系是单一的非多重的,一个子类只有一个父类,子类的父类又有一个父类。Java 提供的 Object 类及其子类的继承关系如同一棵倒立的树形,根类为Object 类, Object 类功能强大,经常会使用到它及其它派生的子类。(4) 分布式Java建立在扩展TCP/IP网络平台上。库函数提供了用HTTP和FTP协议传送和接受信息的方法。这使得程序员使用网络上的文件和使用本机文件一样容易。(5) 健壮性Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自已操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能。这些功能特征大大提高了开发Java应用程序的周期。Java提供:Null指针检测、数组边界检测、异常出口、Byte code校验。3.2 JDK JDK,全名Java Developers Kit,是开发JAVA的SUN公司的JAVA语言的基本工具包,是个免费开发运行JAVA程序的基本软件,由一个标准类库和一组编译工具所建立,测试及建立文档的Java实用程序组成。其核心Java API是一些预定义的类库,开发人员需要用这些类来访问Java语言的功能。Java API包括一些重要的语言结构以及基本图形,网络和文件I/O。一般来说,Java API的非I/O部分对于运行Java的所有平台是相同的,而I/O部分则仅在通用Java环境中实现,是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),很多Java工具和Java基础的类库(rt.jar)。该软件可以从网站免费下载。不论什么Java应用服务器实质都是内置了某个版本的JDK。除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端的运行效率也要比Sun JDK好很多。JDK为编程人员提供了JAVA基础类库(JFC),JFC包含很多包,在每个包中都有若干个特定功能和相互关系的类和接口。作为JDK实用程序,工具库中有七种主要程序。 Javac:Java编译器,将Java源代码转换成字节码。 Java:Java解释器,直接从类文件执行Java应用程序字节代码。 appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 Javadoc:根据Java源码及说明语句生成HTML文档。 Jdb:Java调试器,可以逐行执行程序,设置断点和检查变量。 Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。 Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。3.3 TOMCAT Tomcat是Sun的JSWDK(JavaServer Web Development Kit)中Servlet的运行环境(servlet容器)。Tomcat的源代码被提供给Jakarta项目,在Open Source的模型下进行进一步的开发。Tomcat是一个Server容器,同样的,EJB运行在EJB的容器中。tomcat就是webserver,可以作为上面说的服务器端的服务软件,用于接收来自客户端的请求,并做出相应的处理,然后再返回结果到客户端。我们可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应对HTML页面的访问请求。实际上tomcat部分是apache服务器的扩展,但它是独立运行的,所以当你运行tomcat时,它实际上作为一个与apache独立的进程单独运行的。 这里的诀窍是,当配置正确时,Apache为.html页面服务,而tomcat实际上运行.jsp页面和servlet。4. 搜索引擎开发本毕业设计的网络搜索引擎由com、edu、text三个部分组成,这三个部分相对独立,又通过不同的类/接口完成各自功能的连接,最后成为一个整体,以完成该搜索引擎的主要功能。4.1 搜索引擎使用的类/接口 在JAVA编程中经常要使用各式各样的类/接口,它们是JAVA程序的连接和实现的主要方法,下图4.1为该搜索引擎的主要的类/接口的关系图:图 4.1 主要的类/接口的关系图由上图可以看出,该搜索引擎的核心由程序的入口MAIN函数;Searcher类利用Spider类的方法搜索网络的链接,并回调自己实现的方法processPage(HTTP http),来处理搜索到的页面内容,并利用HTMLParser对象分析链接所对应的页面,HTMLParesr对象将页面中的所有连接信息分别用Index索引类来保存;当全部链接索引工作任务完成后,调用Searcher的close()方法完成释放资源并生成index文件。4.2 代码实现4.2.1 MAIN函数设计而其中程序的入口MAIN函数所在的类路径为:.rob.framework. Searcher,该部分的代码如下:(1)引入了搜索引擎所需要的类包,以此构造一个机器人程序。package .rob.framework;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import .MalformedURLException;import .URL;import .UnknownHostException;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.index.IndexWriter;import com.heaton.bot.HTTP;import com.heaton.bot.HTTPException;import com.heaton.bot.Log;import com.heaton.bot.HTTPSocket;import com.heaton.bot.ISpiderReportable;import com.heaton.bot.IWorkloadStorable;import com.heaton.bot.Spider;import com.heaton.bot.SpiderInternalWorkload;import com.heaton.bot.*;import .rob.tools.CommonData;(2)定义index索引输出流对象,并完成引入入口MAIN,开始构造机器人程序:public class Searcher implements ISpiderReportable public static IndexWriter _writer = null;/* * Spider 程序入口 Main函数 * param args * throws Exception */public static void main(String args)throws Exception / 创建一个索引输出对象的_writer=new IndexWriter(CommonData.HOMEPATH + Newsindex,new StandardAnalyzer(), true);Searcher _searcher = new Searcher();/设置日志文件的输出路径Log.setPath(./sprilog.log);/设置日志级别Log.setLevel(Log.LOG_LEVEL_NORMAL);Log.setFile(true);Log.setConsole(false);if (args.length != 0) /构建一个搜索工作任务存储队列IWorkloadStorable wl = new SpiderInternalWorkload();/构建一个网络机器人分析器Spider _spider = new Spider(_searcher, args0, new HTTPSocket(),200, wl);/设置分析器保存最大的大小_spider.setMaxBody(200);_spider.start(); else Log.log(Log.LOG_LEVEL_ERROR, Command Console is not Paramters!);/* 发现内部连接时调用,url表示程序发现的URL,若返回true则加入作业中,否则不加入。 */public boolean foundInternalLink(String url) /System.out.println(内部连接:+url);/HTTP _http=new HTTPSocket();/try /_http.send(url,null);/processPage(_http);/ catch (HTTPException e) / catch (UnknownHostException e) / catch (IOException e) /catch(Exception e)/return true;/* 发现外部连接时调用,url表示程序所发现的URL,若返回true则把加入作业中,否则不加入。 */public boolean foundExternalLink(String url) /HTTP _http=new HTTPSocket();/try /_http.send(url,null);/processPage(_http);/ catch (HTTPException e) / catch (UnknownHostException e) / catch (IOException e) /catch(Exception e)/return false;/* 当发现其他连接时调用这个方法。其他连接指的是非HTML网页,可能是E-mail或者FTP */public boolean foundOtherLink(String url) return false;/*用于处理网页,这是Spider程序要完成的实际工作。 */public void processPage(HTTP http) /将搜索到的HTTP对象放入页面解析类(HTMLParser)中去建立索引信息new HTMLParser(http).start();/* * 用来请求一个被处理的网页。 */public void completePage(HTTP http, boolean error) /System.out.println(用来请求一个被处理的网页);/* * 由Spider程序调用以确定查询字符串是否应删除。如果队列中的字符串应当删除,方法返回真。 */public boolean getRemoveQuery() /System.out.println(由Spider程序调用以确定查询字符串是否应删除);return true;/* * 当Spider程序没有剩余的工作时调用这个方法。 */public void spiderComplete() /System.out.println(当Spider程序没有剩余的工作时调用这个方法);try close(); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();/* 优化并且清理资源 * throws java.lang.Exception */public static void close() throws Exception _writer.optimize();_writer.close();至此为止,MAIN函数的引入就完成了。4.2.2 Searcher类实现接口实现下面介绍利用Searcher类实现com.heaton.bot. ISpiderReportable接口的方法。其基本过程是利用Spider类的方法搜索网络的链接,并回调已实现的方法processPage(HTTP http),来处理搜索到的页面内容,并利用HTMLParser对象分析链接所对应得页面。HTMLParesr对象将页面中的所有连接信息分别用Index索引类来保存。该部分的代码如下:(1) 引入相应的类包:package .rob.framework;import java.util.Iterator;import java.util.Vector;import com.heaton.bot.HTMLPage;import com.heaton.bot.Log;import com.heaton.bot.HTTP;import com.heaton.bot.Link;(2)解析HTML页面: public class HTMLParserHTTP _http = null;public HTMLParser(HTTP http) _http = http;(3)对Web页面进行解析后建立索引:public void start() try /构建一个HTML页面对象.HTMLPage _page = new HTMLPage(_http);/测试打开HTTP链接,得到页面信息_page.open(_http.getURL(), null);/获得页面中所有的超链接列表数据.Vector _links = _page.getLinks();/构建一个索引对象Index _index = new Index();/构建一个页面连接的迭代器Iterator _it = _links.iterator();while (_it.hasNext() /得到迭代器中的超链接对象Link _link = (Link) _it.next();/得到连接对象中的 href 属性值.()String _herf = input(_link.getHREF().trim();/得到连接对象的显示内容(abc)String _title = input(_link.getPrompt().trim();/将得到的信息放入索引对象中_index.AddNews(_herf, _title);/_index.close();catch (Exception ex) Log.logException(HTMLParser:Catch Exception,ex);public static String input(String str) String temp = null;if (str != null) try temp = new String(str.getBytes(GBK);catch (Exception e) Log.logException(HTMLParser:Catch Exception,e);return temp;4.2.3 index文件的生成最后的核心部分完成的功能是当全部链接索引工作任务完成后,调用Searcher的close()方法完成释放资源并生成index文件。代码如下:(1)相应类包的引入:package .rob.framework;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.Reader;import java.io.StringReader;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.do

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论