web期末大报告Word文档下载推荐.docx
《web期末大报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《web期末大报告Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
成绩:
指导教师签字:
评定日期:
年月日
目录
一、搜索引擎的概念…………………………………………………………1
二、全文检索介绍……………………………………………………………2
三、Lucene简介………………………………………………………………3
四、Lucene技术介绍………………………………………………………4
1、Lucene索引的建立…………………………………………………5
2、Lucene的搜索………………………………………………………6
3、Lucene的排序…………………………………………………………7
4、Lucene的过滤器………………………………………………………8
5、Lucene的分词…………………………………………………………9
五、基于Lucene的全文搜索实现高校图书信息搜索…………………………………………………………………………………10
1、图书信息XML文档格式定义…………………………………………11
2、建立索引…………………………………………………………………12
3、图书搜索…………………………………………………………………13
4、利用dom4j获取XML文档信息的实现……………………………14
5、利用Lucene建立图书信息索引的实现…………………………15
6、利用Lucene实现图书信息的搜索…………………………………16
六、总结…………………………………………………………………………17
1、搜索引擎的概念
Internet上的信息量之大、范围之广、用户之多都比以往任何时候表现得突出,然而如何从浩瀚的信息海洋中得到所需要的信息就显得更加重要。
网络搜索引擎的出现从某种程度上解决了这个问题,它是目前比较有效的网上信息获取方法。
据CNNIC的统计,用搜索引擎搜索仅次于电子邮件的应用。
目前,网上比较有影响的搜索工具中,中文的有:
Google、XX(baidu)、北大天网、爱问(iask)、雅虎(Yahoo)、搜狗(Sogou)等搜索引擎;
英文的有:
Google、Yahoo、AltaVista、Excite、Infoseek、Lycos、Aol等。
另外还有专用搜索引擎,例如,专门搜索歌曲和音乐的;
专门搜索电子邮件地址、电话与地址和公众信息的;
专门搜索各种文件的FTP搜索引擎等。
搜索引擎并不是真正搜索互联网,它搜索的实际上是预先整理好的网页索引
数据库。
真正意义上的搜索引擎,通常指的是收集了Internet上几千万到几十亿个网页并对网页中的每一个词(即关键词)进行索引,建立索引数据库的全文搜索引擎。
当用户查找某个关键词的时候,所有在页面中包含了该关键词的网页都将作为搜索结果被搜出来。
在经过复杂的算法进行排序后,这些结果将按照与搜索关键词的相关度高低依次排列。
搜索引擎的原理可分为四步:
从Internet网页抓取网页、建立索引数据库、
在索引数据库中搜索排序、对搜索结果进行处理和排序。
(1)从Internet上抓取网页。
利用能够从Internet上自动收集网页的Spider系统程序,自动访问Internet并沿着任何网页中的所有URL爬到其他网页,重返这个过程,并把爬过的所有网页收集回来。
(2)建立索引数据库。
由分析所有系统程序对收集回来的网页进行分析,提取相关网页信息(包括网页所在URL、编码类型、页面内容包含的关键词、关键词位置、生成时间、大小、与其他网页的链接关系等),根据一定的相关度算法进行大量复杂计算,得到每一个网页针对页面内容中及超链接中每一个关键词的相关度(或重要性),然后用这些相关信息建立网页索引数据库。
(3)在索引数据库中搜索排序。
当用户输入关键词搜索后,由搜索系统程序从网页索引数据库中找到复合该关键词的所有相关网页。
因为所有相关网页针对该关键词的相关度早已计算好,所以只需要按照现成的相关度值排序,相关度越高,排名越靠前。
最后,由页面生成系统将搜索结果的连接地址和页面内容摘要等内容组织起来返回给用户。
二、全文检索介绍
全文检索是指计算机索引程序通过扫描文章中的每一个词、对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
这个过程类似于通过字典中的检索字表查字的过程。
全文检索的方法主要分为按字检索和按词检索两种。
按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。
对于各种不同的语言而言,字有不同的含义,比如英文中字和词实际上是合一的,而中文中字和词有很大的区别。
按词搜索指对文章中的词,即语义单位建立索引,检索时按词搜索,并且可
以处理同义项等。
英文等西方文字由于按照空白切分词,因此实现上与按字处理
类似,添加同义处理也很容易。
中文文字则需要切分字词,已达到按词索引的目
的。
全文检索系统是按照全文搜索理论建立起来的用语提供全文检索服务的软
件系统。
一般来说,全文检索需要具备建立索引和提供查询的基本功能,此外现
代的全文检索系统还需要具有方便的用户接口、面向WWW的开发接口、二次
应用开发接口等。
判定一个检索系统的优劣,主要从质量、费用和时间三方面来衡量。
因此,
对计算机网络信息搜索的效果评价,也应该从这三个方面进行。
质量标准主要通
过查全率和查准率进行评价。
费用标准即检索费用是指用户为检索课题所投入的
费用。
时间标准时值花费时间,包括检索准备时间、检索过程时间、获取文献时
间等。
查全率和查准率是判定检索效果的主要标准。
另外,还应考查两个指标:
索引的膨胀系数和检索速度。
3、Lucene简介
Lucene是Apache基金会Jakarta项目组的一个子项目,是一个完全开放源码的全文搜索工具包。
Lucene的原作者是DougCutting,他是一位资深全文检索专家,曾经是V-Twin搜索引擎的主要开发者,后在Excite担任高级系统架构设计师,目前从事一些Internet底层架构的研究。
一开始,DougCutting是将Lucene发表在自己的个人主页上。
2000年3月将其转移到了SourceForge上,并于2001年10月捐献给了Apache软件联盟,使Lucene成为Jakarta的一个子工程。
Lucene在最初阶段是使用Java开发的。
不过由于它的强大功能,Lucene逐渐被翻译成了多种语言,诸如C++、C#、Perl等。
目前,在Lucene的邮件列表上已经有了大量的志愿者,他们在不断地为Lucene的进步做着自己的努力。
同时,基于Lucene的各种应用也开始发展起来,如Nutch(一个WebCrawler工具)、Hadoop(一个基于Lucene的分布式计算平台)。
它们的出现无疑又为Lucene社区带来了新鲜而且强大的动力。
4、Lucene技术介绍
1、Lucene索引的建立
为了对文档进行索引,Lucene提供了五个基础的类,他们分别是Document,
Field,IndexWriter,Analyzer,Directory。
(1)Document
Document是用来描述文档的,这里的文档可以指一个HTML页面,一封电子邮件,或者是一个文本文件。
一个Document对象由多个Field对象组成的。
可以把一个Document对象想象成数据库中的一个记录,而每个Field对象就是记录的一个字段。
(2)Field
Field对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个Field对象分别描述。
(3)Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由Analyzer来做的。
Analyzer类是一个抽象类,它有多个实现。
针对不同的语言和应用需要选择适合的Analyzer。
Analyzer把分词后的内容交给IndexWriter来建立索引。
(4)IndexWriter
IndexWriter是Lucene用来创建索引的一个核心的类,他的作用是把一个个的Document对象加到索引中来。
(5)Directory
这个类代表了Lucene的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是FSDirectory,它表示一个存储在文件系统中的索引的位置。
第二个是RAMDirectory,它表示一个存储在内存当中的索引的位置。
熟悉了建立索引所需要的这些类后,我们就开始对某个目录下面的文本文件建立索引了,对某个目录下的文本文件建立索引的关键源代码:
publicclassTxtFileIndexer{
publicstaticvoidmain(String[]args)throwsException{
//indexDiristhedirectorythathostsLucene'
sindexfilesFileindexDir=newFile("
D:
\\luceneIndex"
);
//dataDiristhedirectorythathoststhetextfilesthattobeindexed
FiledataDir=newFile("
\\luceneData"
AnalyzerluceneAnalyzer=newStandardAnalyzer();
File[]dataFiles=dataDir.listFiles();
IndexWriterindexWriter=newIndexWriter(indexDir,luceneAnalyzer,true);
longstartTime=newDate().getTime();
for(inti=0;
i<
dataFiles.length;
i++){
if(dataFiles[i].isFile()&
&
dataFiles[i].getName().endsWith("
.txt"
)){
System.out.println("
Indexingfile"
+dataFiles[i].getCanonicalPath());
Documentdocument=newDocument();
ReadertxtReader=newFileReader(dataFiles[i]);
document.add(Field.Text("
path"
dataFiles[i].getCanonicalPath()));
contents"
txtReader));
indexWriter.addDocument(document);
}
}
indexWriter.optimize();
indexWriter.close();
longendTime=newDate().getTime();
Ittakes"
+(endTime-startTime)
+"
millisecondstocreateindexforthefilesindirectory"
+dataDir.getPath());
}
类IndexWriter的构造函数需要三个参数,第一个参数指定了所创建的索引要存放的位置,他可以是一个File对象,也可以是一个FSDirectory对象或者RAMDirectory对象。
第二个参数指定了Analyzer类的一个实现,也就是指定这个索引是用哪个分词器对文挡内容进行分词。
第三个参数是一个布尔型的变量,如果为true的话就代表创建一个新的索引,为false的话就代表在原来索引的基础上进行操作。
接着程序遍历了目录下面的所有文本文档,并为每一个文本文档创建了一个Document对象。
然后把文本文档的两个属性:
路径和内容加入到了两个Field对象中,接着在把这两个Field对象加入到Document对象中,最后把这个文档用IndexWriter类的add方法加入到索引中去。
这样便完成了索引的创建。
2、Lucene的搜索
利用Lucene进行搜索就像建立索引一样也是非常方便的。
在上面一部分中,已经为一个目录下的文本文档建立好了索引,现在就要在这个索引上进行搜索以找到包含某个关键词或短语的文档。
Lucene提供了几个基础的类来完成这个过程,它们分别是呢IndexSearcher,Term,Query,TermQuery,Hits.下面我们分别介
绍这几个类的功能。
(1)Query
这是一个抽象类,有多个实现,比如TermQuery,BooleanQuery,PrefixQuery.这个类的目的是把用户输入的查询字符串封装成Lucene能够识别的Query。
(2)Term
Term是搜索的基本单位,一个Term对象有两个String类型的域组成。
生成一个Term对象可以有如下一条语句来完成:
Termterm=newTerm(“fieldName”,”queryWord”);
其中第一个参数代表了要在文档的哪一个Field上进行查找,第二个参数代表了要查询的关键词。
(3)TermQuery
TermQuery是抽象类Query的一个子类,同时也是Lucene支持的最为基本的一个查询类。
生成一个TermQuery对象由如下语句完成:
TermQuerytermQuery=newTermQuery(newTerm(“fieldName”,”queryWord”));
其构造函数只接受一个参数,那就是一个Term对象。
(4)IndexSearcher
IndexSearcher是用来在建立好的索引上进行搜索的。
它只能以只读的方式打开一个索引,所以可以有多个IndexSearcher的实例在一个索引上进行操作。
(5)Hits
Hits是用来保存搜索的结果的。
介绍完这些搜索所必须的类之后,就开始在之前所建立的索引上进行搜索
了,完成搜索功能所需要的代码:
publicclassTxtFileSearcher{
StringqueryStr="
lucene"
;
//ThisisthedirectorythathoststheLuceneindex
FileindexDir=newFile("
FSDirectorydirectory=FSDirectory.getDirectory(indexDir,false);
IndexSearchersearcher=newIndexSearcher(directory);
if(!
indexDir.exists()){
TheLuceneindexisnotexist"
return;
Termterm=newTerm("
queryStr.toLowerCase());
TermQueryluceneQuery=newTermQuery(term);
Hitshits=searcher.search(luceneQuery);
hits.length();
Documentdocument=hits.doc(i);
File:
"
+document.get("
));
类IndexSearcher的构造函数接受一个类型为Directory的对象,Directory是一个抽象类,它目前有两个子类:
FSDirctory和RAMDirectory.程序中传入了一个FSDirctory对象作为其参数,代表了一个存储在磁盘上的索引的位置。
构造函数执行完成后,代表了这个IndexSearcher以只读的方式打开了一个索引。
然后我们程序构造了一个Term对象,通过这个Term对象,指定了要在文档的内容中搜索包含关键词“lucene”的文档。
接着利用这个Term对象构造出TermQuery对象并把这个TermQuery对象传入到IndexSearcher的search方法中进行查询,返回的结果保存在Hits对象中。
最后用了一个循环语句把搜索到的文档的路径都打印了出来。
3、Lucene的排序
Sort类是Lucene自带的一个排序工具,通过它,可以方便地对检索结果进行排序。
Sort类因为与org.apache.lucene.search包中,在使用它时,只需要实例化一个Sort对象,并使用Searcher提供的search(Query,Sort)接口来实现。
事实上,Sort所提供的排序功能是以Field为基础,经过这样的处理,最终的排序就转变成所有文档中同一个Field(或多个Field)的值的排序。
Sort提供了6个重载的构造函数来帮助构建Sort对象:
PublicSort()
PublicSort(Stringfield)
PublicSort(Stringfield,Booleanreverse)
PublicSort(String[]fields)
PublicSort(SortFieldfield)
PublicSort(SortField[]fields)
构建好Sort对象后把它传递到方法Searcher.search(Query,Sort)中,返回出来的Hits就是以构建的Sort排序好的结果。
Sort有一个静态的常量Sort.RELEVANCE,这个常量表示当前的排序法则是按照文档的得分进行降序排列。
Lucene在为每个Document建立索引的时候,会为每个文档建立一个内部的ID号,有些时候,需要按照文档的内部ID号来对其进行排序。
Sort提供了直接静态实例Sort.INDEXORDER,表明当前的排序是以内部的文档ID号。
如果要按一个或多个Field来排序,可以利用SortField。
在Sort类的内部由多个重载的setSort方法,它们会讲用户提交的String类型的Field信息转成SortField的对象,并存在内部的数组中,或是直接将用户提交的SortField数组作为内部的数组,在排序时使用。
4、Lucene的过滤器
Lucene提供Filter类对搜索结果进行过滤。
比较常用的一个子类是
RangFilter,是用于过滤在一定范围内出现的文档。
例如,某个Document集中有date(日期)这样一个Field,在搜索的结果中,想保留所有自“1999-01-01”至“2009-12-31”这个区间内的文档,而把其他文档都过滤掉,就可以这样建立一个RangeFilter:
RangeFilterfilter=newRangeFilter(“date”,“1999-01-01”,“2009-12-31”,true,true);
其中的两个Boolean参数都设置为true表示为把上界和下界都包含进来。
然后再把这个filter传递到Searcher.search(Query,Filter)这个方法中,就可返回过滤后的文档集。
当一次检索完毕后,希望能从上一次检索的结果集合中进行二次检索。
这种功能在一些信息检索系统中非常重要,用户往往希望一步步地缩小结果集合,以便能够更好地对信息进行筛选。
这种筛选过程,起行为与Filter所要完成的工作非常类似,都是过滤掉一部分文档,只留下另一部分文档。
因此,Lucene提供了内置的QueryFilter来帮助完成这种功能。
QueryFilter通过传入一个Query来构建然后传入Searcher的静态方法search(Query,Filter)中。
5、Lucene的分词
在Lucene中,一个保准的分析器由两部分组成。
一部分是分词器,被称为
Tokenizer;
另一部分是过滤器,被称为TokenFilter。
一个分析器往往由一个分词器和多个过滤器组成。
这里所说的过滤器与前面所说的搜索过滤器不是相同的概念。
此处的Filter主要是用于对用户切出来的词进行一些处理,如去掉一些敏感词、转换大小写、转换单复数等。
Lucene中的Tokenizer的构造函数接收的是一个Readerduixiang这表示它将直接从外部设备取得数据源。
而TokenFilter的构造函数则接收一个TokenStream类型的实例。
TokenStream是TokenFilter和Tokenizer这两个抽象类的上层基类。
TokenStream类只定义了两个抽象方法,next()和close()。
其中close的含义比较明确,即关闭流。
next()方法的含义为返回当前Token流中的下一个TokenFilter。
由于Tokenizer和TokenFilter都为TokenStream的子类,因此,在Tokenizer和TokenFilter的具体实现中,都应该实现这个next()方法。
事实上,Tokenzier的next方法返回的是一个原始的,切分出来的词条,而TokenFilter的next方法返回的则是一个经过过滤的词条,它将不起切分的作用。
因为TokenFilter的构造函数接收的是TokenStream的实例,也就是说这里会出现两种情况:
一是TokenFilter可以和别的TokenFilter嵌套在一起,形成一个嵌套的管道过滤器结构;
二是TokenFilter可以喝Tokenizer结合在一起,用以过滤从Tokenizer中切分出来的词。
就是这种嵌套,形成了Lucene的分析器的核心结构。
在org.apache.lucene.analysis.standard中有如下7个类,她们