ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:568.73KB ,
资源ID:5284464      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5284464.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(web期末大报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

web期末大报告.docx

1、web期末大报告 考查课报告 课程名称:Lucene全文检索平台 学 院: 信息工程与自动化学院 专业年级: 计科121 学 号: 201210405118 学生姓名: 李刚 指导教师: 王红斌 日 期: 2015-6-16 期末考查结果评定评分项目分值得分报告条理清晰,内容详实,体会深刻40报告格式符合规范10程序符合要求40界面美观,功能有扩充10评语:成绩:指导教师签字:评定日期: 年 月 日目录一、搜索引擎的概念1二、全文检索介绍2三、Lucene简介3四、Lucene技术介绍4 1、Lucene索引的建立5 2、Lucene的搜索6 3、Lucene的排序7 4、Lucene的过滤器

2、8 5、Lucene的分词9五、基于Lucene的全文搜索实现高校图书信息搜索10 1、图书信息XML文档格式定义11 2、建立索引12 3、图书搜索13 4、利用dom4j获取XML文档信息的实现14 5、利用Lucene建立图书信息索引的实现15 6、利用Lucene实现图书信息的搜索16六、总结171、搜索引擎的概念 Internet 上的信息量之大、范围之广、用户之多都比以往任何时候表现得突出,然而如何从浩瀚的信息海洋中得到所需要的信息就显得更加重要。网络搜索引擎的出现从某种程度上解决了这个问题,它是目前比较有效的网上信息获取方法。据CNNIC 的统计,用搜索引擎搜索仅次于电子邮件的应

3、用。目前,网上比较有影响的搜索工具中,中文的有:Google、XX(baidu )、北大天网、爱问(iask)、雅虎(Yahoo )、搜狗(Sogou)等搜索引擎;英文的有:Google、Yahoo、AltaVista、Excite、Infoseek、Lycos、Aol 等。另外还有专用搜索引擎,例如,专门搜索歌曲和音乐的;专门搜索电子邮件地址、电话与地址和公众信息的;专门搜索各种文件的FTP 搜索引擎等。 搜索引擎并不是真正搜索互联网,它搜索的实际上是预先整理好的网页索引 数据库。真正意义上的搜索引擎,通常指的是收集了Internet 上几千万到几十亿个网页并对网页中的每一个词(即关键词)进

4、行索引,建立索引数据库的全文搜索引擎。当用户查找某个关键词的时候,所有在页面中包含了该关键词的网页都将作为搜索结果被搜出来。在经过复杂的算法进行排序后,这些结果将按照与搜索关键词的相关度高低依次排列。 搜索引擎的原理可分为四步:从Internet 网页抓取网页、建立索引数据库、 在索引数据库中搜索排序、对搜索结果进行处理和排序。 (1) 从Internet 上抓取网页。利用能够从Internet 上自动收集网页的Spider 系统程序,自动访问Internet 并沿着任何网页中的所有URL 爬到其他网页,重返这个过程,并把爬过的所有网页收集回来。 (2) 建立索引数据库。由分析所有系统程序对收

5、集回来的网页进行分析,提取相关网页信息(包括网页所在URL、编码类型、页面内容包含的关键词、关键词位置、生成时间、大小、与其他网页的链接关系等),根据一定的相关度算法进行大量复杂计算,得到每一个网页针对页面内容中及超链接中每一个关键词的相关度(或重要性),然后用这些相关信息建立网页索引数据库。 (3) 在索引数据库中搜索排序。当用户输入关键词搜索后,由搜索系统程序从网页索引数据库中找到复合该关键词的所有相关网页。因为所有相关网页针对该关键词的相关度早已计算好,所以只需要按照现成的相关度值排序,相关度越高,排名越靠前。最后,由页面生成系统将搜索结果的连接地址和页面内容摘要等内容组织起来返回给用户

6、。 二、全文检索介绍 全文检索是指计算机索引程序通过扫描文章中的每一个词、对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。全文检索的方法主要分为按字检索和按词检索两种。 按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。对于各种不同的语言而言,字有不同的含义,比如英文中字和词实际上是合一的,而中文中字和词有很大的区别。 按词搜索指对文章中的词,即语义单位建立索引,检索时按词搜索,并且可 以处理同义项等。英文等西方文字由于按照空白切分

7、词,因此实现上与按字处理 类似,添加同义处理也很容易。中文文字则需要切分字词,已达到按词索引的目 的。 全文检索系统是按照全文搜索理论建立起来的用语提供全文检索服务的软 件系统。一般来说,全文检索需要具备建立索引和提供查询的基本功能,此外现 代的全文检索系统还需要具有方便的用户接口、面向WWW 的开发接口、二次 应用开发接口等。 判定一个检索系统的优劣,主要从质量、费用和时间三方面来衡量。因此, 对计算机网络信息搜索的效果评价,也应该从这三个方面进行。质量标准主要通 过查全率和查准率进行评价。费用标准即检索费用是指用户为检索课题所投入的 费用。时间标准时值花费时间,包括检索准备时间、检索过程时

8、间、获取文献时 间等。查全率和查准率是判定检索效果的主要标准。另外,还应考查两个指标: 索引的膨胀系数和检索速度。3、Lucene简介 Lucene 是Apache 基金会Jakarta 项目组的一个子项目,是一个完全开放源码的全文搜索工具包。Lucene 的原作者是Doug Cutting,他是一位资深全文检索专家,曾经是V-Twin 搜索引擎的主要开发者,后在Excite 担任高级系统架构设计师,目前从事一些Internet 底层架构的研究。 一开始,Doug Cutting 是将Lucene 发表在自己的个人主页上。2000 年3 月将其转移到了SourceForge 上,并于2001

9、年10 月捐献给了Apache 软件联盟,使Lucene 成为Jakarta 的一个子工程。 Lucene 在最初阶段是使用Java 开发的。不过由于它的强大功能,Lucene 逐渐被翻译成了多种语言,诸如C+、C#、Perl 等。目前,在Lucene 的邮件列表上已经有了大量的志愿者,他们在不断地为Lucene 的进步做着自己的努力。同时,基于Lucene 的各种应用也开始发展起来,如Nutch (一个WebCrawler 工具)、Hadoop (一个基于Lucene 的分布式计算平台)。它们的出现无疑又为Lucene 社区带来了新鲜而且强大的动力。 4、Lucene技术介绍1、Lucene

10、索引的建立 为了对文档进行索引,Lucene提供了五个基础的类,他们分别是Document, Field, IndexWriter, Analyzer, Directory。 (1) Document Document是用来描述文档的,这里的文档可以指一个HTML 页面,一封电子邮件,或者是一个文本文件。一个Document 对象由多个Field对象组成的。可以把一个Document对象想象成数据库中的一个记录,而每个Field对象就是记录的一个字段。 (2) Field Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个Field对象分别描述。 (3) A

11、nalyzer 在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由Analyzer来做的。Analyzer类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的Analyzer 。Analyzer把分词后的内容交给 IndexWriter 来建立索引。 (4) IndexWriter IndexWriter是Lucene用来创建索引的一个核心的类,他的作用是把一个个的Document对象加到索引中来。 (5) Directory 这个类代表了Lucene的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是FSDirectory,它表示一个存储在文件系统中

12、的索引的位置。 第二个是RAMDirectory,它表示一个存储在内存当中的索引的位置。 熟悉了建立索引所需要的这些类后,我们就开始对某个目录下面的文本文件建立索引了,对某个目录下的文本文件建立索引的关键源代码: public class TxtFileIndexer public static void main(String args) throws Exception /indexDir is the directory that hosts Lucenes index files File indexDir = new File(D:luceneIndex); /dataDir is

13、the directory that hosts the text files that to be indexed File dataDir = new File(D:luceneData); Analyzer luceneAnalyzer = new StandardAnalyzer(); File dataFiles = dataDir.listFiles(); IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true); long startTime = new Date().getTime(); fo

