课程设计(论文)-基于Lucene的站内搜索引擎的设计与实现.doc_第1页
课程设计(论文)-基于Lucene的站内搜索引擎的设计与实现.doc_第2页
课程设计(论文)-基于Lucene的站内搜索引擎的设计与实现.doc_第3页
课程设计(论文)-基于Lucene的站内搜索引擎的设计与实现.doc_第4页
课程设计(论文)-基于Lucene的站内搜索引擎的设计与实现.doc_第5页
免费预览已结束,剩余31页可下载查看

下载本文档

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

文档简介

软件分院2009级 5班 课程设计课程名称:基于lucene的站内搜索引擎的设计与实现 姓名: 学号: 分院:软件分院 2011年10月项目评分标准评分等级得分平时成绩(20%)态度端正,设计认真,能积极思考,学习纪录好优秀态度较好,较认真,能积极思考学习纪录较好良好态度一般,学习纪录尚可中等态度较差,不够认真,不善于思考纪录较差及格态度差,不认真,纪录差不及格程序设计成绩(40%)程序代码规范,完成所有功能,代码质量高优秀程序代码较规范,完成主要功能,代码质量一般。良好程序代码基本规范,完成部分功能,代码质量较差及格程序代码不规范,完成功能少,代码质量差不及格设计报告成绩(40%)撰写规范,设计思路清晰,知识运用熟练,设计详尽细致,按要求完成设计优秀撰写较规范,设计思路基本清晰,知识运用较熟练,能按要求完成设计良好撰写基本规范,设计思路基本清晰,知识运用尚可,能按要求完成设计中等撰写不规范,设计思路不太清晰,设计不详尽,基本完成设计及格撰写不规范,思路不清晰,知识运用不熟练。没有按要求完成设计不及格总评成绩指导老师:摘 要在互联网蓬勃发展的今天,互联网上的信息更是浩如烟海。人们在享受互联网带来的便利的同时,却面临着一个如何在如此海量的内容中准确、快捷地找到自己所需要的信息的问题,由此互联网搜索引擎应运而生。关键词:搜索引擎;中文分词;索引3the construction of search engine based on lucene and heritrixabstractthe contents on the web are increasing exponentially as the rapid development of the internet. a problem how to obtain the useful information from vast contents quickly and accurately is facing us while people are enjoying the convenience of the internet. the solver of this problem is web search engine.key words:search engine;chinese word segmentation;index2目 录摘 要iabstractii1 绪论11.1 项目背景11.2 国内外发展现状12 系统的开发平台及相关技术32.1 系统开发平台32.2 系统开发技术32.2.1 lucene技术简介42.2.2 ajax技术简介43 系统分析与设计63.1 系统需求分析63.1.1 系统架构分析63.1.2 系统用例模型63.1.3 系统领域模型103.2 系统概要设计113.3 系统详细设计123.3.1 索引建立子系统133.3.2 用户接口子系统174 系统的实现184.1 系统包框架的构建184.1.1 索引建立子系统184.1.2 用户接口子系统194.2 系统主要功能实现194.2.1 索引建立子系统194.2.2 用户接口子系统224.3 功能模块代码的实现.23 4.3.1 索引的实现.23 4.3.2 搜索的实现.25 4.3.3 排序的实现.25 4.3.4 翻页的实现.27结 论28参 考 文 献29致 谢301 绪论1.1 项目背景1994年左右,万维网(world wide web)出现了。它的开放性和其上信息广泛的可访问性极大的激励了人们创作的积极性。在短短的十几年间,人类至少在万维网上发布了40亿条的网页,并且现在每天都有数以万计的数量增长。由于网络上的资源与生俱来的数字化、网络化,这些特性成为了网络信息的双刃剑:一方面便于我们搜集整理,另一方面也会使我们感到太多蜂拥而至,无所适从。而搜索引擎的由来要追溯到1990年加拿大的麦吉尔大学,麦吉尔大学的师生为了在分散在ftp资源上找到所需的东西,他们开发了软件archie。它通过定期搜索并分析ftp系统中存在的文件名信息,提供查找分布在各个ftp主机中文件的服务。当web风靡全球之后,以web网页为对象的搜索引擎检索系统产生了。成为人们上网找寻信息的重要手段,通过搜索引擎系统人们可以在浩如烟海的网络中瞬间找到想要找到的信息,并且搜索引擎的智能以及现在网页的特性使得人们只要输入相关的词语就可以找到直接相关的信息。现今,google的巨大成功让整个世界都把眼光投入到搜索引擎这个领域中。仿佛一夜间,各种各样的搜索服务席卷而来。从最初的google、yahoo到现今的baidu、msn、中搜、sogou等,搜索引擎的品牌愈来愈多,服务也越来越丰富。同时,伴随着web2.0的普及,网络信息的膨胀速度呈指数急速增长,各种各样的网站都需要为其加入检索功能,以满足用户的需要。另外,在企业级应用的市场上,全文信息检索的需求也一直在增加,各种文档处理、内容管理软件都需要键入全文检索的功能。在这种背景下,搜索引擎的技术迅速发展。各种讨论搜索的文章、杂志、论文铺天盖地,论坛和博客上也有许多相关帖子。一时间,搜索引擎技术成为最热门的技术之一。1.2 国内外发展现状网页是因特网的最主要的组成部份,也是人们获取网络信息的最主要的来源,为了方便人们在大量繁杂的网页中找寻自己需要的信息,这类检索工具发展的最快。一般认为,基于网页的信息检索工具主要有网页搜索引擎和网络分类目录两种。网页搜索引擎是通过“网络蜘蛛”等网页自动搜寻软件搜索到网页,然后自动给网页上的某些或全部字符做上索引,形成目标摘要格式文件以及网络可访问的数据库,供人们检索网络信息的检索工具。网络目录则是和搜索引擎完全不同,它不会将整个网络中每个网站的所有页面都放进去,而是由专业人员谨慎地选择网站的首页,将其放入相应的类目中。网络目录的信息量要比搜索引擎少得多,再加上不同的网络目录分类标准有些混乱,不便人们使用,因此虽然它标引质量比较高,利用它的人还是要比利用搜索引擎的人少的多。但是由于网络信息的复杂性和网络检索技术的限制,这类检索工具也有着明显的不足:(1) 随着网页数量的迅猛增加,人工无法对其进行有效的分类、索引和利用。网络用户面对的是数量巨大的未组织信息,简单的关键词搜索,返回的信息数量之大,让用户无法承受。(2) 信息有用性评价困难。一些站点在网页中大量重复某些关键字,使得容易被某些著名的搜索引擎选中,以期借此提高站点的地位,但事实上却可能没有提供任何对用户有价值的信息。(3) 网络信息日新月异的变更,人们总是期望挑出最新的信息。然而网络信息时刻变动,实时搜索几乎不可能,就是刚刚浏览过的网页,也随时都有更新、过期、删除的可能。网络信息检索工具的发展主要体现在进一步改进、完善检索工具和检索技术,以提高检索服务质量,改变网络信息检索不尽如意的地方。2 系统的开发平台及相关技术该系统开发需要j2ee和j2se相关技术,开发平台要求合理、方便、快捷,开发环境的选取至关重要,当选取一种相对合理的开发平台时,会提高系统开发效率,并遵循以最低的消耗完成最有价值的工程这一原则。2.1 系统开发平台本系统的开发平台如下表2.1所示:表2.1 系统开发平台配置名称平台系统开发操作系统:windows xp中文版系统开发数据库系统:sql server2000 个人版sp3系统开发前台页面设计:macromedia dreamweaver8.0j2ee服务端引擎:tomcat6.0范围系统集成开发工具:myeclipse5.5.1gajava运行环境:jdk1.6.0_032.2 系统开发技术2.2.1 lucene技术简介lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。面对已经存在的商业全文检索引擎,lucene也具有相当的优势。首先,它的开发源代码发行方式,在此基础上程序员不仅仅可以充分的利用lucene所提供的强大功能,而且可以深入细致的学习到全文检索引擎制作技术和面相对象编程的实践,进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上,商业软件的灵活性远远不及lucene。其次,lucene秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在lucene的基础上扩充各种功能,比如扩充中文处理能力,从文本扩充到html、pdf等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于lucene恰当合理的对系统设备做了程序上的抽象,扩展的功能也能轻易的达到跨平台的能力。最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能。最后,虽然lucene使用java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现,在遵守lucene索引文件格式的基础上,使得lucene能够运行在各种各样的平台上,系统管理员可以根据当前的平台适合的语言来合理的选择。2.2.2 ajax技术简介(1) ajax(asynchronous javascript + xml)的定义 基于web标准(standards-based presentation)xhtml+css的表示; 使用 dom(document object model)进行动态显示及交互; 使用 xml 和 xslt 进行数据交换及相关操作; 使用 xmlhttprequest 进行异步数据查询、检索; 使用 javascript 将所有的东西绑定在一起。(2) ajax核心ajax的核心是javascript对象xmlhttprequest。该对象在internet explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,xmlhttprequest使您可以使用javascript向服务器提出请求并处理响应,而不阻塞用户。(3) 使用ajax可以完成的功能在创建web站点时,在客户端执行屏幕更新为用户提供了很大的灵活性。下面是使用ajax可以完成的功能: 动态更新购物车的物品总数,无需用户单击update并等待服务器重新发送整个页面。 提升站点的性能,这是通过减少从服务器下载的数据量而实现的。例如,在某购物车页面,当更新篮子中的一项物品的数量时,会重新载入整个页面,这必须下载整个页面的数据。如果使用ajax计算新的总量,服务器只会返回新的总量值,因此所需的带宽仅为原来的百分之一。消除了每次用户输入时的页面刷新。例如,在ajax中,如果用户在分页列表上单击next,则服务器数据只刷新列表而不是整个页面。 直接编辑表格数据,而不是要求用户导航到新的页面来编辑数据。对于ajax,当用户单击edit时,可以将静态表格刷新为内容可编辑的表格。用户单击done之后,就可以发出一个ajax请求来更新服务器,并刷新表格,使其包含静态、只读的数据。(4) ajax的工作原理ajax的工作原理相当于在用户和服务器之间加了个中间层,使用户操作与服务器响应异步化。这样把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约isp的空间及带宽租用成本的目的。3 系统分析与设计3.1 系统需求分析3.1.1 系统架构分析(1) 系统定位系统定位为用于网页、影视和图片的搜索。(2) 系统结构系统总体包括三大系统模块:网络爬虫、索引建立子系统和用户接口子系统。如图3.1所示。图3.1 系统结构图 网络爬虫的主要任务是从目标源定时抓取信息资源,比如图片、网页等。 索引建立子系统主要任务是根据网络爬虫抓取的资源进行分析、正文抽取,利用分词器将提取的资源进行分词、倒排建立索引。 用户接口子系统的主要任务是为用户提供可搜索接口,用户通过web界面输入词条,向服务器发出请求,服务器经过简单处理将处理后的词条传递给搜索器,再以xml格式传给客户端,客户端利用xmlhttprequest来接受数据,将数据处理显示给用户。3.1.2 系统用例模型系统涉及的角色有用户和后台维护人员,用户主要的场景有对想要的信息进行搜索,而后台维护人员的主要场景有抓取资源、维护资源、建立索引、维护索引和维护日志等,以下是对两个角色的部分用例场景的分析:(1) 详述用例:用户进行影视搜索主要参与者:用户相关人员及兴趣:用户希望系统能很好的理解自己的意思,并能准确快速的返回自己想要的信息。维护人员希望系统能够运作良好,尽量快速的给出用户解决方案。前置条件:用户可以与服务器良好连接,服务器状态良好主要成功场景: 用户进入web界面,输入想要搜索的词 用户在下拉列表中选择影视 用户点击搜索按钮,提交请求 系统进行分析处理,并搜索结果 系统返回并显示结果 用户退出扩展: 用户没有输入信息没有错误提示信息,仍然停留在本页面。 用户输入空格或制表符没有错误提示信息,刷新页面。 用户没有选择影视系统返回当前选择类型的信息。 系统失去连接或崩溃系统提示连接超时用户等待系统响应,直到恢复正常 系统崩溃返回错误信息,提示用户系统出现故障,用户退出(2) 详述用例:后台维护人员建立索引主要参与者:维护人员相关人员及其兴趣:维护人员希望系统能快速方便的完成建立索引任务,并能产生日志,以便维护。前置条件:维护人员有可利用资源主要成功场景: 维护人员整理可利用资源,打开索引建立子系统 维护人员在配置文件中修改资源目录 配置运行时参数后,点击建立索引 系统产生索引文件并产生日志用例场景已经分析出来,下一个阶段是利用用例画出用例图。这样更加直观显示出参与者与系统的交互流程。用例图如图3.2所示。用例图表述如下:(1) 用户进行影视搜索用例产生的用例图系统外参与者为用户,系统事件包括用户选取类型,搜索信息和资源链接。(2) 后台维护人员进行资源抓取用例产生的用例图系统参与者是后台维护人员,系统事件包括定制抓取任务,抓取资源,在抓取资源的过程中涉及到的是外部资源持有者。(3) 后台维护人员建立索引用例产生的用例图主要参与者为后台维护人员,系统事件包括资源预处理、规范化、噪音过滤、正文抽取、索引建立、日志建立和索引维护。图3.2 部分用例语境图详述用例和用例图已经完成分析,接下来是根据用例来画出系统顺序图。系统顺序图将系统视为黑盒,注重的是参与者与系统之间的交互过程,对用例场景进行分析如下:(1) 用户进行影视搜索用例中用户和soba系统其实就是用户和用户接口子系统的交互,主体为用户和接口子系统,系统顺序图如图3.3所示。图3.3 用户与系统交互的系统顺序图(2) 后台维护人员进行资源抓取用例的主体是后台维护人员和heritrix爬虫子系统,两者交互过程如图3.4所示。图3.4 维护人员与网络爬虫交互的系统顺序图(3) 后台维护人员建立索引用例的主体是后台维护人员和索引建立子系统,两者交互过程如图3.5所示。图3.5 维护人员与索引建立子系统交互系统顺序图系统顺序图已经绘制出来,经过分析得出了系统和外部参与者的交互过程,大概的分析出系统应该承担的责任和参与者的责任,在用户和系统之间,用户扮演的角色是把系统当成黑盒来看,只是需要系统给出自己想要的信息,用户的责任只是将词条输入进去,而此时的系统的责任就比较繁忙了,它会首先将信息进行处理,转换成让搜索器认识的词语或单字,这样就可以进行下一项,利用搜索器在索引库中搜索对应的信息,当信息被检索出来,再对结果进行筛选,最后将其放入实体对象封装起来,形成xml格式传给客户端,这就是用户和系统的交互,并对用户和系统内部进行了简单流程分析;在维护人员和系统之间,维护人员责任是建立和维护索引以及日志,对于维护人员的责任就是尽量为系统的进一步工作做准备,并做好维护工作,而系统的责任就是对维护人员选取的资源进行处理、正文抽取、建立索引、维护索引和建立日志。这些是在这个阶段简单分析出来的过程。下一阶段是对以上所有信息进行领域模型抽取。3.1.3 系统领域模型对参与者和系统的交互过程进行领域模型抽取,首先是名词概念抽取:term(词条),termdisposo(词条处理器),searcher(搜索器),entityset(实体集),indexstore(索引库),filespider(文件蜘蛛),filefilter(文件过滤器),entity(实体)等,领域模型图如图3.6和3.7所示。图3.6 用户接口子系统部分领域模型图3.7 索引建立子系统部分领域模型3.2 系统概要设计在需求分析阶段,产生的用例模型和领域模型带入设计阶段,现在可以大概设计系统的构架,如图3.8所示。图3.8 系统总体架构以下是对架构设计的叙述:(1) heritrix爬虫系统主要是应用heritrix爬虫抓取资源,而这些并不属于这此工程开发任务,所以不纳入设计开发。(2) 索引建立子系统主要是建立索引,及其周边一些操作。要设计索引建立子系统,必须要了解索引建立过程,领域模型中已经可以看出此子系统的大概框架,首先要利用文件爬虫将资源目录下的所有文件路径收集起来,再经过文件过滤器将自己感兴趣的文件路径得到,得到的路径经过正文抽取器将数据抽取出来,这样就可以利用抽取出来的数据进行索引建立。在熟悉了搜索引擎建立的过程后,可以对其架构进行设计,可以在流程中看出资源文件就像是一批材料,索引建立子系统就像是工厂,将材料加工输出成品,所以可以将该流程设计成流水线形式,可以将资源路径作为流水线上的材料,疵品被剔除掉,经过流水线的一系列操作后,索引最后输出。(3) 用户接口子系统用户接口子系统是用户利用用户接口子系统进行搜索,这部分可能设计到的技术是ajax,lucene searcher等,利用ajax的用户操作与服务器响应异步化特性,可以实现局部数据传输,只将用户所需要的信息返回即可,这样大大降低了服务器和客户端交互量,用户可以创建接近本地桌面应用的直观、丰富和动态的web用户界面。3.3 系统详细设计在框架设计中,简要的设计出来了各个子系统的整体流程,下面则是对索引建立子系统和用户接口子系统的设计。3.3.1 索引建立子系统(1) 实体设计实体的设计的目的是封装资源抽取出来的数据,这样有利于使用和传递数据。在实体设计的上层是entity,它继承自object类,是所有实体的父类。在本项目中只设计了三个实体:movie、text和image,分别对应影视、网页和图片。实体关系图如图3.9所示。图3.9 实体之间关系图(2) 抽取器设计提到正文抽取技术,当今流行的技术有基于分装器的网页文本信息抽取技术、基于统计的网页正文抽取技术和基于数据挖掘思想的网页正文抽取技术。 基于分装器的网页文本信息抽取技术,该方法属于传统的网页信息抽取方法。它使用分装器(wrapper)来抽取网页中感兴趣的数据。分装器(也称为:包装器)是一个程序,它根据一定的信息模式识别知识从特定的信息源中抽取相关内容,并以特定形式加以表示。 基于统计的网页文本信息抽取技术,该方法克服了传统的网页内容抽取方法需要针对不同的数据源构造不同的包装器的缺点,具有一定的普遍性。该方法对网页正文信息的抽取依赖阈值p和t,阈值p决定了选择网页正文的文本块。 基于数据挖掘思想的网页正文抽取技术,这类方法把数据挖掘技术应用到对网页自由文本的处理中,大大提高对网页正文(文章)抽取的准确率,突破了数据挖掘技术在应用方面对结构化数据的依赖,是一种很好的正文抽取技术。但仍然有一些普遍性问题有待进一步改善。三种技术中基于数据挖掘的网页正文抽取技术实现难度很大,在此次项目中不加以考虑,所以采用前两种技术。在现今比较流行的开源项目中,htmlparser是基于分装器的技术,而基于统计的技术要自己来分析设计一种算法。这种算法的开发也是接下来的重要任务之一。在抽取器设计中,影视和图片的抽取器基于分装器技术,而网页抽取器是基于统计技术,出于这样的考虑是因为影视和图片在网页中的结构比较固定,比如说图片,一般都封装在img标记中,这样利用分装器很容易就可以抽取出来,而对于网页的抽取就不那么容易了,大量的网站中的网页结构不是相同的,存在很大的差异,不适合利用分装器抽取,所以选取了更为便捷的方式,基于统计的抽取技术。抽取器之间的关系图如图3.10所示。图3.10 抽取器之间关系图(3) 中文正文抽取算法设计对于影视和图片的抽取利用基于分装器的方法,只要目标网页结构比较稳定,并对目标网页进行分析,就很容易利用htmlparser进行内容抽取。对于基于统计的方法算法设计思路如下:设计中涉及的数据结构有树和栈:树用于存储html文件中每个标记块中的内容,类中应该包含对树节点的一些操作;栈利用栈将html文件建立数据树。在用输入流读取文件的时候,将开始标记放入栈中,继续读取数据,直到对应的结束标记出现,这个就是一个内容块,将其放入树节点中,这样就可以很方便的将html文件构造成一树结构。树结构已经构造出来就可以进行统计分析,将内容块中的正文通过有效算法筛选出来,在这里利用了标准方差,它表示了一组数据的波动性,如果波动越大,方差值越大,反之,方差越小。其实这种方法总结起来就有两个条件:内容块长度相对较大并且除去这个内容块剩下的内容块长度波动相对较小。主要的思路是利用循环,每次都取出当前未选块中长度最大的块作为候选块,再计算剩余块长度的标准方差,上一次得到的方差值(第一次是所有内容块的方差值)与本次得到的值相减,如果这个值是最大的说明它就是含有正文的内容块。(4) 索引建造器设计这里要基于lucene检索工具包的支持,lucene提供了从索引建立到搜索的一系列工具,这可以使开发者方便的开发一个索引建立及搜索的框架。提到lucene,不得不提及其中两个最重要的概念:document和field,lucene将document设计为逻辑文件,存储各种各样的field,而field存储的是数据源的数据内容,任何与索引文档相关的操作都是在document和field的基础上完成的。在document设计过程中使用factory模式,documentfactory可以根据对象进行识别然后建立对应的document。在lucene索引建立过程中,需要有分析器对数据进行分词过滤。一个标准的分析器由两部分组成一部分时分词器,另一部分是过滤器。一个分析器往往由一个分词器和多个过滤器组成。提到分词,尤其是中文分词,是建立索引的重点,也是难点,因为中文是世界上最复杂的语言之一,想对中文进行完全精确的分词,能够正确的表达其内在的含义,几乎是不可能的。所以建立索引的重点又落到分词上来。现在比较流行的分词方式有单字分词、二分法和基于词典三种,其中单字就是将中文文本分词时,以字为单位进行切分,但是这种方法需要复杂的单字匹配算法,以及大量的cpu运算;二分法就是将每两个字当作一个词语进行切分,然后建立索引,这种方式会产生一些无词义的词条,这样就会浪费当量的索引空间;基于词典的分词是通过构造一个常用词词典来对所遇到的文本进行词语的切分。lucene中提供了几种中文分析器其中standardanalyzer是基于单字分词技术,另外在中文分词中中科院的ictclas分词是网上被人提及最多的一个分词软件。它是基于词典分词技术。还有一种也在中文分词中应用比较多的就是je分词,它也是基于词典分词技术,它的亮点在于它提供了api,可以添加新词。在本项目中,将三者都整合了进来。索引建立器关系图如图3.11所示。图3.11 索引建造器之间关系图(5) 处理器设计处理器设计的目的是让它完成像工厂流水线的功能,它的任务就是要将各种部件组合起来,形成流水线,此过程可以是执行的或是执行一次。在层次设计上,processor作为所有处理器类的父类,其子类有indexbuildprocessor和sobaprocessor,后者是将网页一次性就可以完成流水线工作,针对影视、网页和图片,而前者会针对一种类型进行处理。它们之间的关系图如图3.12所示。图3.12 处理器之间关系图3.3.2 用户接口子系统(1) web gui设计搜索界面的设计应该是简洁并能快捷响应,应当减少页面的跳转和刷新,所以将ajax技术加入是非常好的设计。参考著名的搜索引擎如百度、谷歌和雅虎等,可以将首页设计成如图3.13所示。图3.13 首页设计图(2) 分页设计分页问题应该说是web搜索引擎的一个常见的问题。在得到搜索结果后,通常,结果的数量众多,无法在一个页面内显示。在本项目中利用在客户端缓存结果的做法,但这种做法只适合于少量数据的处理,当检索结果太多时,会影响响应速度,并有可能造成内存溢出。当然这种方法实现起来比较简单,对于本项目比较适合。(3) 图片处理设计图片处理主要的目的是将图片置于项目以外的目录,设计过程主要利用servlet将图片以流的形式输出,这样做就不必将图片放入用户接口子系统中。4 系统的实现4.1 系统包框架的构建4.1.1 索引建立子系统soba_searchenginecore1_0是soba搜索引擎的核心主要是资源整理,索引建立,日志建立等工作,源文件包结构及说明如下:com.soba.classbuild 包存放类构造类,作用是可以利用类路径构造实例;com.soba.configuration 包存放配置文件操作类包;com.soba.documentfactory 包存放document制造工厂;com.soba.entity 包存放实体类;com.soba.entityset 包存放实体集类;com.soba.extractor 包存放抽取器类;com.soba.extractor.impl 包存放抽取器实现类;com.soba.extractor.nodefilter 包存放节点过滤器实现类;com.soba.file 存放文件有关的操作,主要是文件爬虫和文件路径结果集类;com.soba.filefilter.impl 存放文件过滤器的实现类;com.soba.filefilter 存放文件过滤类;com.soba.formovie 存放为影视服务的类;com.soba.forpage 存放为网页服务的类;com.soba.helper 存放帮助类;com.soba.image 存放图片处理类,主要是图片拷贝类;com.soba.index 存放与索引有关的类,主要是索引构造器;com.soba.index.impl 存放索引构造器的实现类;com.soba.log 存放日志操作类;cessor 存放处理器类;com.soba.split 存放利用ictclas对实体进行分词的类;com.soba.textextraction 存放正文抽取算法类;com.soba.xml 存放对xml操作类;com.xjt.nlp.word 存放对于ictclas分词器类;config 存放配置文件;data存放ictclas分词所用的数据文件;entities 存放实体xml配置文件;log 存放日志文件;config、data、entities和log文件夹与src源文件夹是同一级,在工程根目录下。4.1.2 用户接口子系统soba_searchengineface1_0是用户接口子系统,包结构如下:com.soba.database 存放数据库操作类;com.soba.entity 存放实体类;com.soba.entityset 存放实体集类;com.soba.forimage 存放为图片服务的类;com.soba.formovie 存放为影视服务的类;com.soba.forpage 存放为网页服务的类;com.soba.helper 存放帮助类;perties 存放属性操作类;com.soba.search 存放搜索器类;com.soba.search.servlet 存放servlet类;4.2 系统主要功能实现4.2.1 索引建立子系统(1) filespider文件爬虫基本实现主要方法:public fileresultset crawlfile(string dir)方法实现原理:首先实例化fileresultset对象reports,再利用参数dir建立file类对象root,root调用listfile()方法得到root目录下的所有文件及文件夹,然后利用循环递归调用crawlfile方法。将得到的文件放入reports中,最后返回reports。其中for循环代码如下:for (int i = 0; i files.length; i+) if (filesi.isdirectory() /判断文件是否为文件夹crawlfile(filesi.getabsolutepath();/递归调用crawfile方法elsereports.add(filesi.getabsolutepath();/将路径放入reports中(2) filefilter文件过滤器基本实现文件过滤器的主要工作是过滤掉自己不感兴趣的文件,比如htmlfilefilter是将非.html文件过滤掉。在这里只描述部分类实现,如下: filefiler类基本实现主要方法:public abstract fileresultset filtrateunvaluedfile(fileresultset source);过程描述:filefilter类是抽象类,是所有文件过滤器的父类,它只有一个抽象方法,其子类都要实现这个方法。它的作用是过滤无价值文件。该方法返回有价值的文件路径集合。 htmlfilefilter类基本实现htmlfilefilter类也是一个抽象类,继承自filefilter类。主要方法:public abstract fileresultset filtrateunvaluedfile(fileresultset source);public boolean containstag(tag tag, string path)过程描述:filtrateunvaluedfile方法是抽象的,没有实现。containstag方法主要是检验html文件中是否含有某个标记。containstag方法实现的主要原理:首先实例化org.htmlparser.parser对象parser,parser是分装器,可以解析html文件。将path作为parser构造函数参数初始化parser,再利用paser对象的parser方法提取网页中所有的节点标记,将其放入nodelist对象nodes中,代码如下:nodelist nodes = parser.parse(nodefilterfactory.createandfilter(tag);其中nodefilterfactor是自己定义的节点过滤器工厂,它可以产生指定的节点过滤器。下一步的工作是判断nodes的个数,如果是零个说明该网页中不包含tag标记,所以返回false;反之,则返回true。 htmlfilefilterformovie类基本实现该类继承自htmlfilefilter类。主要方法:public fileresultset filtrateunvaluedfile(fileresultset source) public boolean isvaluable(string path)过程描述:filtrateunvaluedfile在这里实现了,它主要判断是否为html文件并检验一些标记特征是否符合要求,首先实例化fileresultset对象valuablereports,用于保留有价值的文件路径,再利用source的迭代器进行循环判断,如果符合放入valuablereports中,反之,继续循环。最后返回valuablereports对象,此过程中用到了isvaluable方法,以下是对isvaluable方法的描述:isvaluable主要的功能是检验html文件是否包含某些标记,它是结合实体xml配置文件进行检验的,比如影视实体的配置文件如下所示:main_home_movie_pics其中可以很清楚的看到对tag的描述,比如上例中,html文件应该包含标记,可以通过entityextractorassistant的实例ass抽取信息,entityextractorassistant是基于dom4j的xml解析器。接下来利用ass的方法gettags得到所有的标记,再利用父类中的containtag方法判断html文件是否包含这些标记,最后如果全部包含返回true,反之,如果有一个不符合返回false。(3) extractor抽取器基本实现 基于分装器的抽取器基本实现以htmlextractorformovie为例描述一下这类抽取器的基本实现,如下:基于分装器的抽取器主要的工作在于如何利用分装器将某些标记下的内容提取出来,比如说标记下有需要的内容。刚才简单介绍了实体配置文件,这里就利用这个配置文件对html文件进行内容提取,大致流程如下:首先定义实体实例,利用entityextractorassistant将实体配置文件中的约束标记提取出来,再利用分装器从html文件中将带有约束标记的内容提取出来,最后对内容做一下处理,将内容放入实体实例中,返回实体实例。 基于统计的抽取器基本实现抽取器的实现部分主要集中在筛选算法上,其利用了标准方差的计算方法,实现过程如下:int sum = 0;int num = 0;int len = sizeblock.length;/ 获得还未被选取块个数及其总长度for (int i = 0; i len; i+)if (!stablocki) num+;sum += sizeblocki;/ 定义还未被选取块平均长度double avg = (double) sum / (1.0 * (double) num);/ 计算方差double err = 0.0;for (int i = 0; i len; i+)if (!stablocki) double val = (double) sizeblocki - avg;val *= val;err += val;/ 计算标准方差return math.sqrt(err) / (1.0 * (double) num);(4) indexbuilder索引构造器基本实现indexbuilder类基本方法实现如下:主要方法:public void addentity(entity entity)protected boolean hasexist(entity entity)过程描述:addentity方法的功能是向索引中写入实体对象内容,利用indexwriter类的方法write将封装了实体内容的document写入索引中。最后关闭indexwriter实例,结束添加实体。主要代码如下:/利用indexwriter实例writer添加document实例writer.adddocument(entitydocumentfactory.buildentitydocument(entity);hasexist方法主要是判断索引中是否含有了实体信息,其中以entity中的属性keyattribute为关键值检查。这是indexbuilder类的基本实现,在项目中还有三个类:jeindexbuilder、ict_indexbuilder和starndardindexbuilder,它们继承类indexbuilder类,主要实现addentity方法。4.2.2 用户接口子系统(1) 搜索器基本实现搜索器的实现需要有lucene技术的支持。主要方法:public entityset getsearchresults(string key)实现过程:首先将key进行处理,利用分词器进行切分,然后实例化indexsearcher为searcher,再利用实例searcher调用方法search得到hits结果集,再对结果集进行分析处理。其实在这个过程中对分词器的选取应用了三个分词器je,ictclas和standardanalyzer,三个分词器原理已经在设计中提到,因为在构造索引用到的分词器和对输入的词进行切分的分词器是一个,必须相同。三个分词器可以对三个索引库进行搜索,但顺序并不是并行的,首先在ictclas对应库中搜索,无结果再在je对应库中搜索,最后如果前两中没有结果再在standardanalyzer对应库搜索。这样会返回更符合用户要求的信息,但也会带来效率问题。(2) 请求响应servlet基本实现因为应用类ajax技术,在请求响应的servlet中要以xml的格式传输数据,在实体内部定义一个可以将自己属性封装到xml格式字符串中是有必要的,在servlet直接调用这个方法即可。4.3 功能模块代码的实现4.3.1 索引的实现package org.apache.lucene.demo;import java.io.file;import java.io.ioexception;import java.sql.drivermanager;import java.sql.sqlexception;import java.sql.*;import org.apache.lucene.analysis.cjk.cjkanalyzer;import org.apache.lucene.analysis.standard.sta

温馨提示

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

评论

0/150

提交评论