




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
厦门大学学士学位论文 本科毕业论文(科研训练、毕业设计)题 目:基于Nutch+Lucene搜索引擎的搭建 -搜索引擎技术的相关设计与分析姓 名:学 院:软件学院系:软件工程专 业:软件工程年 级: 学 号: 指导教师: 职称: 年 月35基于Nutch+Lucene搜索引擎的搭建 -搜索引擎技术的相关设计与分析摘要 电子邮件和搜索引擎长期以来一直是两项最受欢迎、最热门的互联网业务,特别是近年来,搜索引擎已发展到了一个鼎盛时期,继Yahoo之后,Google又以其搜索引擎的技术创新、专业风格创造了新的奇迹,在国内,百度也在很短时间里凭借搜索引擎取得很大成功。因此搜索引擎作为互联网行业的一个重大部分,对它的研究和建设对社会具有非常重要的意义。因此,本文在研究Web搜索引擎的基本原理、核心技术和处理流程的基础上,然后以开源代码Nutch和Lucene为例,通过研读代码以及查找相关资料,并通过Ajax技术搭建了一个基本的搜索引擎系统。不仅完成了整个搜索引擎的框架设计,而且基本上完成了开发工作。本文介绍了课题的研究背景和国内外搜索引擎的发展现状,并论述了搜索引擎的一些相关技术和工作原理,最后详细说明了搜索引擎系统的开发过程和方法。 关键词 搜索引擎 Nutch Lucene AjaxAbstract E-mail and search engine has long been the two most popular Internet business, especially in recent years, search engines have been developed to a peak period, following Yahoo, Google and its search engine technology innovation, professional style create a new miracle. In China,Baidu is also by virtue of a search engine receive a great achievement in very short period of time. So the Internet search engine as part of a major industry, its research and construction has very important significance for community. Therefore, this thesis on the basis of researching Web search engines, principles of core technologies and processes, then through Nutch open source code and Lucene as an example, read the code and find relevant information, finaly built a basic Search engine system by technology of Ajax. Not only to complete the whole framework of the search engine design, and also basically complete the development work. The article introduces the background of this topic and the development of domestic and international search engines, and discusses some relevant technology and principle of the search engine, at last explain the details of the processs and method of search engines system.Keywords Search engine Nutch Lucene Ajax目录第一章 绪论11.1 课题研究背景11.1.1 搜索引擎以及Nutch的由来11.1.2 国内外搜索引擎的现状11.1.3 搜索引擎的未来发展21.2 搜索引擎的工作原理21.2.1 搜索引擎的组成21.2.2 搜索引擎的分类3第二章 Nutch和Lucene相关技术及研究42.1 Nutch简介42.1.1 Nutch定义42.1.2 Nutch的体系结构42.1.3 Nutch的工作原理62.2 Lucene72.2.1 概述72.2.2 Lucene的系统结构82.2.3 Lucene的文件结构82.3 MapReduce92.4 WebDB10第三章 系统的概要设计113.1 系统的总体架构113.2 索引模块123.2.1 索引的建立123.2.2 索引的框架133.3 Ajax界面设计模块143.3.1 Ajax技术简介143.3.2 界面架构15第四章 系统的设计与实现174.1 设计平台及工具174.2 系统的详细设计174.2.1 索引部分的设计174.2.2 搜索结果显示的实现194.3 Ajax界面部分的实现214.3.1 客户端代码设计214.3.2 服务器端代码设计25第五章 系统实现功能和分析265.1 系统的运行结果以及分析265.2 自动完成的运行结果以及分析315.3 总的运行界面31结论33致谢34参考文献:35 ContentChapter 1 Introduction11.1 Background of topic11.1.1 Origin of search and nutch11.1.2 Development of domestic and international search engines11.1.3 The future of search engine21.2 Principle of work of search engine21.2.1 Elements of search engine21.2.2 Sorts of search engine3Chapter 2 Relevant technology and research of Nutch and Lucene42.1 Nutch briefly introduce42.1.1 Nutch defining42.1.2 Architecture of Nutch42.1.3 Principle of Nutch62.2 Lucene72.2.1 Summarize72.2.2 Architecture of Lucene82.2.3 File architecture of Lucene82.3 MapReduce92.4 WebDB10Chapter 3 General design of system113.1 The whole architecture of system113.2 Index module123.2.1 Foundation of index123.2.2 Framework of index133.3 Design module of Ajax interface143.3.1 Brief introduce of Ajax143.3.2 Framework of interface15Chapter 4 Design and implement of system174.1 Design platform and tools174.2 The detailed design174.2.1 Design of index174.2.2 Implement of search194.3 Implement of Ajax214.3.1 Design code on cilent214.3.2 Design code on server25Chapter 5 The implement and analysis of systematic function265.1 The results and analysis of system265.2 The results and analysis of autocomplete315.3 The whole running interface31Conclusion33Thanks34References35第一章 绪论第一章 绪论1.1 课题研究背景1.1.1 搜索引擎以及Nutch的由来搜索引擎是从1990年开始发展起来的,在之前,没有任何人能搜索互联网。所有搜索引擎的祖先,是1990年由Montreal的McGill University学生Alan Emtage、Peter Deutsch、Bill Wheelan发明的Archie(Archie FAQ)。1994年1月,第一个既可搜索又可浏览的分类目录EINet Galaxy(Tradewave Galaxy)上线。1994年4月,Stanford University的两名博士生,美籍华人Jerry Yang(杨致远)和David Filo共同创办了Yahoo,从此画上了搜索引擎开始的时代。而随着计算机与互联网的日益普及与应用,在10年左右的时间里互联网上至少产生了50亿的网页,浩如烟海的互联网信息极大地促进了搜索技术的蓬勃发展,诞生了我们熟知的Google,百度,Yahoo等一大批搜索引擎。据CNNIC统计,搜索引擎已成为继电子邮件之后的第二大Web应用。虽然说使用搜索引擎的网民数目越来越多,网络上海量信息的爆炸式增长1-2,但Web搜索引擎数目却在下降,并且很有可能进一步演变为少数公司的垄断,这显然不利于广大用户的利益。正是在这种情况下,Nutch诞生了,它的诞生为我们提供了不同的选择,它具备现代商业搜索引擎的基本功能,并采用依据网页本身的价值进行排序的算法,而不是商业引擎的竞价排名的算法,努力为用户提供最合理的搜索结果。1.1.2 国内外搜索引擎的现状早在1997年3,国外就出现了提供搜索引擎优化相关服务的机构,国外的网站也早就开始意识到搜索引擎优化对于网络营销的重要性。发展至今,SEO在国外已经是一门相当正规、成熟的行业。有大批的专业的公司,专业的技术人员在为广大客户网站提供全方位的搜索引擎优化服务。同时,搜索引擎优化技术也得到了广大网站管理者甚至搜索引擎在内多方面的认同。在2003年左右,国内开始出现了专门从事搜索引擎优化业务的个人及其相关机构。经过三年多的发展,国内目前已经出现了一定数量的专业从事SEO相关业务的公司和个人,但是总体来讲鱼龙混杂、多数规模较小、专业性也较差, 总体来说中国的SEO处于起步阶段,中国的SEO拥有巨大的市场,但是不可否认,国内的SEO还处于低水平阶段,面临着网站主重视程度不够、SEO作弊、SEO相互恶意攻击等很多不利因素,国内刚起步的的SEO们需要不断的探索,提高自身的业务水平,杜绝作弊等不正当SEO手段,尽快让SEO行业在中国成熟壮大,因此我们有必要对搜索引擎进行更多的研究。1.1.3 搜索引擎的未来发展伴随着互联网的崛起和兴衰,搜索引擎也经历了十几年的风风雨雨,其技术得到了飞速的发展,从之前第一代的雅虎这样的语形搜索引擎到现在的Google和Baidu这样的语义搜索引擎,其发展速度是如此之快,而Google和Baidu这样的搜索引擎的出现给网民带来了无尽的方便,不过在现有的技术下,毕竟还有些地方不够完美,比如在提高搜索引擎对用户检索提问的理解,对检索结果的处理和确定搜索引擎信息搜集范围,提高搜索引擎的针对性方面还有待进一步改善,说到底就是要更方便用户查询和提高检索效率,不过我相信随着技术的日益进步和搜索引擎的研究价值,这些还欠缺的不便和缺陷会得到进一步完善和改进,应该在不久的未来我们就会拥有我们最好的搜索引擎。1.2 搜索引擎的工作原理1.2.1 搜索引擎的组成搜索引擎一般由蜘蛛(也叫爬虫)、切词器、索引器、查询器几部分组成4。蜘蛛顾名思义就是用于追踪互联网发展规模及负责网页信息的抓取工作,世界上第一个Spider程序,是MIT Matthew Gray的World wide Web Wanderer,用于追踪互联网发展规模。刚开始它只用来统计互联网上的服务器数量,后来则发展为也能够捕获网址(URL),它从一组已知的文档出发,通过这些文档的超文本链接确定新的检索点,然后用机器人或蜘蛛周游这些新的检索点,标引这些检索点上的新文档,加入索引数据库组成倒排文档。因此如何从原始文档中抽取出全部有用信息,并将抽取的信息记录到索引库中是关键。一般情况下切词器和索引器是一起使用,它们负责将抓取的网页内容进行切词处理并自动进行标引,建立索引数据库。而查询器根据用户查询条件检索索引数据库并对检索结果进行排序和集合运算,如并集、交集运算,再提取网页简单摘要信息反馈给查询用户。1.2.2 搜索引擎的分类搜索引擎可以分为全文索引,目录索引和原搜索引擎这三大类5。全文搜索引擎是名副其实的搜索引擎,国外代表有Google,国内则有著名的百度搜索。它们从互联网提取各个网站的信息(以网页文字为主),建立起数据库,并能检索与用户查询条件相匹配的记录,按一定的排列顺序返回结果;目录索引虽然有搜索功能,但严格意义上不能称为真正的搜索引擎,只是按目录分类的网站链接列表而已。用户完全可以按照分类目录找到所需要的信息,不依靠关键词(Keywords)进行查询。目录索引中最具代表性的莫过于大名鼎鼎的Yahoo!、新浪分类目录搜索;元搜索引擎(META Search Engine)接受用户查询请求后,同时在多个搜索引擎上搜索,并将结果返回给用户。著名的元搜索引擎有InfoSpace、Dogpile、Vivisimo等。第二章 Nutch和Lucene相关技术及研究第二章 Nutch和Lucene相关技术及研究2.1 Nutch简介2.1.1 Nutch定义Nutch是一个开放源代码的Web搜索引擎,是以Lucene为基础实现的搜索引擎应用程序,Lucene为Nutch提供了文本索引和查询服务的API,而Nutch在Lucene的基础上实现了网页收集,因此Nutch在总体架构上分为网页收集,建立索引和查询服务。2.1.2 Nutch的体系结构Nutch作为一个搜索引擎,其基本组成也同其他搜索引擎一样。简单的说,包括爬虫,索引和搜索三部分6.爬虫的功能是通过定期收集和增量收集方式从互联网中抓去网页,爬到每一个网页的超连接并把这些网页地址保存下来,并将原始网页建立索引存入数据库中。索引部分的功能是从抓取过来的网页提取其中的URL,标题,内容等关键词,将不同格式的数据源转换成其内部可以识别的文件格式,然后建立倒排文件,即用文档中的关键词作为索引,文档作为索引目标的一种结构,从而建立并维护索引库;搜索的功能就是接受用户提交的查询词条,加以分词与过滤,在索引库及数据库中搜索相应的网页,并按照其内部评分算法对结果进行排序,返回结果。流程架构图如下所示:图2-1 Nutch工作流程图爬虫部分:最初的设计思想是考虑对页面的过滤7,不像普通爬虫对所有页面的链接进行处理,先对页面与受限领域的主题相关度进行分析,只有当其主题相关度符合要求时才处理该页面中的链接,因为如果该页面和本领域比较相关,它所包含的链接和领域相关的几率也比较大,这样就提高了爬行精度,虽然会遗漏少数页面,但综合效果是令人满意的。因此,主题相关度的分析是主体爬虫设计的关键8,最简单的可以基于关键词进行分析,更深入的可以上升到语义和概念层次。下图是主题爬虫的系统组成图:Html文档爬行模块相关度分析模块主体确立模块初始种子模块数据库 排序模块图2-2 主题爬虫的工作流程图系统的工作流程如下: 第一步:爬行模块取回网页; 第二步:调用相关度分析模块,对网页进行相关度分析; 第三步:爬行模块根据分析不同结果进行相应的处理; 第四步:爬行模块从数据库取出等待处理的URL继续工作; 第五步:对网页的重要程度进行排序9;而爬虫为了能够方便地处理链接和进行主题相关度计算,使系统各组成模块有机地协调运作,需要使用5个URL队列,每个队列保存着一处理状态的URL10:1等待队列:在这个队列中,URL等待被爬虫发现,新发现的URL被加入到该队列中;2处理队列:爬虫开始处理URL时,被传送到这一队列。为了保证同一个URL不能别多次处理,一个URL被处理后,就被移送到错误队列或者抛弃队列或者完成队列;3错误队列:如果在下载网页时发生错误,它的URL将被加入到错误队列,一旦移入错误队列,爬虫不会对它作进一步处理;4抛弃队列:如果下载没有发生错误,但主题相关度的计算结果小于一定的值,则放入该队列,一旦移入抛弃队列,爬虫不会对它作进一步处理;5完成队列:如果下载网页没有发生错误,且主题相关度的计算结果大于或等于一定的值,就要把从中发现的URL放入等待队列,处理完毕把它加入到完成队列,到达这一队列将等待排序模块的处理。2.1.3 Nutch的工作原理(1)建立初始URL 集(2)将URL 集注入crawldb 数据库-inject(3)根据crawldb 数据库创建抓取列表-generate(4)执行抓取,获取网页信息-fetch(5)更新数据库,把获取到的页面信息存入数据库中-updatedb(6)重复进行35 的步骤,直到预先设定的抓取深度。-这个循环过程被称为“产生/抓取/更新”循环(7)根据sengments 的内容更新linkdb 数据库-invertlinks(8)建立索引-index(9)用户通过用户接口进行查询操作(10)将用户查询转化为lucene 查询(11)返回结果6Nutch的工作原理图如下所示:图2-3 Nutch的工作原理图2.2 Lucene2.2.1 概述Nutch是以Lucene为基础实现的搜索引擎。Lucene是Apache软件基金会Jakarta项目组的一个子项目11,是一个用java写的开放源代码的全文检索引擎工具包,即它不是一个完整的全文搜索检索引擎,而是一个全文搜索引擎的架构,提供了完整的查询引擎和索引引擎及部分文本分析引擎。Lucene可以对任何数据做索引和搜索,不管数据源是什么格式,只要它能被转化为文字的形式,就可以被Lucene所分析利用,也就是说不管是Word,Html,PDF还是其他形式的文件只要可以从中抽取出文字形式的内容就可以被Lucene调用,就可以用Lucene对他们进行索引。2.2.2 Lucene的系统结构Lucene作为一个优秀的全文搜索引擎12,其系统结构运用了大量的面向对象的设计思想。首先是定义了一个与平台无关的索引文件格式,其次通过抽象将系统的核心组成部分设计为抽象类,具体的平台部分设计为抽象类,此外与具体平台相关的部分比如文件存储也封装为类,经过层层的面向对象编程的处理,最终达成一个低耦合、高效率、容易二次开发等的检索引擎系统13。Lucene的系统结构图如下图所示:图2-4 Lucene系统结构图2.2.3 Lucene的文件结构 为了实现高效的索引和检索,就必须具有良好的索引文件结构。Lucene的索引文件包括逻辑结构和物理结构。Lucene的每个索引文件都由一个或者多个片段Segment组成;每个片段都是一个可以被独立检索的模块,包含一定数量的文档(document),这里的文档可以是一个html页面,一个xml文档,或一个word文档14。Lucene索引文件中的核心文件包括:(l)索引项信息文件(term information file)。该文件存储了Lucene中的所有的索引项以及相关信息,主要由以下字段组成:1)字段Term Count记录了该索引文件中的索引项的个数;2)字段Document Frequency记录了有多少文档包含该索引项;3)字段Term记录了每个索引项的内容;4)字段Frequency Data指向索引频率文件(Term Frequency File);5)字段Position Data指向索引项位置文件(Term Position File);(2)索引项频率文件。该文件记录了每个索引项(term)在各个文档documenl)中的出现频率。这些信息为对搜索结构进行排序提供了重要信息。(3)索引项位置文件。该文件记录了每个索引项在各个文档中出现的位置信息,这些信息对实现精确查找exact phrase search)是必需的。2.3 MapReduceMapReduce是Google的一项重要技术,它是一个编程模型,用以并行计算。MapReduce 是Nutch中的分布计算层。它主要分为map 和Reduce 两步,输入和输出数据是包含一系列键-值对应的文件:Map和Reduce。Nutch在Map 阶段,输入数据被分割成由各个节点处理的连续的块,用户使用的map 功能将每个原始数据处理成中间数据集,通过该分割功能,每个中间数据被发送到Reduce 节点。分割是一个典型的hash过程,所有等键值的中间数据都将被发送到一个Reduce 节点。例如,如果一个map 操作输出以URL 为键值的数据,那么通过哈希值的分割就会发送中间数据以及给定的URL到一个Reduce节点。Reduce 节点将所有的输入数据进行排序,并使用一个提供给用户的Reduce函数输出已经排序的map,产生MapReduce过程的最终输出。所有带有给定键值的输入都将交由Reduce处理,即以URL 为健值的所有数据和URL 一起被传递给Reduce函数,并可能用于产生最终输出15-16。MapReduce的工作全图如下:图2-5 MapReduce的系统结构图2.4 WebDBNutch的数据库是一个WebDB,它不需要任何数据库的支持就能使用.因为它本身里面包含的WebDB是一个文件系统。 Webdatabase,也叫WebDB,其中存储的是爬虫所抓取网页之间的链接结构信息,它只在爬虫Crawler工作中使用而和Searcher的工作没有任何关系。WebDB内存储了两种实体的信息:page和link。Page实体通过描述网络上一个网页的特征信息来表征一个实际的网页,因为网页有很多个需要描述,WebDB中通过网页的URL和网页内容的MD5两种索引方法对这些网页实体进行了索引。Page实体描述的网页特征主要包括网页内的link数目,抓取此网页的时间等相关抓取信息,对此网页的重要度评分等。同样的,Link实体描述的是两个page实体之间的链接关系。WebDB构成了一个所抓取网页的链接结构图,这个图中Page实体是图的结点,而Link实体则代表图的边17。 在本程序中,这个WebDB也就是我们之后说到的crawldb以及linkdb,在我们爬取时所产生的文件夹下。第三章 系统的概要设计第三章 系统的概要设计3.1 系统的总体架构本系统是基于Nutch+Lucene的面向一个特定领域的搜索引擎,首先建立的是一个简单的基于Web的搜索界面,然后通过爬虫去获取一个URL的所有超链接并把数据和内容保存下来,再通过索引对这些网页按关键字进行索引编排成为一个索引库,也就相当于数据库,然后用户再通过输入关键字进行查询,得出结果,所有结果都由另一个web页面显示出来,最后再采用ajax技术对界面进行美化。系统流程图如下所示:URL文档用户Tomcat服务器 输入关键字访问索引库返回结果爬虫爬取建立Lucene索引库图3-1 搜索引擎系统的流程图我把整个系统设计分为两大部分:一部分为前台的搜索界面模块设计,另一部分为后台的模块设计。整个系统的总体结构如下所示:前台搜索界面显示模块 后台爬虫模块索引模块搜索与结果显示模块Ajax设计模块图3-2 系统的总体架构图3.2 索引模块3.2.1 索引的建立建立索引的过程我把它分为以下3步:1, 提取文本由于我们在搜索中经常会遇到不同类型的文件,所以为了使用Lucene对文档数据建立索引,第一步就是要把这些需要建立索引的文档数据转换成Lucene可以处理的类型。 2, 构建 Document这一步的主要目的就是将前面所提出来的文本组装成Lucene可以识别的格式来为索引的建立作准备。代码中我们用一个FileDocument这个类来构造Document的实例。3, 分析并建索在提取了需要Lucene建立索引的数据并起创建了Document之后,接下来就可以调用IndexWriter类的addDocument()方法来使Lucene建立索引。在这样的调用中,Lucene会首先对所要建立索引的数据进行分析(analysis)以使得在建立索引时可以更加容易地处理这些数据,然后索引器会按Lucene所规定的索引格式将数据写入索引文件18。索引的工作流程图如下所示: PDFHTMLWordParseParseParseAnalysisIndex图3-3 索引的工作流程图3.2.2 索引的框架爬取下来的url存放在crawl文件夹下,而内容在segment文件夹里,因此索引就是要实现把这内容和相关的网页关联起来,建立索引。构建索引的过程即是把待索引的文件加载到全文检索库中,总的来说包括以下几步:1,爬虫爬下来的内容存入数据库,然后通过文件处理转换成Lucene可以识别的文件;2,转换成的Document在入库前需要经过分词处理,也就是analysis这一步;3,将切分好的单词入库,共查询时用19。下面是索引过程的数据流图:爬虫数据库文件处理统一文件库中文分词建立索引索引库网页信息词语流索引信息Data 统一的文件格式 图3-4 索引的数据图3.3 Ajax界面设计模块3.3.1 Ajax技术简介 Ajax即异步JavaScript与XML,其技术框架主要包括JavaScript,XML,以及CSS等技术。在Ajax之前,Web站点强制用户进入提交/等待/重新显示范例,用户的动作总是与服务器的“思考时间”同步。Ajax提供与服务器异步通信的能力,从而使用户从请求/响应的循环中解脱出来。借助于Ajax,可以在用户单击按钮时,使用JavaScript和DHTML立即更新UI,并向服务器发出异步请求,以执行更新或查询数据库。当请求返回时,就可以使用JavaScript和CSS来相应地更新UI,而不是刷新整个页面。最重要的是,用户甚至不知道浏览器正在与服务器通信:Web站点看起来是即时响应的,我们可以用图表清晰的看出传统Web和加入了Ajax的Web有什么区别,如图所示:图3-5传统Web应用模型与AjaxWeb应用模型比较图Ajax的核心是JavaScript对象XmlHttpRequest,该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户20,下面我们就Ajax的一个自动完成功能来展开。自动完成功能是Ajax所有功能的一种,英文又叫autocomplete,也就是说当用户想输入一个关键词时,在不用用户输入完整的词的情况下,服务器通过用户输入的前几个字和数据库里的关键词相比较并显示出以用户输入的关键字开头的所有相匹配的关键词,这一功能的实现增强了用户的交互性也更方便用户查询。3.3.2 界面架构 我把界面设计总共分成包括两个部分,一个是搜索界面部分,一个是搜索结果显示的部分。搜索界面设计简单,它由一个text输入框和一个提交按钮以及产生自动完成时显示关键词的部分组成。而搜索结果显示部分则按照背景图片和搜索框,网页显示这两大部分组成。下面是搜索结果显示的阅览图:背景图片+搜索框网页内容网页标题下一页(按钮)图3-6 搜索结果显示的阅览图自动完成功能由用户按键向服务器提交,然后通过服务器判别按键值,再把相关的结果传递到客户端,系统图如下所示:客户端用户服务器按键 请求 响应数据下拉框提示图3-7 自动完成功能的系统图第四章 系统的设计与实现第四章 系统的设计与实现4.1 设计平台及工具开发工具:Eclipse 3.2;Cygwin;Tomcat 5.0;开发语言:JAVA JDK 1.5开发平台:Windows XP 上面的介绍工具基本上都是我们所熟知的开发工具,这里简要介绍一下Cygwin, cygwin是一个在windows平台上运行的Linux模拟环境,而由于运行Nutch自带的脚本命令都是在需要Linux环境,所以在要想在Windows下运行Nutch,就有必要安装Cygwin。4.2 系统的详细设计4.2.1 索引部分的设计1. 索引的建立上面已经说到索引的建立分为3大步,1是提取文本,2是构建Document对象,3是通过调用IndexWriter类的addDocument()方法来使Lucene建立索引。构建Document对象是通过Public Document document( File f )这个方法实现的,在document()方法中首先构造一个Document类型的实例,然后依次往Document对象中添加path,modified和contents这3个字段,最后返回生成的Document类型的对象doc。如下代码所示:Public Document document(File f) Document doc = new Document(); doc.add( Field.Keyword( “path”,f.getpath() ) );doc.add(Field.Keyword(“modified”,DateField.timeToString( f.lastModified() ) ) );FileInputStream is = new FileInputStream(f);Reader reader = new BufferReader( new InputStreamReader(is) );doc.add( Filed.Text(“contents”,reader) ); Return doc;2. 索引的添加 IndexWriter类是Lucene中最重要的类之一,它的功能就是将文档加入索引,同时控制索引过程中的各种参数。通常情况下,IndexWriter的构造函数包括了以下3个参数: (1) 索引存放的路径IndexWriter需要知道它要把索引创建在什么地方,因此,索引存放的路径也就必不可少。这个路径可以是一个String型的目录位置,也可以是经过封装的java.io.File对象,同时,还可以是Lucene自带的Directory类型的对象。(2) 分析器IndexWriter的构造函数中不可缺少的一项就是一个继承自org.apache.lucene.analysis.Analyzer类的分析器。它的主要功能是在IndexWriter将文档写入索引前,把文本信息切分成一个个可以进行索引的词条。 (3) 是否重新创建索引IndexWriter在建立索引时,需要知道是重新建立索引,还是进行增量的索引,是通过指定一个布尔型的值来完成这一任务的,当该布尔型的值为true时,IndexWriter不管目录内是否已经有索引了,一律清空,重新建立,而当为false时,则IndexWriter会在原有基础上增量添加索引20。添加索引的核心代码如下:public static class OutputFormat extends org.apache.hadoop.mapred.OutputFormatBase final AnalyzerFactory factory = new AnalyzerFactory(job); final IndexWriter writer = new IndexWriter(fs.startLocalOutput(perm, temp).toString(), new NutchDocumentAnalyzer(job), true);3. 索引的实现Indexer类如何把从segments里面把内容添加索引呢?用hadoop遍历所有segments 目录,将parseData文件序列化成ParseData类,从中获得各种资料然后调用插件进行索引,最后由ouputFormat类完成写入索引的工作。索引实现的核心代码如下:public void index(Path indexDir, Path crawlDb, Path linkDb, Path segments) throws IOException if (LOG.isInfoEnabled() LOG.info(Indexer: starting); LOG.info(Indexer: linkdb: + linkDb); /索引开始 中间通过JobConf加入内容参数,比如parsedata,paseText,代码如下:job.addInputPath(new Path(segmentsi, CrawlDatum.FETCH_DIR_NAME);job.addInputPath(new Path(segmentsi, ParseData.DIR_NAME);job.addInputPath(new Path(segmentsi, ParseText.DIR_NAME);最后由OutputFormat类写入索引:job.setOutputFormat(OutputFormat.class);/写入索引if (LOG.isInfoEnabled() LOG.info(Indexer: done); /完成索引这段代码实现了从linkdb和segment的索引,也就是把爬取下来的url和url里面的内容关联了起来,Nutch抓回来的页面内容是放在segments目录,lucene只会索引,不会存储原文内容,因此在查询时要以 segment与url作为外键,由FetchedSegments类根据hitsDetail从segments目录获得内容。4.2.2 搜索结果显示的实现 Nutch提供了一个Fascade的NutchBean类供我们使用,一段典型的代码如下所示:NutchBeanbean=newNutchBean();Queryquery=Query.parse(args0);Hitshits=bean.search(query,NUM_HITS,title,true);NutchBean实现了以下几个功能:一是按Title field来排序。二是支持分布式查询,如果有配置servers,就会使用hadoop的IPC系统,调用所有server上的nutchBeans,最后规约出总的结果。三是每个站点像Google一样只显示分数最高的一页,如果用户还想看同站的其他结果,就需要进一步调用API访问。四是生成Summary,从segments目录按segments和url 获得content, 并按一定算法抽取出像Google一样的包含关键字的文档片断。我们要做的只是在搜索结果显示的页面调用NutchBean就行,相关jsp代码如下所示:首先在search.jsp中import需要的类,代码如下:import=org.apache.nutch.html.Entitiesimport=org.apache.nutch.metadata.Nutchimport=org.apache.nutch.searcher.*import=org.apache.nutch.plugin.*import=org.apache.nutch.clustering.*import=org.apache.hadoop.conf.*import=org.apache.nutch.util.NutchConfiguration整个设计思路就是通过客户端输入关键字,输入的关键字由这段代码完成传送到服务器String queryString = request.getParameter(query),然后通过服务器把返回的信息传到客户端,所有数据之间的传递由这两个HttpServletRequest, HttpServletResponse方法来控制。通过调用NutchBean bean = NutchBean.get(application, nutchConf)来获得网页信息。核心代码如下:hits = bean.search(query, start + hitsToRetrieve, hitsPerSite, site, sort, reverse); Hit show = hits.getHits(start, realEnd-start);HitDetails details = bean.getDetails(show);Summary summaries = bean.getSummary(details, query);第一行代码表示了通过输入的关键字进行搜索,第二行表示获取网页的信息;details是存放网页的标题以及url的数组,而summaries则是存放网页相关的内容。其中显示网页标题的是这行代码 a href= class=STYLE4title是一个变量这用来传递从服务器端传来的搜索结果的网页,Entities.encode是来自import=org.apache.nutch.html.Entities这个包中的一个方法表示显示这个网页的标题。而这几行代码是用来获取搜索的网页的结果的:for (int i = 0; i length; i+) / 显示网页 Hit hit = showi; HitDetails detail = detailsi; String title = detail.getValue(title); String url = detail.getValue(url); String summary = summariesi.toHtml(true);这段代码用了一个循环来现实所有相匹配的网页信息,Hit 表示搜索出来的网页总数,tittle是标题,url是相应的网址,detail.getValue是调用HitDetails类中的一个方法,作用是传递值summary是表示网页的内容,通过调用import=org.apache.nutch.searcher.*中summary中的tohtml的方法,tohtml是把每个网页的相关内容显示出来。4.3 Ajax界面部分的实现4.3.1 客户端代码设计客户端总共包括3个文件,一个query.jsp,autocomplete.css,autocomplete.js;query.jsp也就是搜索界面,包
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年内蒙古恒正集团呼和浩特第二工贸有限公司招聘笔试参考题库含答案解析
- 2025年四川成都市金牛农发投资有限公司招聘笔试参考题库附带答案详解
- 幼儿园防拐安全教育
- 校园艺术节盛典-创造力促进个人成长
- 2025年中国赤磷阻燃剂数据监测研究报告
- 2025年中国衣橱拉篮市场调查研究报告
- 2025年中国节能保温砖市场现状分析及前景预测报告
- 2025年中国耐高温铝塑封口膜市场调查研究报告
- 2025年中国纸制品磨光项目投资可行性研究报告
- 2025年中国粪罐项目投资可行性研究报告
- 2025-2030中国叶黄素行业市场发展现状及竞争格局与投资发展研究报告
- 非全日制劳动合同协议
- 2025绿地集团购房合同样本
- 2025-2030再生胶产业规划专项研究报告
- 2025年人教版小学六年级下册趣味数学竞赛试卷(附参考答案)
- 珠宝展柜租赁合同协议
- 浙江2025年浙江省药品检查中心招聘笔试历年参考题库附带答案详解
- 一年级语文下学期期末过关考试题
- GB/T 37507-2025项目、项目群和项目组合管理项目管理指南
- DB32T 5058-2025制造业质量管理数字化水平评价规范
- 机器视觉试题答案及解析
评论
0/150
提交评论