14、r(int i = 0; i dataFiles.length; i+) if(dataFilesi.isFile()&dataFilesi.getName().endsWith(.txt) System.out.println(Indexingfile+dataFilesi.getCanonicalPath(); Document document = new Document(); Reader txtReader = new FileReader(dataFilesi); document.add(Field.Text(path,dataFilesi.getCanonicalPath()

15、; document.add(Field.Text(contents,txtReader); indexWriter.addDocument(document); indexWriter.optimize(); indexWriter.close(); long endTime = new Date().getTime(); System.out.println(It takes + (endTime - startTime) + milliseconds to create index for the files in directory + dataDir.getPath(); 类 Ind

16、exWriter 的构造函数需要三个参数,第一个参数指定了所创建的索引要存放的位置,他可以是一个File对象,也可以是一个FSDirectory 对象或者RAMDirectory对象。第二个参数指定了Analyzer 类的一个实现,也就是指定这个索引是用哪个分词器对文挡内容进行分词。第三个参数是一个布尔型的变量,如果为true 的话就代表创建一个新的索引,为false的话就代表在原来索引的基础上进行操作。接着程序遍历了目录下面的所有文本文档,并为每一个文本文档创建了一个Document 对象。然后把文本文档的两个属性:路径和内容加入到了两个Field对象中,接着在把这两个Field 对象加入到

17、Document对象中,最后把这个文档用IndexWriter 类的 add 方法加入到索引中去。这样便完成了索引的创建。 2、Lucene的搜索 利用Lucene 进行搜索就像建立索引一样也是非常方便的。在上面一部分中,已经为一个目录下的文本文档建立好了索引,现在就要在这个索引上进行搜索以找到包含某个关键词或短语的文档。Lucene 提供了几个基础的类来完成这个过程,它们分别是呢IndexSearcher, Term, Query, TermQuery, Hits. 下面我们分别介 绍这几个类的功能。 (1) Query 这是一个抽象类,有多个实现,比如TermQuery, BooleanQ

18、uery, PrefixQuery.这个类的目的是把用户输入的查询字符串封装成Lucene 能够识别的Query。 (2) Term Term 是搜索的基本单位,一个Term 对象有两个String 类型的域组成。生成一个Term 对象可以有如下一条语句来完成:Term term = new Term(“fieldName”,”queryWord”); 其中第一个参数代表了要在文档的哪一个Field上进行查找,第二个参数代表了要查询的关键词。 (3) TermQuery TermQuery 是抽象类Query 的一个子类,同时也是Lucene 支持的最为基本的一个查询类。生成一个TermQue

19、ry 对象由如下语句完成:TermQuery termQuery = new TermQuery(new Term(“fieldName”,”queryWord”); 其构造函数只接受一个参数,那就是一个Term 对象。 (4 ) IndexSearcher IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个IndexSearcher 的实例在一个索引上进行操作。(5) Hits Hits 是用来保存搜索的结果的。 介绍完这些搜索所必须的类之后,就开始在之前所建立的索引上进行搜索 了,完成搜索功能所需要的代码: public class

20、 TxtFileSearcher public static void main(String args) throws Exception String queryStr = lucene; /This is the directory that hosts the Lucene index File indexDir = new File(D:luceneIndex); FSDirectory directory = FSDirectory.getDirectory(indexDir,false); IndexSearcher searcher = new IndexSearcher(di

21、rectory); if(!indexDir.exists() System.out.println(The Lucene index is not exist); return; Term term = new Term(contents,queryStr.toLowerCase(); TermQuery luceneQuery = new TermQuery(term); Hits hits = searcher.search(luceneQuery); for(int i = 0; i hits.length(); i+) Document document = hits.doc(i);

22、 System.out.println(File: + document.get(path); 类IndexSearcher 的构造函数接受一个类型为Directory 的对象,Directory 是一个抽象类,它目前有两个子类:FSDirctory 和RAMDirectory.程序中传入了一个FSDirctory 对象作为其参数,代表了一个存储在磁盘上的索引的位置。构造函数执行完成后,代表了这个IndexSearcher 以只读的方式打开了一个索引。然后我们程序构造了一个Term 对象,通过这个Term 对象,指定了要在文档的内容中搜索包含关键词“lucene”的文档。接着利用这个Term

23、对象构造出TermQuery对象并把这个TermQuery 对象传入到IndexSearcher 的search 方法中进行查询,返回的结果保存在Hits 对象中。最后用了一个循环语句把搜索到的文档的路径都打印了出来。 3、Lucene的排序 Sort 类是Lucene 自带的一个排序工具,通过它,可以方便地对检索结果进行排序。 Sort 类因为与org.apache.lucene.search 包中,在使用它时,只需要实例化一个Sort 对象,并使用Searcher 提供的search(Query, Sort)接口来实现。事实上,Sort 所提供的排序功能是以Field 为基础,经过这样的处

24、理,最终的排序就转变成所有文档中同一个Field(或多个Field )的值的排序。 Sort 提供了6 个重载的构造函数来帮助构建Sort 对象: Public Sort() Public Sort(String field) Public Sort(String field, Boolean reverse) Public Sort(String fields) Public Sort(SortField field) Public Sort(SortField fields) 构建好Sort 对象后把它传递到方法Searcher.search(Query, Sort)中,返回出来的Hits

25、 就是以构建的Sort 排序好的结果。 Sort 有一个静态的常量Sort.RELEVANCE,这个常量表示当前的排序法则是按照文档的得分进行降序排列。 Lucene 在为每个Document 建立索引的时候,会为每个文档建立一个内部的ID 号,有些时候,需要按照文档的内部ID 号来对其进行排序。Sort 提供了直接静态实例Sort.INDEXORDER,表明当前的排序是以内部的文档ID 号。 如果要按一个或多个Field 来排序,可以利用SortField。在Sort 类的内部由多个重载的setSort 方法,它们会讲用户提交的String 类型的Field 信息转成SortField 的对

26、象,并存在内部的数组中,或是直接将用户提交的SortField 数组作为内部的数组,在排序时使用。 4、Lucene的过滤器 Lucene 提供Filter 类对搜索结果进行过滤。比较常用的一个子类是 RangFilter,是用于过滤在一定范围内出现的文档。例如,某个Document 集中有date (日期)这样一个Field,在搜索的结果中,想保留所有自“1999-01-01”至“2009-12-31”这个区间内的文档,而把其他文档都过滤掉,就可以这样建立一个RangeFilter:RangeFilter filter = new RangeFilter(“date”, “1999-01-0

27、1”,“2009-12-31”,true, true);其中的两个Boolean 参数都设置为true 表示为把上界和下界都包含进来。然后再把这个filter 传递到Searcher.search(Query, Filter)这个方法中,就可返回过滤后的文档集。 当一次检索完毕后,希望能从上一次检索的结果集合中进行二次检索。这种功能在一些信息检索系统中非常重要,用户往往希望一步步地缩小结果集合,以便能够更好地对信息进行筛选。这种筛选过程,起行为与Filter 所要完成的工作非常类似,都是过滤掉一部分文档,只留下另一部分文档。因此,Lucene 提供了内置的QueryFilter 来帮助完成这种

28、功能。QueryFilter 通过传入一个Query 来构建然后传入Searcher 的静态方法search(Query, Filter)中。5、Lucene的分词 在Lucene 中,一个保准的分析器由两部分组成。一部分是分词器,被称为 Tokenizer;另一部分是过滤器,被称为TokenFilter。一个分析器往往由一个分词器和多个过滤器组成。这里所说的过滤器与前面所说的搜索过滤器不是相同的概念。此处的Filter 主要是用于对用户切出来的词进行一些处理,如去掉一些敏感词、转换大小写、转换单复数等。 Lucene 中的Tokenizer 的构造函数接收的是一个Readerduixiang

29、 这表示它将直接从外部设备取得数据源。而TokenFilter 的构造函数则接收一个TokenStream类型的实例。TokenStream 是TokenFilter 和Tokenizer 这两个抽象类的上层基类。 TokenStream 类只定义了两个抽象方法,next()和close()。其中close 的含义比较明确,即关闭流。next()方法的含义为返回当前Token 流中的下一个TokenFilter。由于Tokenizer 和TokenFilter 都为TokenStream 的子类,因此,在 Tokenizer 和TokenFilter 的具体实现中,都应该实现这个next()方

30、法。事实上,Tokenzier 的next 方法返回的是一个原始的,切分出来的词条,而TokenFilter 的next 方法返回的则是一个经过过滤的词条,它将不起切分的作用。因为TokenFilter的构造函数接收的是TokenStream 的实例,也就是说这里会出现两种情况:一是TokenFilter 可以和别的TokenFilter 嵌套在一起,形成一个嵌套的管道过滤器结构;二是TokenFilter 可以喝Tokenizer 结合在一起,用以过滤从Tokenizer 中切分出来的词。就是这种嵌套,形成了Lucene 的分析器的核心结构。 在org.apache.lucene.analysis.standard 中有如下7 个类,她们

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1