【PHP开源代码栏目提醒】:网学会员为广大网友收集整理了,基于JAVA的源代码搜索引擎架构实现 - 讲义教程,希望对大家有所帮助!
北京工业大学硕士学位
论文基于JAVA的源
代码搜索引擎架构实现别:硕士专业:软件工程指导教师:朱青高鸿斌20071001摘嗄摘要互联网技术高速发展,互联网上的信息浩如烟海,人们更多习惯于在互联网上寻找自己的需求,如何更加有效的在互联网中获取需要的元素,就需要索引的帮助,目前的Web索引引擎技术正成为计算机科学界和信息产业界争相研究开发的对象。
搜索引擎是指在互联网上专门提供查询服务的一类网站,这些网站通过网络搜索软件或网站
登陆等方式,收集互联网上大量网站的页面,经过加工处理后建库,从而能够对用户提出的各种查询作出响应,提供用户所需的信息。
本文利用
开源的Lucene引擎架构设计并实现了一个可复用、.可扩展的搜索引擎系统Hicode,能够用来专门搜索web和本地数据中具有程序语言源
代码的文件,能够有效的定位用户所需要的某段程序源码及其源文件所在的位置。
本文先介绍了Lucene以及搜索引擎系统中要用到的
开源工具。
然后利用Java技术对搜索引擎的三个核心部分即爬虫、索引和搜索进行了实现。
爬虫部分采用了Java的多线程机制,使用线程池管理多个抓取线程,并发抓取网页。
索引和搜索部分利用Lucene引擎架构,实现了比Lucene自定义的中文分词更有效的中文分词。
最后给出了如何将源
代码搜索引擎集成到Liferay门户网站中,提供一个与用户交互的界面。
关键词:搜索引擎;Lucene;中文分词;线程;Liferay门户北京T业人’≯T行fi|j:1.’≯f?i论史AbstractThecontentsontheWebareincreasingexponentiallyastherapiddevelopmentoftheIntemet.TheproblemofhowtoobtaintheusefulinformationfromvastcontentsquicklyandaccuratelyisfacingUSwhilepeopleareenjoyingtheconvenienceoftheInternet.ThesolutionofthisproblemisWebSearchEngine.Nowdays,thethrivingofresearchonWebSearchEngineisakindofspecialwebpageavailableforInternetinformationretrieving.ItcollectsvariouswebpagesthroughrobotscalldeCrawler,andstorestheinformationgintodatabasesaftertheoriginalWebSearchEnginesearchstheindexesinitsdatabaseandfetchesrelativewebpagesfortheuser.Areuseable,extensiblesearhenginesystemwhichnameisHicodethathasbeenimplementdebyopen—sourcepakagenamed‘Lucene’.Itcallsearchthesourcecodefilewhichexistsinwebandlocalsystem.ItCanalsoeasilylocatethesegmentofsomesourcecodeandthepositionoftheoriginfile.TheLucenepakageandopen-souretoolswhichusedbyHicodesearchenginesystemisintroducedfirst.Thenthreebasiccomponents(Crawler,IndexerandSearcherareimplementdebyjavatechonology.TheCrawlercomonentisdesignwithmulti-threadtechonologybyusingthread—pooltomanagethecrawlthread,SOthecrawlercallparallellycrawlsthewebpages.ThecomponentsofIndexerandSearcherareusingtheLuceneframework.AnChineseWordSegmenterwhichismoteeffectivethanLucene’SoriginalsegmenterWasimplemented,TheserializationtechonologywhichcanimprovetheeffcientofindexingisusedbytheHicodeframework.TheJavaCCtoolisusedtoimprovethespeedofdevelopment.Atlast,theHicode’SintegretionwithLiferayportalisintroduced.KeyWords:SearchEngine;Lucene;ChineseWordSegment;Thread;LiferayU独创性声明本人声明所呈交的
论文是我个人在导师指导下进行的研究工作及取得的研究成果。
尽我所知,除了文中特别加以标注和致谢的地方外,
论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得北京工业大学或其它教育机构的学位或证书而使用过的材料。
与我一同工作的同志对本研究所做的任何贡献均已在
论文中作了明确的说明并表示了谢意。
签名:奄嘘日期:.7,枷7.12-.关于
论文使用授权的说明本人完全了解北京工业大学有关保留、使用学位
论文的规定,即:学校有权保留送交
论文的复印件,允许
论文被查阅和借阅;学校可以公布
论文的全部或部分内容,可以采用影印、缩印或其他复制手段保存
论文。
躲净亟-新盛名:鲞耋.趁遮嗍坐筇1幸绪论第1章绪论1.1搜索引擎背景及意义搜索引擎(SearchEngine)的发展史是伴随着web信息的迅速增加开始的。
从1994年丌始,引擎技术逐渐发展起来。
搜索引擎是因特网上专门提供查询服务的一类网站,它以一定的策略在互联网中搜集和发现信息,对信息进行理解、提取、组织和处理,并为用户提供检索服务,从而起到信息导航的目的。
用户的查询途径主要包括自由词、全文检索、主题词检索、分类检索及其它特殊信息的检索(企业、人名、电话黄页等)。
1.2国内外研究现状搜索引擎技术的研究,国外比中国要早近十年。
从最早的Aschie,到后来的Excite,以及Altvista、Overtuer、Google等搜索引擎面世,引擎技术经历了复杂的发展过程。
.国内开始研究搜索引擎是在上个世纪末本世纪初。
国内也建立了很多的搜索网站,比如:搜狐、新浪、百度、中搜等等。
搜索引擎系统按照信息搜集方法和服务提供方式的不同,可以分为三大类:1.目录式搜索引擎以人工方式或半自动方式搜集信息,由编辑员查看信息之后,人工形成信息摘要,并将信息置于事先确定的分类框架中。
信息大多面向网站,提供目录浏览服务和直接检索服务。
该类搜索引擎因为加入了人的智能,所以信息准确、
导航质量高。
缺点是需要人工介入,维护量大、信息量少、信息更新不及时。
这类搜索引擎的代表是:yahoo、looksmart、opendirectory、goguide等。
2.机器人搜索引擎由一个称为蜘蛛(spider)的机器人程序以某种策略自动地在互联网中搜集和发现信息,由索引器为搜集到的信息建立索引,由检索器根据用户的查询输入检索索引库,并将查询结果返回给用户。
服务方式是面向网页的全文检索服务。
该类搜索引擎的优点是信息量大、更新及时、毋需人工干预,缺点是返回信息过多,有很多无关信息,用户必须从结果中进行筛选。
这类搜索北京T,Ikk学T。
胛嘶-I7rf?,论史引擎的代表是:altavista、northernlight、excite、google等。
国内代表为:“天网”、’悠游、openfind。
3.元搜索引擎这类搜索引擎没有自己的数据,而是将用户的查询请求同时向多个搜索引擎递交,将返回的结果进行重复排除、重新排序等处理后,作为自己的结果返回给用户。
服务方式为面向网页的个文检索。
这类搜索引擎的优点是返回结果的信息量更大、更全,缺点是不能够充分使用所使用搜索引擎的功能,用户仍然要做更多的筛选。
这类搜索引擎的代表是:wchrawler、infomarket等。
目前搜索引擎提供的导航服务己经成为互联网上非常重要的网络服务,搜索引擎站点也被美誉为“网络门户”。
搜索引擎技术因而成为计算机工业界和学术界争相研究、开发的对象。
1.3本人的主要
工作内容搜索引擎也只是一个给用户提供服务的产品,需要长期的不断的改进升级调整,需要满足用户不断增长并且变化的需求,需要不断适应网络的变化。
在目前的硬件条件下,通用搜索引擎要及时更新以得到
网络上比较全面的信息是比较困难的。
用户使用google,baidu等通用搜索引擎的方式是通过关键字的方式实现的,是语义上的搜索,返回的结果倾向于知识成果,比如文章、
论文、新闻等,这些信息有可能都只是关键字匹配但并不是用户真正需要的。
针对这种情况,需要一个面向主题的、数据全面深入的专题搜索引擎。
目前己经存在一些专业的搜索引擎,比如法律、医学等专业信息检索系统。
对于
计算机行业来说,程序员需要一个方便的工具来搜索实现某些功能的源
代码或者程序编写技巧,这样既可以提高工作效率,也能避免重复劳动。
因此本文设计并实现了一个基于Lucene的源
代码搜索引擎系统Hicode,来实现快速而准确的源
代码搜索,以实现网络资源的共享。
,1.4本文的主要内容和结构本文主要是利用
开源的引擎架构,并为其添加了高效的中文分词,在此基础上设计并实现了一个可复用、可扩展的搜索引擎系统Hicode,能够对web和本地数据中具有程序语言源
代码的文件进行搜索和查询,能够有效的定位用户所需粥1辛绪沦要的某段程序源码及其源文件所在的位置。
在应用级别,本文首先分析了原理和架构,然后完整的给出了如何将源
代码搜索引擎集成到Liferay中。
全文内容安排如下:第一章,绪论:第二章,介绍了Lucene的原理和特点;第三章,介绍本文要使用的一些
开源工具;第四章,介绍搜索引擎系统Hicode各个模块;第五章,介绍如何将Hicode集成到Liferay中。
(注:文中搭建的操作平台采用SQLsever系统。
服务器配置为WindowsXPProfessionalSP2系统、SQLsever2000、ASP、PHP;服务器硬件配置为:imerP42.3G、WDS000JDSATA、2GDDR、R9600pro、100/1000M自适应,网络连接为10M光纤。
)第二申ftlCerle简介第2章.Lucene简介在各种检索方式中,全文检索(Full.textRetricval)作为一种面向全文、提供全文的新型检索技术,发展十分迅速,应用范围也越来越广泛,如网站内部信息的检索,用户数据库的检索等等,都具有很好的应用前景。
。
全文检索是指计算机索引程序通过扫描文章中的每…个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。
当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
全文检索系统中最为关键的部分是全文检索引擎,各种应用程序都需要建立在这个引擎之上。
一个全文检索应用的优异程度,根本上由全文检索引擎来决定。
所以在搜索引擎的实现中,本文
设计了目前非常优秀的搜索引擎架构。
Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源
代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。
Lucene的目的是为
软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
2.1Lucene‘的优点Lucene作为一个全文检索引擎,其具有如下突出的优点:1.索引文件格式独立于应用平台。
Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
2.在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。
然后通过与原有索引的合并,达到优化的目的。
3.优秀的面向对象的
系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
北京I、lP,i掌TPl,!|j11‘’j。
pp<4.设计了独征r语言和文件格式的文本分析器,索引器通过接受Token流完成索引文件的创‘伍,用厂’扩展新的语言和艾件格式,只需要实现艾本分析的接口。
5.己经默认实现了一套强大的查询引擎,用户勿需自己编写代石f5即使系统可获得强大的奄询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(FuzzySearch)、分组查询等等。
面对已经存舀:的商业全文检索引擎,Lucene加也具有相当的优势。
首先,它的开发源
代码发行方式(遵守ApacheSoftwareLicense),在此基础上程序员不仅仅可以充分的利用Lucene所提供的强大功能,而且可以深入细致的
学习到全文检索引擎制作技术和面相对象编程的实践,进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。
其次,Lucene秉承了开放源
代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在Lucene的基础上扩充各种功能,比如扩充中文处理能力,从文本扩充到HTML、PDF等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于Lucene恰当合理的对系统设备做了
程序上的抽象-/扩展的功能也能轻易的达到跨平台的能力。
最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享。
最后,虽然Lucene使用Java语言写成,但是开放源
代码社区的程序员正在不懈的将之使用各种传统语言实现(例如。
Netframework),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统管理员可以根据当前的平台适合的语言来合理的选择。
2.2Lueene的功能2.2.1Lucene中各包的功能Lucene源码中共包括7个子包,每个包完成特定的功能,下面列出了五个在本文的系统中要涉及到的包如表2.1所示:表2.1Lucene中主要包及其功能Table2??1LucenePackageIntroduction.6.第2搴Lucene简介鼍m—m;m.I-;__mm_m鼍曼曼皇曼曼皇皇曼曼曼笪‖≯∽咧锨r蛩’’包名b”一≯嘭?移炉{_^’‖“11’t,t1…红7莒善7≯凑§77乍U篇。
缓,搋:貔煮墨煮§施;l级施兹缎易。
么溉施。
‰荔荔i如。
,;眺锄赫么敦拓:辕妊≤;莲。
;妊i貔秭缘貔磊。
&瀛≯∞§§§女%嬲。
缀i缀§i鼎巍盘旋liii露缝磊《巍簇Org。
apache.1ucene。
analysis语言分板器,主要用于切词,对中文的支持主要是扩展此类Org.apache.1ucene.document索引存储时的文档结构管理,类似于关系型数据库的表结构Org.apache.1ucene.index索引管理,包括索上建立\删除等Org.apache.1ucene.queryPsrser查询分析器,实现查询关键词间的,●运算,如与域\非等Org.apache.1ucene.search检索管理,根据查询条件,检索得到结果2.2。
2Lucene的应用逻辑Lucene的功能是非常强大,但从根本上说,主要包括两块:??一是文本内容经切词后索引入库;??二是根据查询条件返回结果。
如图2-1所示是上述两大功能的逻辑图:北京T、也人学T千口硕卜学位论丈Searcher(查询)上!QueryParser(查询分析)Indexer(索引)上1.n吲啪en。
(文档)1storage(存储)配。
Llne功能逻辑图B。
。
,鼢~I查询逻辑.按先后顺序;查询逻辑可分为如下几步:1.查询者输入查询条件,条件之间可以通过特定运算符进行运算,如希望查询到与“中国”和“西安”相关的记录,但不希望结果中包括“兵马俑”,于是输入条件为“中国+西安.秦始皇兵马俑”。
2.
查询条件被传达到查询分析器中,分析器将对“中国+西安.秦始皇兵马俑”进行分析,首先分析器解析字符串的连接符,即这里的加号和减号,然后对每个词进行切词,一般最小的词元是两个汉字,则中国和西安两个词不必再切分,但对秦始皇兵马俑需要切分,假设根据切词算法,把该词切分为“秦始皇”和“兵马俑”两部分,则最后得到的查询条件可以表示为:“中国”AND“西安”ANDNOT(“秦始皇”AND“兵马俑”)。
3.查询器根据这个条件遍历索引树,得到查询结果,并返回结果集。
4,将返回的结果集显示在查询结果页面,当点击某一条内容时,可以链接到原始网页。
这就是查询的逻辑过程,需要说明的是,Lucene默认只支持英文,为了便于第2节|.ucene简介置皇曼曼鼍曼舅。
一IoIIo…mI,I皇曼曼量量曼量量皇鲁曼曼量量量舅量说明J’口J题,以上查询过程采川中文举例,事实上,当Lucene被扩充支持中文后就是这么一个查询过程。
入库逻辑入库将把内容加载到全文检索库中,按顺序,入库逻辑包括如下过程:1.入库者定义到库中文档的结构,比如需要把网站内容加载到全文检索库,让用户通过“站内检索”搜索剑相关的网页内容。
入库文档结构与关系型数据库中的表结构类似,每个入库的文档由多个字段构成,假设这里需要入库的网站内容包括如下字段:文章标题、作者、发布时间、原文链接、正文内容(一般作为网页快照)。
.2.包含N个字段的文档(DOCUMENT)在真正入库前需要经过切词(或分词)索引,切词的规则由语言分析器(ANALYZER)完成。
3.切分后的“单词”被
注册到索引树上,供查询时用,另外也需要也其它不需要索引的内容入库,所有这些是文件操作均由STORAGE完成。
以上就是记录加载流程,索引树是一种比较复杂的数据存储结构,将在索引模块中介绍,这里就不赘述了,需要说明的一点是,Lucene的索引树结构非常优秀,是Lucene的一大特色。
Lucene可以为应用程序添加索引和搜索能力。
Lucene可以索引并能使得可以转换成文本格式的任何数据能够被搜索:Lucene并不关心数据的来源、格式甚至它的语言,只要能将它转换为文本。
这就意味着可经索引并搜索存放于文件中的数据包括:在远程服务器上的web页面,存于本地文件系统的文档,简单的文本文件,微软Word文档,HTML或PDF文件或任何其它能够提取出文本信息的格式。
同样,利用Lucene可以索引存放于数据库中的数据,提供给用户很多数据库没有提供的全文搜索的能力。
一旦集成了,应用程序的用户就能够像这样来搜j-7索:+Bill.Gate+movie.microsoft,表示搜索“比尔”和“电影”,但不包括“盖茨”和“微软”这两个关键词的文件:Apple-pie+computer,表示搜索“苹果电脑”而不是“苹果派”等等。
利用Lucene,可以索引和搜索email邮件,邮件列表档案,即时聊天记录,Wiki页面等更多内容。
.9.,tt京Tqk人学TfI.1mf’’,fji沦丈2.3Lcuene中主要使用到的类2.3.1核心索引类1.IndexwriterIndexWriter是在索引过程中的中心组件。
这个类创建一个新的索引并且添加文档到一个已有的索引中。
可以把IndexWriter想象成让可以对索引进行写操作的对象,但是不能读取或搜索。
2.DirectoryDirectory类代表一个Lucene索引的位置。
它是一个抽象类,允许它的子类(其中的两个包含在Lucene中)在合适时存储索引。
一个简单的实现就是使用一个实际文件系统目录的路径传递给IndexWriter的构造函数来获得的Directory的一个实例。
IndexWriter然后使用Directory的一个具体实现FSDirectory,并在文件系统的一个目录中创建索引。
r在~般的应用程序中,可能倾向于将Lucene如索引存储在磁盘上。
这时可‘以使用,一个包含文件系统真实文件
列表的Driectory子类。
另一个Dircetory的具体子类是RAMDirectory。
尽管它提供了与FSDirectory相同的接El,.RAMDirectory将它的所有数据加载到内存中。
所以这个实现对较小索引很有用处,可以全部加载到内存中并在程序关闭时销毁。
因为所有数据加载到快速存取的内存中而不是在慢速的硬盘上,RAMDirectory适合于需要快速访问索引的情况,不管是索引或搜索。
做为实例,Lucene的开发者在所有他们的单元测试中做了扩展使用,当测试运行时,快速的内存驻留索引被创建,当测试结束时,索引自动销毁,不会在磁盘上留下任何残余。
当然,在将文件缓存到内存的操作系统中使用时,RAMDirectory和FSDirectory之|、日J的性能差别较小。
3.Analyzer在文本索引之前,文本先通过Analyzer。
Analyzer在IndexWriter的构造函数中指定,用来对文本内容提取关键词并除去其它的内容。
如果要索引的内容不是普通的文本,首先要转化成文本。
Analyzer是个抽象类,但是Lucene中有几弼2币LUCCIIt2-jj!{j个它的实现。
有的时候处理跳过终止词(不能用束把某个文件与其它文件区分丌的常用的词,例如’the“a”of’等);有的时候处理把关键字转化为小写字母(所以这个搜索不是大小写敏感的)等等。
Analyzer是Lucene的一个重要的部分并不只是在输入过滤中使用。
对一个将Lucene集成到应用程序中的开发者柬说,对Analyzer的选择是程序设计中的重要元素。
4.Document一个Document代表字段的集合。
可以把它想象为以后可获取的虚拟文档的一块数据,如一个网页、一个邮件消息或一个文本文件。
.一个文档的字段代表这个文档或与这个文档相关的元数据。
文档数据的最初来源(如一条数据库记录、一个Word
文档、一本书的某一章等)与Lucene无关。
元数据如作者、标题、主题、改日期等等,分别做为
文档的字段索引和存储。
Lucene只用来处理文本。
Lucene的核心只能用来处理java、string和java.io.Reaedr。
尽管很多文档类型都能被索引并使之可搜索,处理它们并不像可以简单地转化为java的String或Reader类型的纯文本内容那样直接,本文设计了一种插件机制来处理不同类型的文档,这种插件机制将在本文的4.2.1中详细介绍。
在Indexer中处理文本文件时,对找出的每个文本文件,创建一个Document类的实例,用.Field(字段)组装它,并把这个Document添加到索引中,完成对这个文件的索引。
5.Field在索引中的每个Document含有一个或多个字段,具体化为Field类。
每个字段相应于数据的一个片段,将在搜索时查询或从索引中重新获取。
Lucene提供四种不同的字段类型:Keyword,不被分析,但是被索引并逐字存储到索引中。
这个类型适合于原始值需要保持原样的字段,如URL、文件系统路径、日期、个人名称、社会安全号码、电话号码等等。
Unlndexed,不被分析也不被索引,但是它的值存储到索引中。
这个类型适合于需要和搜索结果一起显示的字段(如URL或数据库主键),而不直接搜索它的值。
因为这种类型字段的原始值存储在索引中,所以磁盘空间受到限制的情.11.Jt泵lqE人‘了’IH¨},’7。
{、,论正况F这种类型不适合于存放比较巨大的值。
UnStored和Unlndexed相反。
这个字段类型被分析并索引但是不存储在索引中。
它适合于索引大量的文本而不需要以原始形式重新获得它。
例如网页的主体或任何其它类型的文本文档。
Text,被分析并索引。
这就意味着这种类型的字段可以被搜索,但是要小心字段大小。
如果要索引的数据是一个String,它也被存储但如果数据是来自一个Reader,它就不会被存储。
这通常是混乱的来源,所以在使用Field,Text时要注意这个区别。
所有字段由名称和值组成。
使用哪种字段类型取决于要如何使用这个字段和它的值。
表2.2提供了不同字段特征的总结,显示字段如何创建以及基本的使用示例。
表2.2不同字段类型的特征和使用方法Table2-2Differenttypesoffeaturesandfield.USeFieldmethod/type。
分析索引存储Field.Keyword(String,String)√√电话号码,身份Field.Keyword(String,Date)●证号码,姓名,日期等Field.UnIndexed(St^ng,String)√文档类型(PDF,HTML等)Field.UnStorde(String,String)√文档标题和内容Field.Text(String,String)√√文档标题和内容Field.Text(String,Reader)√√√文档标题和内容所有字段类型都能用代表字段名称和它的值的两个String来构建。
另外,一个Keyword字段可以接受一个String和一个Date对象,Text字段接受一个String和一个Reader对象。
这些值在被索引之前都先被转化成Reader,这些附加方法弗!节【。
uCene彻介的存在可以提供比较友好的API。
注意Field.Text(String,String)和Field.Text(String,Reader)之阳J的区别。
String变量存储字段数崭i,而Reader变量不存储。
要索引一个String而又不想存储它时,可以用Fidld。
UnStorde(String,String)。
在使用Lucene来索引时会经常用到这几个类。
为了实现基本的搜索功能,还需要熟悉几个Lucene的搜索类。
2.3.2核心搜索类Lucene提供的基本搜索接口和索引的一样直接。
只需要几个类来执行基本的搜索操作1.IndexSearcher??IndexSearcher是Lucene中最基本的检索工具,所有的检索都会用到IndexSearcher检索工具,但是在使用IndexSearcher之前,还要做一些准备1:作,即对检索工具IndexSearcher进行初始化。
初始化IndexSearcher,需要设置索引存放的路径,这样才能让查询器定位索引,用后面进行搜索。
以下为一个实例化IndexSearcher的过程:Searchersearcher=newIndexSearcher(indexDir);返回的结果是IndexSearcher类的一个实例,indexDir表示索引文件的存放路径。
当然,初始化IndexSearcher不只这一种方式,还可以通过增加IndexSearcher的方法来实例化:AnalyzerluceneAnalyzer=newStrandardAnalyzer();IndexWriteindexWriter=newIndexWriter(indexDir,luceneAnalyzer,true);IndexSearher用来搜索IndexWriter已经索引的数据。
可以把IndexSearcher想象为以只读方式打开索引的一个类。
它提供几个搜索方法,其中一些在抽象基类Searcher中实现,最简单的方法是接受单个Query对象做为参数并返回一个Hits对象。
这个方法的典型应用如下所示:北;Jjf、IP,、+产T十Yfl91f’7’1,i论(IndexSearheris=newlndexSearcher(FSDirectory.getDirECtory(“tmp/index”,false));Queryq=newTermQuery(newTrem(“contents”,”lucene”));Hitshits=is.search(q);2.TermTerm是搜索的基本单元。
与Field对象类似,它由一对字符串元素组成:字段的名称和字段的值。
Term对象也和索引过程有关,但是它们是由Lucene内部生成,所以在索引时一般不必考虑它们。
在搜索时,可能创建Term对象并与TermQuery同时使用。
Queryq=newTermQuery(newTerm(“contents”,”lucene”));Hitshits=is.search(q);这段
代码使Lucene找出在contents字段中含有单词lucene的所有文档.因为TermQuery对象继承自它的抽象父类,可以在等式的左边为Query类型。
3.Query.Query的中文意义就是“查询”。
在Lucene中,它是一个很重要的概念,就是指对于需要查询的字段采用什么样的方式进行查询,如模糊查询、语义查询、短语查询、范围查询、组合查询等。
Lucene中包含一些Query的具体子类。
到目前为止,在本章中仅提到过最基本的LuceneQuery;TermQuery。
TermQuer是Lucene支持的最基本的查询类型,并且它也是最原始的查询类型之一。
它用来匹配含有指定值的字段的文档。
正是因为Query的存在,Lucene才有了非常丰富的查询语言。
在使用Qucene之前,需要首先生成一个Qucery对象。
Lucene既允许直接生成一个Query类型的对象,也允许使用QueryParser类的parse方法来返回一个Qucery类型的对象。
这两种方法在功能上是完全一样的,只是后者在使用时更方便一些,前者则更为灵活。
4.Hits在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成第2辛Iucenc简介搜索的日的。
在Lucene中,搜索的结果的集合是用Hits类的实例来表示的。
Hits对象lf|主要方法有:Length:返回搜索结粜的总数。
Doc(intn)返回第n个文档。
Iterator:返回一个迭代器。
Hits类是一个搜索结果(匹配给定查询的文档)文档队列指针的简单容器。
基于性能考虑,Hits的实例并不从索引中加载所有匹配查询的所有文档,而是每次一小部分。
Hits对象也是采用延迟加载的方式返回结果的,当要访问某个文档时,Hits对象就在内部对Lucene的索弓}又进行一次检索,最后才将结果返回到页面显示。
2.4小结本章首先对Lucene做了简单介绍,。
介绍了其优点以及功能,然后叙述了Lucene的查询逻辑和入库逻辑,最后说明了本文主要使用到的Lucene中的核心索引类以及核心搜索类。
第1誓
开源T具介绍第3章
开源工具介绍3.1HttpClientHTTP协议可能是现在Intemet上使用得最多、最重要的协议了,越来越多Java的应用程序需要直接通过HTTP协议来访问网络资源。
虽然在JDK的java.net包中己经提供了访问HTTP协议的基本功能,但是对于大部分应用程序来说,JDK库本身提供的功能还不够丰富和灵活。
HttpClint是ApacheJakartaCommon下的子项日,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且支持HTTp协议最新的版本和建议。
其主要功能包括:基于标准,纯正iava,实现了HTTP/1.0和1.1;在一个可扩展的OO框架内,实现了HTTP的全部方法(GET,POST,PUT,DELETE,HEAD,OPTIONSandTRACE);支持HTTPS(ssl上的HTrP)的加密操作;透明地穿过H兀P代理建立连接;遵循theApacheSoftwareLicense协议,源码
免费可得等。
HttpClinent已经应用在很多的项目中,比如ApacheJakarta上很著名的另外两个
开源项目Cactus和HTMLUnit都使用了HttpClinem。
在搜索引擎系统Hicode的网页抓取模块中,使用到了HttpClient。
本节主要介绍HttpClient的特点、功能以及使用方法,具体在本系统中的实现和与各模块之前的关系将在网页抓取模块详细介绍。
3.1.1几种
常用方法HttpClient支持的HTTP方法有8种,下面介绍其中比较常用的几种。
1.OptionsHTTP的Options方法用来向服务器发送请求,希望获得针对由请求URL(REQUESTurl)标志的资源在请求应答的
通信过程可以使用的功能选项。
通过这个方法,客户端可以了解服务器提供的功能。
这个方法最典型的应用,就是用来获取服务器支持哪些HTTP方法。
HttpClient中有一个类叫OptionsMethod,来支持这个HTTP方法,利用这个类的getAllowedMethods方法,就可以很简单地实现上述的典型应用。
.17.It.:-r、h.