(人工智能)基于Lucene与Heritrix的搜索引擎构建(5)
图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 包存放抽取器实现类; [资料来源:www.doc163.com]
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 存放日志操作类;
com.soba.processor 存放处理器类;
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源文件夹是同一级,在工程根目录下。 [版权所有:http://DOC163.com]
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 存放帮助类;
com.soba.properties 存放属性操作类;
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 (files[i].isDirectory()) //判断文件是否为文件夹
crawlFile(files[i].getAbsolutePath());//递归调用crawFile方法
else
reports.add(files[i].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文件中是否含有某个标记。 [资料来源:http://doc163.com]
containsTag方法实现的主要原理:首先实例化org.htmlparser.Parser对象parser,Parser是分装器,可以解析Html文件。将path作为Parser构造函数参数初始化parser,再利用paser对象的parser方法提取网页中所有的节点标记,将其放入NodeList对象nodes中,代码如下: