毕业设计(论文)-基于Lucene的校园搜索系统开发.doc_第1页
毕业设计(论文)-基于Lucene的校园搜索系统开发.doc_第2页
毕业设计(论文)-基于Lucene的校园搜索系统开发.doc_第3页
毕业设计(论文)-基于Lucene的校园搜索系统开发.doc_第4页
毕业设计(论文)-基于Lucene的校园搜索系统开发.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

摘 要校园网已经成为高校信息资源共享和管理的重要平台,网络构建目的不同使得校园网与互联网之间存在着较大差异,这些差异导致校园网搜索引擎的实现需要引进新的技术和方法。本文通过分析比较校园网和公用互联网的区别,统计分析并总结出校园网信息资源的特点,并基于这些特点提出了多维度量排序算法等技术,以提高搜索引擎查询准确度,实际构建的校园网搜索系统表现出比传统搜索引擎更优的搜索性能。在此基础上,本文利用基于Java的全文检索工具包Lucene开发定制了一个基于Lucene的校园网搜索系统。关键词:搜索引擎;Lucene;排序算法;相关度iiiAbstractCampus Network is an important platform of university information resources, which differs from Internet in many aspects. New methods and algorithms is used to build a good university information resources search engine.Based on the analyses of the differences between campus network and Internet,corresponding solutions such as multiple metrics ranking algorithm is proposed. A real university information resources search system is conducted and the experimental results show that search system has many advantages compared with the general Internet search engine. This article describes how to develop a search system of campus network for our need quickly based on Lucene which is a power full - text retrieval tools. Keywords: search Engine; Lucene; ranking algorithm; Relevance目录摘 要iAbstractii目录iii第1章绪论11.1搜索引擎的概念11.2校园网搜索的特点21.3论文研究内容及其意义4第2章Lucene研究62.1Lucene简介62.2Lucene的应用、特点及优势62.3Lucene系统结构分析72.4Lucene数据流分析9第3章校园网搜索系统设计113.1体系结构设计113.2整体设计流程图123.3引擎设计主要类图133.3.1语言分析类133.3.2文档结构类143.3.3索引管理类143.3.4查询分析和检索类173.3.5工具类183.4索引文件存储抽象18第4章校园网搜索系统实现224.1系统主要模块的具体实现224.1.1系统维护接口224.1.2索引器224.1.3查询分析器234.1.4索器244.2关键技术研究254.2.1中文分词254.2.2解析网页及索引入库254.2.3网页排序算法及检索输出264.2.4PDF等异构文本处理30总结与展望32参考文献33致 谢34基于Lucene的校园搜索系统开发第1章 绪论1.1 搜索引擎的概念搜索引擎(Search Engine)指的是一种在Web上应用的软件系统,它以一定的策略在Web上搜集和发现信息,在对信息进行处理和组织后,为用户提供Web信息查询服务。从使用者的角度看,这种软件系统提供一个网页界面,让他通过浏览器提交一个词语或者短语,然后很快返回一个可能和用户输入内容相关的信息列表(常常会是很长一个列表,例如包含1万个条目)。这个列表中的每一条目代表一篇网页,至少有3个元素:标题:以某种方式得到的网页内容的标题。最简单的方式就是从网页的标签中提取的内容。(尽管在一些情况下并不真正反映网页的内容)。URL:该网页对应的“访问地址”。有经验的Web用户常常可以通过这个元素对网页内容的权威性进行判断,例如上面的内容通常就比(某个假想的个人网站)上的要更权威些(不排除后者上的内容更有趣些)。摘要:以某种方式得到的网页内容的摘要。最简单的一种方式就是将网页内容的头若干字节(例如512)截取下来作为摘要。通过浏览这些元素,用户对相应的网页是否真正包含他所需的信息进行判断。比较肯定的话则可以点击上述URL,从而得到该网页的全文。随着Internet的迅速发展,网上的信息越来越多。如何从浩如烟海的信息中获得自己感兴趣的部分,就成为一个重要的问题。作为帮助人们解决这一问题的主要工具,搜索引擎从1995年开始逐渐发展起来。与传统的信息检索系统相比,搜索引擎的设计显然要困难许多。这是有Web信息的特点决定的:(1) 内容广泛:Internet是一个遍布全球的综合信息网。Web页面内容涵盖各行各业、各种学科;并使用各种语言创建,因此搜索引擎是一个跨语言信息检索系统。(2) 动态性:传统信息检索中的文献集合一般是不变的或者变化很小,而Internet的信息确是随时变化的,信息的组织几乎是无序的。(3) 用户广泛:全球数以亿计的Internet用户都是搜索引擎的用户。他们不同于传统信息检索系统的用户,后者往往是比较专业甚至受过专门培训的职业人员。(4) 相互链接:分布在全球各地数以十亿计的网页通过超级链接连接起来,共同组成这个世界上最大的信息资源库。(5) 最后,和传统信息检索不同的是,文档的内容由超文本标记语言(HTML)表示而非自然语言。其中前两点增加了“文档内容表示”过程的难度;第三点,是我们的人机交互接口设计和“用户需求表示”过程更加困难。而最后两个特点为我们提高检索系统的性能,提供了更多的信息。搜索引擎的组成和传统信息检索系统并没有太大的不同。唯一必须说明的是其网页的获取通过一个称为网络爬虫(WebCrawler)的程序完成。网络爬虫不间断的爬行于网际之中,去搜集新出现的或者刚更新的网页。当它访问一个网站时,记录该站点内各级页面的全部文本信息,并根据网页上提供的链接信息进行递归检索,由此竭力穷尽所有网页。1.2 校园网搜索的特点校园网可以看作以学校为单位的内联网,它与互联网是同质的,但是由于应用环境、网站构建以及链接结构方面的不同,对搜索引擎来说,校园网与公用互联网有着多方面的区别。从总体上来说,校园网的主要目的是用于信息发布,例如教学资源、办公信息、校内新闻等,相对互联网较强的商业性有相当的差异。如果直接将传统的互联网搜索算法应用到校园网当中,难以得到令用户满意的搜索性能。1. 网站分布校园网网站一般集中在一个或几个IP地址段内,网站的数量和IP地址变动相对频繁;网站之间的链接稀疏,由于分别由不同机构和个人进行维护,有些网站很难从其它网站的链接达到;网站的重要性与网站规模不成正比,例如新闻和论坛类网站的网页数量多并且链接较密,而教学和管理部门的网站则相反。2. 校园网没有广告和垃圾网页,网页间链接稀疏大部分网站由各院系的网站管理人员进行维护,网页的发布需要经过较严格的审核,发布的荣具有权威性和真实性,区别于互联网的商业行为。据天网搜索对国内互联网进行的统计,每个网页的平均出度为25.7。而对清华大学,北京邮电大学校园网的统计则显示,网页的平均出度分别为13.3、8.0。这是因为校园网网站往往不使用交换链接等方式以获得商业利益,造成网页之间的链接较少。3. Word、PDF等异构文本格式的网页比例高互联网上常见的网页通常有静态网页(文件后缀为htm、html、shtml等)、动态网页(文件后缀为asp、jsp、php等)以及各种文档(文件后缀为doc、pdf、ppt等)。我们把doc、pdf、ppt等类型的文件称为异构体文本。校园网中通常包括图书馆、论文等各种学术资源,这些信息通常都是以异构体文本的形式发布的,这是校园网资源的一个显著特点。图 11显示了我们通过实际采集和统计(不包括图像、语音等多媒体文件)得到的网页类型分布。图中靠左的直方柱是对国内互联网(包括公用网ChinaNet、教育网CERNET)中较有影响的10000个网站进行网页采集,共采集网页8236768个。其中异构体文本文件107500个,占总数的1.31%。图中的靠右的直方柱是对教育网(CERNET)内较有影响的3000个网站进行采集,共采集网页3224302个。其中异构体文本文件111539个,占总数的3.46%。教育网中异构体文本占总网页数的比例比互联网平均水平要高出160%。图 11 教育网和互联网的网页类型分布4. 用户查询习惯互联网上的查询往往没有特别明确的预期,对同一个查询词,有几十或成百上千个相关的返回结果。搜索引擎可以通过链接分析等技术把“权威”的网页排在靠前位置,得到令用户满意的查询结果。校园网用户通常具有明确的查询预期,例如某个专业的招生计划、某个教授的个人资料等。正确的搜索结果通常没有明显的特点,通常不是被众多链接指向的“权威”网页。因此在排序算法中需要更多考虑相关度的分析和比较。1.3 论文研究内容及其意义本文首先介绍了搜索引擎的基本概念,分析了校园网与公用互联网的不同之处,意在建立一个基于Lucene的校园网搜索引擎。第二章介绍了Lucene及其系统结构及数据流;第三章着重介绍搜索引擎的设计;第四章则详细介绍了搜索引擎的实现,并对对分词,网页解析及网页排序算法进行了重点研究。本系统的开发完成对于师生查询校园办公网、各分院网站、校园网内其它资源的查询有很大的意义,用户不必为了查询某特定信息而进入特定网站的搜索引擎查询,只需要在办公网的全文搜索引擎中搜索即可,查询得到的信息也将是最新最全的。另一方面,本搜索引擎将可以很方便地应用于企业内网、门户网站中。目前许多网站通常通过调用诸如Google或百度的搜索服务,来实现对本站点的搜索。但是对于一个有很多子网站的企业门户网站来说,通用搜索引擎存在着很多缺陷,满足不了这种搜索服务要求,如:尽管Google等搜索引擎提供对指定站点内的查询,但是不能同时对多个站点同时查询;通用搜索引擎不能及时更新索引,会导致搜索结果不全和出现“坏链接”;使用通用搜索引擎同时存在着安全隐患。因此开发一个由企业自主定制的搜索引擎,显得非常重要,而本项目的开发将同时解决这个问题。33第2章 Lucene研究2.1 Lucene简介Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码5的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。2.2 Lucene的应用、特点及优势作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。apache软件基金会的网站使用了Lucene作为全文检索的引擎,IBM的开源软件eclipse的2.1版本中也采用了Lucene作为帮助子系统的全文索引引擎,相应的IBM的商业软件Web Sphere中也采用了Lucene。Lucene以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。Lucene作为一个全文检索引擎,其具有如下突出的优点:(1) 索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。(2) 在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。(3) 优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。(4) 设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。(5) 已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。面对已经存在的商业全文检索引擎,Lucene也具有相当的优势。首先,它的开发源代码发行方式(遵守Apache Software License),在此基础上程序员不仅仅可以充分的利用Lucene所提供的强大功能,而且可以深入细致的学习到全文检索引擎制作技术和面相对象编程的实践,进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上,商业软件的灵活性远远不及Lucene。其次,Lucene秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在Lucene的基础上扩充各种功能,比如扩充中文处理能力,从文本扩充到HTML、PDF等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于Lucene恰当合理的对系统设备做了程序上的抽象,扩展的功能也能轻易的达到跨平台的能力。最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能。最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统管理员可以根据当前的平台适合的语言来合理的选择。2.3 Lucene系统结构分析Lucene作为一个优秀的全文检索引擎,其系统结构具有强烈的面向对象特征。首先是定义了一个与平台无关的索引文件格式,其次通过抽象将系统的核心组成部分设计为抽象类,具体的平台实现部分设计为抽象类的实现,此外与具体平台相关的部分比如文件存储也封装为类,经过层层的面向对象式的处理,最终达成了一个低耦合高效率,容易二次开发的检索引擎系统。图 21即为Lucene的系统结构图。图 21 Lucene系统结构图从图中可以清楚的看到,Lucene的系统由基础结构封装、索引核心、对外接口三大部分组成。其中直接操作索引文件的索引核心又是系统的重点。Lucene的将所有源码分为了7个模块(在java语言中以包即package来表示),各个模块所属的系统部分也如上图所示。需要说明的是org.apache.lucene.queryPaser是做为org.apache.lucene.search的语法解析器存在,不被系统之外实际调用,因此这里没有当作对外接口看待,而是将之独立出来。从面向对象的观点来考察,Lucene应用了最基本的一条程序设计准则:引入额外的抽象层以降低耦合性。首先,引入对索引文件的操作org.apache.lucene.store的封装,然后将索引部分的实现建立在(org.apache.lucene.index)其之上,完成对索引核心的抽象。在索引核心的基础上开始设计对外的接口org.apache.lucene.search与org.apache.lucene.analysis。在每一个局部细节上,比如某些常用的数据结构与算法上,Lucene也充分的应用了这一条准则。在高度的面向对象理论的支撑下,使得Lucene的实现容易理解,易于扩展。Lucene在系统结构上的另一个特点表现为其引入了传统的客户端服务器结构以外的应用结构。Lucene可以作为一个运行库被包含进入应用本身中去,而不是做为一个单独的索引服务器存在。这自然和Lucene开放源代码的特征分不开,但是也体现了Lucene在编写上的本来意图:提供一个全文索引引擎的架构,而不是实现。2.4 Lucene数据流分析理解Lucene系统结构的另一个方式是去探讨其中数据流的走向,并以此摸清楚Lucene系统内部的调用时序。在此基础上,才能够更加深入的理解Lucene的系统结构组织。这部分的分析,是深入Lucene系统的钥匙,也是进行重写的基础。图 22即为Lucene系统中的主要数据流以及它们之间的关系图:图 22 Lucene数据流图图中共存在4种数据流,分别是文本流、token流、字节流与查询语句对象流。文本流表示了对于索引目标和交互控制的抽象,即用文本流表示了将要索引的文件,用文本流向用户输出信息;在实际的实现中,Lucene中的文本流采用了UCS-2作为编码,以达到适应多种语言文字的处理的目的。Token流是Lucene内部所使用的概念,是对传统文字中的词的概念的抽象,也是Lucene在建立索引时直接处理的最小单位;简单的讲Token就是一个词和所在域值的组合,后面在叙述文件格式时也将继续涉及到token,这里不详细展开。字节流则是对文件抽象的直接操作的体现,通过固定长度的字节(Lucene定义为8比特位长,后面文件格式将详细叙述)流的处理,将文件操作解脱出来,也做到了与平台文件系统的无关性。查询语句对象流则是仅仅在查询语句解析时用到的概念,它对查询语句抽象,通过类的继承结构反映查询语句的结构,将之传送到查找逻辑来进行查找的操作。图中的涉及到了多种逻辑,基本上直接对应于系统某一模块,但是也有跨模块调用的问题发生,这是因为Lucene的重用程度非常好,因此很多实现直接调用了以前的工作成果,这在某种程度上其实是加强了模块耦合性,但是也是为了避免系统的过于庞大和不必要的重复设计的一种折衷体现。词法分析逻辑对应于org.apache.lucene.analysis部分。查询语句语法分析逻辑对应于org.apache.lucene.queryParser部分,并且调用了org.apache.lucene.analysis的代码。查询结束之后向评分排序逻辑输出token流,继而由评分排序逻辑处理之后给出文本流的结果,这一部分的实现也包含在了org.apache.lucene.search中。索引构建逻辑对应于org.apache.lucene.index部分。索引查找逻辑则主要是org.apache.lucene.search,但是也大量的使用了org.apache.lucene.index部分的代码和接口定义。存储抽象对应于org.apache.lucene.store。没有提到的模块则是做为系统公共基础设施存在。第3章 校园网搜索系统设计3.1 体系结构设计系统主要包含爬虫器、查询分析器、检索器、索引器、中文分词器、系统维护接口,异构文本分析器等六个部分,其中的中间四个部分基于Lucene构建。中文分词器采用中科院汉语词法分析系统ICTCLAS,通过JNI在系统中进行调用。系统体系结构如图 31所示。图 31 系统体系结构图3.2 整体设计流程图图 32 整体设计流程图首先需要建立一个空的URL数据库,并且把起始根urls添加到URL数据库中(步骤1),依据URL数据库在新创建的segment中生成fetchlist,存放了待爬行的urls(步骤2),根据fetchlist从Internet进行相关网页内容的爬行抓取与下载(步骤3),随后把这些抓取到的内容解析成文本与数据(步骤4),从中提取出新的网页链接URL,并对URL数据库进行更新(步骤5),重复步骤2-5直到达到被指定的爬行抓取深度。以上过程构成了系统的整个抓取过程,可以用一个循环来对其进行描述:生成抓取更新循环。当抓取过程完成后,对抓取到的网页进行倒排索引,对重复的内容与URL进行剔除,然后对多个索引进行合并,为搜索建立统一的索引库,而后用户可通过由Tomcat容器提供的系统搜索用户界面提交搜索请求,然后由Lucene对索引库进行查询,并返回搜索结果给用户,完成整个搜索过程。3.3 引擎设计主要类图3.3.1 语言分析类图 33 语言分析类图Analyzer是一个抽象类,负责对文本内容的切分词规则。切分后返回一个TokenStream,TokenStream中有一个非常重要方法next(),即取到下一个词。通过切词规则,把一篇文章从头到尾分成一个个的词,这就是org.apache.lucene.analysis的工作。对英文而言,其分词规则很简单,因为每个单词间都有一个空格,按空格取单词即可,当然为了提高英文检索的准确度,也可以把一些短语作为一个整体,其间不切分,这就需要一个词库。 对中文而言,文字之间都是相连的,没有空格,但我们同样可以把字切分,即把每个汉字作为一个词切分,这就是所谓的“切字”,但切字方式的索引没有意义,准确率太低,要想提高准确度一般都是切词,这就需要一个词库,词库越大准确度将越高,但入库效率越低。3.3.2 文档结构类图 34 文档结构类图Document包相对而言比较简单,主要包含3个类,Document对应于关系型数据库的记录对象,主要负责字段的管理,字段分两种,一是Field,即文本型字段,另一个是日期型字段DateField。这个包中关键需要理解的是Field中字段存储方式的不同。3.3.3 索引管理类索引包是整个系统核心,全文检索的根本就为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率,索引建设的质量关系到整个系统的质量。Lucene的索引树是非常优质高效的。类图如图 35和图 36所示。图 35 IndexWriter相关类图图 36 IndexReader相关类图全文检索库的初始化和记录加载均需要通过IndexWriter和IndexReader类来完成。初始化全文库的语句为:IndexWriter indexWriter = new IndexWriter(“全文库的目录位置”,new StandardAnalyzer(),true);记录加载的语句为:indexWriter.addDocument(doc);IndexWriter主要用于写库,当需要读取库内容时,需要通过IndexReader类来实现。3.3.4 查询分析和检索类图 37 查询与检索类图通过查询分析器(queryParser)解析后,将返回一个查询对象(query),根据查询对象就可进行检索。3.3.5 工具类图 38 util工具类3.4 索引文件存储抽象存储抽象是唯一能够直接对索引文件存取的包,因此其主要目的是抽象出和平台文件系统无关的存储抽象,提供诸如目录服务(增、删文件)、输入流和输出流。其UML类图如下3幅图所示:图 39 存储抽象实现UML图(一)图 310 存储抽象实现UML图(二)图 311 存储抽象实现UML图(三)图 39到图 311展示了整个org.apache.lucene.store中主要的继承体系。共有三个抽象类定义:Directory、InputStream和OutputStrem,构成了一个完整的基于抽象文件系统的存取体系结构,在此基础上,实现了:(FSDirectory,FSInputStream,FSOutputStream)和(RAMDirectory,RAMInputStream和RAMOutputStream)。前者是以实际的文件系统做为基础实现的,后者则是建立在内存中的虚拟文件系统。前者主要用来永久的保存索引文件,后者的作用则在于索引操作时是在内存中建立小的索引,然后一次性的输出合并到文件中去,这一点在后面的索引逻辑部分能够看到。此外,还定义了org.apache.lucene.store.lock和org.apache.lucene.store.with两个辅助内部实现的类,用在实现Directory方法的makeLock的时候,以在锁定索引读写之前来让用户程序做一些准备工作。FSDirectory,FSInputStream,FSOutputStream的内部实现依托于java语言中的io类库,只是简单的做了一个外部逻辑的包装。这当然要归功于java语言所提供的跨平台特性,同时也带了一些隐患:文件存取的效率提升需要依赖于文件类库的优化。如果需要继续优化文件存取的效率,应该还提供一个文件与目录的抽象,以根据各种文件系统或者文件类型来提供一个优化的机会。RAMDirectory,RAMInputStream和RAMOutputStream的内部实现直接采用了虚拟的文件RAMFile类(定义于文件RAMDirectory.java中)来表示文件,目录则看作一个String与RAMFile对应的关联数组。RAMFile中采用数组来表示文件的存储空间。在此的基础上,完成各项操作的实现,就形成了基于内存的虚拟文件系统。因为在实际使用时,并不会牵涉到很大字节数量的文件,因此这种设计是简单直接的,也是高效率的。一般使用的是抽象类提供的接口而不是实际的实现类本身。在实现类中一般都含有几个静态函数,比如createFile,它能够返回一个OutputStream接口,或者openFile,它能够返回一个InputStream接口,利用这些接口之中的方法,比如writeString,writeByte等等,就能够在抽象的层次上处理Lucene定义的数据类型的读写。利用静态类的方法也就是工厂来创建对象,返回接口,通过接口来执行操作。第4章 校园网搜索系统实现基于校园网的自身特点,本文研究并提出了相应的解决办法,并开发了针对校园网资源的专业搜索引擎。系统主要分为爬虫器、索引器和检索器3个模块。爬虫器对数据源进行遍历,尽量多地发现、下载新信息,并对下载的网页进行预处理以便进行索引,包括提取其中的链接信息、网页正文、标题、链接标注、URL等等;索引器则采用Lucene的全文检索技术对文件库建立倒排索引;检索模块接收并分析用户的查询词,遍历索引数据库,最后将结果集返回给用户。4.1 系统主要模块的具体实现4.1.1 系统维护接口系统维护接口:本系统对索引内容的更新采用定时器触发后台启动与手工启动两种。每个子站点建立一个索引目录,指定不同的索引目录的路径。这不仅可以灵活地放置索引数据,而且也可以使得对每个子站点单独进行更新操作和访问操作。系统对每个站点都提供两种搜索策略与索引策略。搜索策略是宽度优先搜索与深度优先搜索两种。索引策略是批量索引与增量索引两种。批量索引是建立一个空索引,然后将被索引的文件以Document格式放在内存中,当索引文件达到参数mergeFactor 时,索引器一次将其写入索引;增量索引是在原有索引的基础上删除增加被索引文件。每个站点这种的搜索与索引策略及其相关参数都存在xml 的配置文件中,可由系统维护人员通过该接口进行修改。4.1.2 索引器使用的是Lucene 的索引器IndexWrite 类。修改该索引器所使用的语言分析器,使其支持中文分词。系统采用字典切词和双字切词相结合的技术,利用JavaCC 编程实现。并且在生成索引器将支持中文汉字切分的语言分析器作为参数传递给索引器成为索引器的成员,使其在索引过程中使用该语言分析器进行分词。索引器采用的索引策略来自于xml 配置文件。批量索引器删除原来的索引段,建立新的索引段,然后将所有的被索引文件加入到索引段中。而增量索引器则是读取原索引段的内容,调用SegementReader 类的delete(term) 方法将包含某url 地址的被索引文件从索引中删除,同时将被删除文件的新内容(或新文件) 加入索引段中。批量索引器和增量索引器,最后调用IndexWrite 类的addDocument () ,将搜索器抓取且转换为Document 格式的文件,根据字段类型进行分别处理,加入到索引段中。下面为索引器事项过程中的关键代码:public class IndexFiles public static void main(String args) throws Exception String indexPath = args0; IndexWriter writer; /构造IndexWriter; writer = new IndexWriter(indexPath, new SimpleAnalyzer(),false); for (int I=1;Iargs.length;I+) System.out.println(“Indexing file ”+argsi); InputStream is = new FileInputStream(argsi); Document doc = new Document(); /取得Document 对象实例; doc.add(Field.UnIndexed(“path”,argsi); /该实例包含path 域,不索引,但存储; doc.add(Field.Text(“body”,(Reader)new InputStreamReader(is); /该实例包含body 域,全文索引并存储; writer.addDocument(doc); is.close(); 4.1.3 查询分析器使用的是Lucene和核心中的QueryParser类,对于用户提交的查询关键字组成的逻辑表达式进行分析,生成系统内部的查询条件类Query。根据系统设定的校园办公网根URL ,即 ,按宽度优先搜索原则在校园网中抓取网页,调用文件内容分析器分析文件内容, 将其转换为Document 格式输出到索引器。每个Document 对象包含多个字段Field 对象,针对不同的字段属性和数据输出的需求,对字段还可以选择不同的索引/ 存储字段规则,如下表所示表 4.1 字段索引/存储规则表方法分词索引存储适用字段Field. Text (String name ,String val2ue)是是是标题,内容字段,关键字Field. Text ( String name , Reader value)是是否内容类型Field. Keyword ( String name ,String value)否是是最后修改日期Field. UnIndexed ( String name ,String value)否否是URLField. UnStored ( String name ,String value)是是否4.1.4 索器调用Lucene 的搜索入口对索引进行查询,返回查询结果。检索时,用户提交检索关键字,先调用Lucene 的查询分析器分析用户提交的查询,然后调用IndexSearcher 类进行搜索,返回结果为Hits 类。可以通过它再访问Document中的 Field 内容。本系统允许用户对指定站点范围查询。对要查询的每个子站点的索引目录定义一个子检索器( IndexSearcher 类) ,然后将其作为参数输出到Lucene 的MultiSearcher 类中,调用MultiSearcher 类的search 方法对多个索引目录进行检索。Multisearch 的search 方法不仅能够调用子检索器检索索引,而且能将所有子检索器检索到的结果合并,然后重新排名。int size = index. size ();/ 索引目录个数Searchable searcher = new Searchablesize ; for (int j = 0 ;j size ;j + + ) Searchable t - search ; String indexPath = ( ( WebSearchIndex ) index. elementAt ( j ) ) . get IndexPath () ;/ / 得到索引目录路径 t - search = new org. apache. lucene. search. IndexSearcher (indexPath) ; / 生成子检索器 searcher j = t - search ; multiSearcher = new org. apache. lucene. search. MultiSearcher(searcher) ; if (dateFilter = = null) / dateFilter 查询过滤条件 hits = multiSearcher . search ( query) ;/ query 为用户提交的查询 else hits = multiSearcher . search (query ,dateFilter) ;4.2 关键技术研究4.2.1 中文分词切词对于搜索结果来说是十分重要的环节,对于英文而言,只用关注空格即可实现切词,而对于中文,由于中文词汇非常丰富,词语的组成十分不固定,所以中文切词就变得比较困难。现在比较普遍的是中文单字切词、双字切词、字典切词,对于单字切词由于其一开始的不准确性就被很多人放弃,最准确的切词方法应该是字典切词,匹配方法大致有前向匹配、后向匹配和基于统计的匹配。简单举例来说,对于“中华人民”这句话,单字切词就是把这四个字一个作为一个词索引,搜索的时候逐字匹配,而双字索引是把这句话依次按两个字加以区分,分为“中华”“,华人”“,人民”这样切词。字典切词则是相对于词库来寻找哪个应该作为词,而哪个不是,由此也可以知道,字典切词是比较准确的,但是由于汉语词语的不断变化和扩充性,所以现在还要结合双字切词才可以更好地提高准确度。由于字典切词和双字切词的配合使用搜索引擎的匹配精度在很大程度上是可以得到保证的,期间参考了很多的切词算法,通过程序集ICTCLAS来实现。4.2.2 解析网页及索引入库解析网页就是要把网页中的元素标记(Token) 及其标记之后的内容提取出来,以利于入库,相对于每一个Token 建一个相应的字段,而此Token 的内容就是此字段的内容。实现方法:建立一个Myparser 类,然后要实现读入文件流,接着解析成字符串格式输出,以备下一步处理,然后逐个提取Token 及其内容。逐个提取Token 的目的是为了以后搜索的时候可以给不同的Token 加上不同的权值,从而可以很好地实现排序。提取Token 之后开始入库:Myparser parser = new Myparser (f) ;Document doc = new Document () ;/ 用此方法逐个加入字段doc. Add(Field. Text (“title”, parser. Get Title () ) ) ;至此,已经可以实现对网页的双字索引入库。但是入库的时候要注意的是,提供了更新机制,现在采用的是简单的更新机制,即单双天机制,双天查找到更新的时候索引到目录一,单天的时候索引到目录二,既可以天天更新,又可以不影响使用。4.2.3 网页排序算法及检索输出PageRank和HITS算法在Google、Baidu等通用搜索引擎中发挥了极其重要的作用。此类算法基于对互联网的链接分析,利用链接结构形成的有向图为每个网页计算出一个权重,并根据权重的大小来决定该网页在返回结果中出现的位置。权重代表的是一个网页在整个互联网上的“声望”。在校园网环境中,由于本文之前提到的特点,即网页大部分由各分院网站发布,并且网页之间链接稀疏,通过链接结构计算的网页权重不能准确反应网页与查询之间的匹配程度。通过发现,利用网页与查询之间的相关度对查询结果排序更符合用户的查询要求,尤其是链接标注和网页标题对网页排序质量的提高具有极其明显的作用。在系统实现中,综合利用了网页正文、网页标题、链接标注、链接入度、网页深度等多项信息,综合计算网页与查询词之间的相关度,作为查询结果排序的依据。对于一个给定的查询词Q,把数据集里所有在正文、标题或链接标注中包含该词的网页组成一个集合U,根据每一维度量都可以生成一个网页序列。例如对“网页正文”这一维度量,采用TF-IDF算法计算出一个,经过归一化处理后,我们可以按照对网页排序得到;对于“网页标题”这一维度量,把查询词在标题词串中所占的百分比作为排序的参考值,得到网页序列;对于“文本格式”度量,给异构文本和静态网页赋予较高的值,对动态网页赋予较低的值,根据不同网页格式的值可以的得到排序;类似地,对于链接标注、网页入度、URL内容、网页深度,可以根据归一化度量值得到网页排序。利用这些度量值 的线性组合(4-1)作为最终网页排序的度量,通过调整的值,得到最佳的排序效果。利用Kendall距离K(S,T)来判断是否最佳。Kendall是一种计算简单并且具有很好鲁棒性的相关度测量方法,它计算两个序列S、T中排列顺序相反的元素对的数量。例如,假设S=1,2,3,4,5,6,T=2,5,3,1,4,6,则T中与S中顺序相反的元素有(2,1)、(5,3)、(5,1)、(5,4)、(3,1)共5对,因册T与S之间的Kendall距离为5.对Kendall距离如下归一化处理就能得到S和T之间的相关度,其中n表示序列中元素的总数,表示所有元素对的组合数量。(4-2)首先利用人工裁判对U进行排序的一个基准排序,分别计算就可以知道各维度量的排序与最佳排序之间的距离。为了测量一个排序算法对整个数据集的效果,可以选取一个查询词的集合进行上述计算,利用平均Kendall距离来评判某一维度量与最佳排序之间的距离(4-3)其中N代表查询词集合中查询词的个数,这个值可以作为取舍多维度量的依据,并且相应设置该维度量的初值(归一化)。最终目标是调整,使得最小。以下为搜索排序的主要代码:Analyzer analyzer = new CJ KAnalyzer () ; / / 解析器 query = QueryParser . Parse ( queryString ,“contents”, analyzer) ; / / 实现搜索if (searcher ! = null) thispage = maxpage ; hits = searcher . Search (query) ; total - num = hits. Length() ;/ / 结果的个数/ / 加亮显示程序Highlighter highlighter = new Highlighter ( new QueryScorer(query) ) ; highlighter. Set Text Fragmenter ( new SimpleFragmenter(100) ) ;/ / 显示搜索到的字符串的最大个数,同时排序int maxNumFragmentsRequired = 3 ; for (int i = 0 ;i hits. Length() ; i + + ) System. String text = hits. Doc (i) . Get (“contents”) ; TokenStream tokenStream = analyzer . TokenStream (“con2 tents”, new System. IO. StringReader (text) ) ; highlightedText = highlighter . GetBest Fragments( tokenStream , text , maxNumFragmentsRequired ,“”) ;检索页面:图 41 检索页面检索结果输出页面:图 42 检索“校园” 结果网页评分页面:对具体某个网的评分4.2.4 PDF等异构文本处理异构文本的文本格式与HTML类型的文件完全不同,必须进行相应的格式转换才能支持全文检索。在进行网页格式化时自动识别具体的文件类型和版本,调用相应的转换程序将异构文本转换为普通文本格式。并对该网页加入标记,在查询结果排序时提高该类型网页的优先级。PDF格式文件是Adobe公司开发的电子文件格式。这种文件格式与操作系统平台无关,可以在Windows,Unix或Mac OS等操作系统上通用。PDF文件将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。如果要抽取其中的文本信息,需要根据它的文件格式来进行解析。本搜索引擎的开发过程中利用PDFBox工具对该文件进行处理,提取文件内容,然后由索引器对文件内容进行索引。以下这行关键代码将PDF Documents加入

温馨提示

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

评论

0/150

提交评论