学位论文全文搜索引擎的设计与实现.docx
《学位论文全文搜索引擎的设计与实现.docx》由会员分享,可在线阅读,更多相关《学位论文全文搜索引擎的设计与实现.docx(70页珍藏版)》请在冰豆网上搜索。
学位论文全文搜索引擎的设计与实现
作者声明
本人郑重声明:
所呈交的学位论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
本人完全了解有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理机构送交论文的复印件和电子版。
同意省级优秀学位论文评选机构将本学位论文通过影印、缩印、扫描等方式进行保存、摘编或汇编;同意本论文被编入有关数据库进行检索和查阅。
本学位论文内容不涉及国家机密。
论文题目:
全文搜索引擎的设计与实现
作者单位:
江汉大学数学与计算机科学学院
作者签名:
XXX
2013年5月20日
学士学位论文
论文题目全文搜索引擎的设计与实现
(英文)Full-textsearchenginedesignandImplementation
学院数学与计算机科学学院
专业计算机科学与技术
班级B09082021
姓名XXX
学号200708202137
指导老师YYY
2013年5月20日
摘要
目前定制和维护搜索引擎的需求越来越大,对于处理庞大的网络数据,如何有效的去存储它并访问到我们需要的信息,变得尤为重要。
Web搜索引擎能有很好的帮助我们解决这一问题。
本文阐述了一个全文搜索引擎的原理及其设计和实现过程。
该系统采用B/S模式的JavaWeb平台架构实现,采用Nutch相关框架,包括Nutch,Solr,Hadoop,以及Nutch的基础框架Lucene对全网信息的采集和检索。
文中阐述了Nutch相关框架的背景,基础原理和应用。
Nutch相关框架的出现,使得在java平台上构建个性化搜索引擎成为一件简单又可靠的事情。
Nutch致力于让每个人能很容易,同时花费很少就可以配置世界一流的Web搜索引擎。
目前国内有很多大公司,比如XX、雅虎,都在使用Nutch相关框架。
由于Nutch是开源的,阅读其源代码,可以让我们对搜索引擎实现有更加深刻的感受,并且能够更加深度的定制需要的搜索引擎实现细节。
本文首先介绍了课题研究背景,然后对系统涉及到的理论知识,框架的相关理论做了详细说明,最后按照软件工程的开发方法逐步实现系统功能。
关键词
Nutch、Solr、Hadoop、Lucene、搜索引擎
Abstract
Currently,therequirementofcustomizingandthesearchenginemaintenanceislargerandlarger.Fordealingwithsuchenormousnetworkdata,especially,howtostoreitandaccessournecessaryinformationhasbecomesosignificant.However,websearchenginecanhelpustosolvethisproblemwell.
This acticle describes the principle of full-text search engine,and the process for its design and implementation. This system adopts Java Web platform with B/S model, and also the relative frame of Nutch, including Nutch,Solr,Hadoop, and collection and inspection for wholenetwork information based on Lucene--the foundation of Nutch. All in all, this text mainly elaborates the backgroud of relative frame, basical principle, and application for Nutch.
The appearance of Nutch related framework, makes that building an personalized search engine based on Java platform to be an simple and reliable way. Nutch is committed to make everyone configure a word-class web search engine easily and low-costly.At present, there are many big companies at home, like baidu, yahoo, are using such Nutch relative frame. Due to the fact that Nutch is open-source, reading its source code can let us have a more profound experience when realizing the search engine, and at the same time, can custojmize the needed details for realizing the seach engine deeply.
Atfrist,thisarticleintroducesthebackgroundofresearchproject.Then,itspecificallydescribesthetheoreticalknowledgeofsystemandtherelatedtheoryofframework.Finally,itachievesthesystemfunctionstepbystepaccordingtothedevelopmentmethodofsoftwareengineering.
Keywords
Nutch、Solr、Hadoop、Lucene、SearchEngine
1绪论
1.1课题背景及介绍
随着互联网的快速发展,越来越丰富的信息呈现在用户面前,但同时伴随的问题是用户越来越难以获得其最需要的信息。
为了解决此问题,出现了网络搜索引擎。
网络搜索引擎中以基于WWW的搜索引擎应用范围最为广泛。
网络搜索引擎是指对WWW站点资源和其它资源进行索引和检索的一类检索机制。
全文搜索引擎是目前最为普及的应用,通过从互联网上提取各个网站的信息(以网页文字为主)建立数据库,用户查询的时候便在数据库中检索与用户查询条件相匹配的记录,最终将匹配的那些记录,按一定的排列顺序显示给用户。
国外具代表性的全文检索搜索引擎有Google、Yahoo、Bing等,国内著名的有XX、中搜等。
目前网络中的资源非常丰富,但是如何有效的搜索信息却是一件困难的事情。
建立搜索引擎就是解决这个问题的最好方法之一。
该课题要求设计一个Web应用程序,学习搜索引擎的基本原理和设计方法,应用开源的全文搜索引擎Lucene框架和Lucene的子项目Nutch实现一个全文搜索引擎。
1.2课题研究目的及应用
针对搜索引擎广阔的应用前景以及分析国内外搜索引擎的发展现状,根据搜索引擎系统的工作原理设计一种基于Internet的全文搜索引擎模型,它从互联网上获取网页,建立索引数据库,并采用数据库管理作业和多线程技术以提高全文搜索的性能和效率,从技术上可以适用于任何有全文搜索需求的应用。
1.3课题研究范围
一般来说搜索引擎都由:
用户接口,搜索器,索引生成器和查询处理器4个部分组成。
用户接口的作用是输入用户查询、显示查询结果、提供用户相关性反馈机制。
主要的目的是方便用户使用搜索引擎,高效率、多方式地从搜索引擎中得到有效、及时的信息。
用户接口的设计和实现使用人机交互的理论和方法,以充分适应人类的思维习惯。
搜索器用于WWW的遍历和网页的下载。
从一个起始URL集合开始,顺着这些URL中的超链(Hyperlink),以宽度优先、深度优先或启发式方式循环地在互联网中发现信息。
索引生成器对搜索器收集到的网页和相关的描述信息经索引组织后存储在索引库中。
查询处理器的功能是根据用户的查询在索引库中快速检出文档,进行文档与查询的相关度评价,对将要输出的结果进行排序,并实现某种用户相关性反馈机制。
1.4小结
本章内容主要介绍了课题背景,课题目的,及课题的研究方法与内容这些方面。
阐述了搜索引擎在显示应用中的重要性,目前全文搜索引擎的工作组成部分以及各个工作组成部分到底是什么。
下面将具体介绍全文搜索引擎的相关理论,使读者全文搜索引擎的基本技术有所了解,为后续章节的阅读打下基础。
2搜索引擎相关理论研究
2.1Web搜索引擎原理和结构
全文搜索引擎是一款网络应用软件系统,论文中全部以搜索引擎称。
最基本的搜索引擎应该包含三个模块:
网页搜集,预处理,查询服务。
事实上,这三个部分是相互独立、分别工作的,主要的关系体现在前一部分得到的数据结果为后一部分提供原始数据。
2.1.1搜索引擎三段式工作流程
三者的关系如图2-1:
图2-1搜索引擎三段式工作流程
在介绍搜索引擎的整体结构之前,现在借鉴《计算机网络——自顶向下的方法描述因特网特色》一书的叙事方法,从普通用户使用搜索引擎的角度来介绍搜索引擎的具体工作流程。
自顶向下的方法描述搜索引擎执行过程:
1.用户通过浏览器提交查询的词或者短语P,搜索引擎根据用户的查询返回匹配的网页信息列表L;
2.上述过程涉及到两个问题,如何匹配用户的查询以及网页信息列表从何而来,根据什么而排序?
用户的查询P经过分词器被切割成小词组并被剔除停用词(的、了、啊等字),根据系统维护的一个倒排索引可以查询某个词pi在哪些网页中出现过,匹配那些都出现的网页集即可作为初始结果,更进一步,返回的初始网页集通过计算与查询词的相关度从而得到网页排名,即PageRank,按照网页的排名顺序即可得到最终的网页列表;
3.假设分词器和网页排名的计算公式都是既定的,那么倒排索引以及原始网页集从何而来?
原始网页集在之前的数据流程的介绍中,可以得知是由爬虫spider爬取网页并且保存在本地的,而倒排索引,即词组到网页的映射表是建立在正排索引的基础上的,后者是分析了网页的内容并对其内容进行分词后,得到的网页到词组的映射表,将正排索引倒置即可得到倒排索引;
4.网页的分析具体做什么呢?
由于爬虫收集来的原始网页中包含很多信息,比如html表单以及一些垃圾信息比如广告,网页分析去除这些信息,并抽取其中的正文信息作为后续的基础数据。
2.1.2搜索引擎整体结构
图2-2搜索引擎整体结构
爬虫从Internet中爬取众多的网页作为原始网页库存储于本地,然后网页分析器抽取网页中的主题内容交给分词器进行分词,得到的结果用索引器建立正排和倒排索引,这样就得到了索引数据库,用户查询时,在通过分词器切割输入的查询词组并通过检索器在索引数据库中进行查询,得到的结果返回给用户。
无论搜索引擎的规模大小,其主要结构都是由这几部分构成的,并没有大的差别,搜索引擎的好坏主要是决定于各部分的内部实现。
有了上述的对与搜索引擎的整体了解,下面对搜索引擎的各个模块进行说明。
2.2网页收集
全文检索是工作在某个数据集合上的程序,他需要事先由页面抓取程序,在全网中抓取海量网页,这个抓取程序也叫网络爬虫或Spider。
只有事先抓取了足够多的网页数据,并处理之,才能对大量的用户查询提供及时的响应。
2.1.2爬虫的工作流程
网页收集的过程如同图的遍历,其中网页就作为图中的节点,而网页中的超链接则作为图中的边,通过某网页的超链接得到其他网页的地址,从而可以进一步的进行网页收集;图的遍历分为广度优先和深度优先两种方法,网页的收集过程也是如此。
综上,Spider收集网页的过程如下:
从初始URL集合获得目标网页地址,通过网络连接接收网页数据,将获得的网页数据添加到网页库中并且分析该网页中的其他URL链接,放入未访问URL集合中用于网页收集。
下图表示了这个过程:
图2-3Spider工作流程
2.1.3爬虫的抓取策略
爬虫的工作策略一般分为累积式抓取(cumulativecrawling)和增量式抓取(incrementalcrawing)两种。
累积式抓取是指从某一个时间点开始,通过遍历的方式抓取系统所能允许存储和处理的所有网页。
在理想的软硬件环境下,经过足够的运行时间,积累是抓取策略可以保证抓取到相当规模的网页集合。
但由于Web数据的动态特性,集合中的网页的抓取时间点是不同的,页面被更新的情况也不同,因此累积式抓取到的网页集合事实上并无法与真实环境中的网络数据保持一致。
与累积式抓取不同,增量式抓取是指在具有一定量规模的网页集合的基础上,采用更新数据的方式选取已有集合中的过时页面进行抓取,以保证所抓取的数据与真实网络数据足够接近。
进行增量式抓取的前提是,系统已经抓取了足够数量的网络页面,并具有这项页面被抓取的时间信息。
面对实际应用环境的网络蜘蛛设计中,通常既包含累积式抓取,也包括增量式抓取的策略。
累积式抓取一般用户数据集合的整体建立或大规模更新阶段;而增量式抓取则主要针对数据集合的日常维护和及时更新。
2.1.4链接数据库的建立
初始URL的建立有两种方式:
超链接和站长提交。
超链接:
爬虫会根据种子地址(可能是最先提交给爬虫的URL集合)抓取页面。
站长提交:
在实际运行中,爬虫不可能抓取所有的站点,为此,网站站长可以向搜索引擎进行提交,要求收录,搜索引擎经过核查后,便将该网站加入到URL集合中,进行抓取。
2.1.5链接数据库的更新
链接的注入:
抓取程序会根据预先提供的URL集合进行标准化,根据设定的正则检验来过滤URL,将这些符合标准的URL放入到map中,并在构造map过程中给URL初始化得分,分数可以影响URL对应主机的搜索排序和采集优先级。
接着会判断URL在抓取数据库中是否存在,如果存在,删除旧的,更新新的。
如果不存在,将该URL的状态标记为未采集过。
URL生成器:
从抓取回来的网页中,将符合条件的URL提出出来,检测URL是否在有效更新时间里面,并将URL载入相应的任务组,计算URL的hash值,搜集URL,直至达到规定的广度。
2.3网页预处理
网页预处理的主要目标是将原始网页通过一步步的数据处理变成可方便搜索的数据形式。
预处理模块的整体结构如下:
图2-4预处理模块的整体结构
通过爬虫的收集,保存下来的网页信息具有较好的信息存储格式,但是还是有一个缺点,就是不能按照网页URL直接定位到所指向的网页。
所以,需要先建立网页的索引,如此通过索引,这样可以很方便的从原始网页库中获得某个URL对应的页面信息。
之后,处理网页数据,对于一个网页,首先需要提取其网页正文信息,其次对正文信息进行分词,之后再根据分词的情况建立索引和倒排索引,这样,网页的预处理也全部完成。
2.3.1建立索引页面库
索引的主要过程:
图2-5索引的主要过程
索引过程可分为三个主要的操作阶段:
将数据转换成文本
分析文本
将分析过的文本保存到数据库中
转换成文本。
在索引数据之前,首先必须将数据转换成纯文本字符流。
但是,在现实世界中,信息多以富媒体文档格式呈现:
PDF,WORD,EXCEL,HTML,XML等。
为此需要使用文档解析器,将富媒体转换成纯文字字符流。
分析文本。
在对数据进行索引钱,还必须进行预处理,对数据进行分析是之更加适合被索引。
分析数据时,现将文本数据切分成一些大块或者词汇单元,然后对它们执行一些可选的操作,例如:
在索引之前将这些词汇单元转换成小写,使得搜索对大小写不敏感;具有代表性的是要从输入中去掉一些使用很频繁但却没有实际意义的词,比如英文文本中的一些停用词(a、an、the、in、on等)。
同样的,也需要分析输入的词汇单元,一遍从词语中去掉一些不必要的字母以找到他们的词干。
这一处理过程称为分析。
将分析后的数据写入索引。
对输入数据分析处理完成后,就可以将结果写入索引文件中。
结果一般包括网页标题,正文,所属住地址,主机,内容摘要,时间戳,当前URL地址等,并更具具体需要建立索引和存储。
2.3.2分词
中文分词是指将一个汉字序列切分成一个一个单独的词,从而达到计算机可以自动识别的效果。
中文分词主要有三种方法:
第一种基于字符串匹配,第二种基于语义理解,第三种基于统计。
由于第二和第三种的实现需要大量的数据来支持,一般采用的是基于字符串匹配的方法。
基于字符串匹配的方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。
按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配。
常用的几种机械分词方法如下:
正向减字最大匹配法(由左到右的方向);
逆向减字最大匹配法(由右到左的方向);
最少切分(使每一句中切出的词数最小);
双向最大减字匹配法(进行由左到右、由右到左两次扫描);
采用其中的正向最大匹配法。
算法描述如下:
输入值为一个中文语句S,以及最大匹配词n
取S中前n个字,根据词典对其进行匹配,若匹配成功,转3,否则转2;
n=n–1:
如果n为1,转3;否则转1;
将S中的前n个字作为分词结果的一部分,S除去前n个字,若S为空,转4;否则,转1;
算法结束。
需要说明的是,在第三步的起始,n如果不为1,则意味着有匹配到的词;而如果n为1,默认1个字是应该进入分词结果的,所以第三步可以将前n个字作为一个词而分割开来。
还有需要注意的是对于停用词的过滤,停用词即汉语中“的,了,和,么”等字词,在搜索引擎中是忽略的,所以对于分词后的结果,需要在用停用词列表进行一下停用词过滤。
您也许有疑问,如何获得分词字典或者是停用词字典。
停用词字典比较好办,由于中文停用词数量有限,可以从网上获得停用词列表,从而自己建一个停用词字典;然而对于分词字典,虽然网上有许多知名的汉字分词软件,但是很少有分词的字典提供。
在程序使用过程中,分词字典可以放入一个集合中,这样就可以比较方便的进行比对工作。
分词的结果对于搜索的精准性有着至关重要的影响,好的分词策略经常是由若干个简单算法拼接而成的,所以您也可以试着实现双向最大减字匹配法来提高分词的准确率。
而如果遇到歧义词组,可以通过字典中附带的词频来决定哪种分词的结果更好。
2.3.3倒排索引
倒排索引(英语:
Invertedindex),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。
它是文档索引系统中最常用的数据结构。
有两种不同的反向索引形式:
一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表。
一个单词的水平反向索引(或者完全反向索引)又包含每个单词在一个文档中的位置。
后者的形式提供了更多的兼容性(比如短语搜索),但是需要更多的时间和空间来创建。
下面将以图示和实例的方式分别说明正向索引和倒排索引。
图2-6正向索引
图2-7倒排索引
以英文为例,下面是要被索引的文本:
"itiswhatitis"
"whatisit"
"itisabanana"
这样就能得到下面的反向文件索引:
"a":
{2}
"banana":
{2}
"is":
{0,1,2}
"it":
{0,1,2}
"what":
{0,1}
检索的条件"what", "is" 和 "it" 将对应这个集合:
。
对相同的文字,得到后面这些完全反向索引,有文档数量和当前查询的单词结果组成的的成对数据。
同样,文档数量和当前查询的单词结果都从零开始。
所以,"banana":
{(2,3)} 就是说"banana"在第三个文档里(
),而且在第三个文档的位置是第四个单词(地址为3)。
"a":
{(2,2)}
"banana":
{(2,3)}
"is":
{(0,1),(0,4),(1,1),(2,1)}
"it":
{(0,0),(0,3),(1,2),(2,0)}
"what":
{(0,2),(1,0)}
如果执行短语搜索"whatisit" 将得到这个短语的全部单词各自的结果所在文档为文档0和文档1。
但是这个短语检索的连续的条件仅仅在文档1得到。
2.4查询服务
查询服务的整体结构如下:
图2-8查询服务的整体结构
在网页预处理后,每个元素至少包含如下几个方面:
原始网页文档
URL和标题
编号
所含的重要关键词的集合(以及他们在文档中出现的位置信息)
其他一些指标(例如重要程度,分类代码等)
而系统关键词总体的集合和文档的编号一起构成了一个倒排文件结构,使得一旦得到一个关键词输入,系统能迅速给出相关文档编号的集合输出。
2.4.1查询方式和匹配
查询方式指的是系统允许用户提交查询的形式。
考虑到各种用户的不同背景和不同的信息需求不可能有一种普适的方式。
一般认为,对于普通网络用户来说,最自然的方式就是“要什么就输入什么”。
但这是一种相当模糊的说法。
例如用户输入“江汉大学”,可能是他想了解江汉大学目前的招生状况,可能需要找到江汉大学教务系统的网址,可能需要了解大家对江汉大学的评价。
这是三种相当不同的需求。
在其他一些情况下,用户可能关心的是间接的信息,例如“江汉大学录取分数线”,450分应该是他需要的,但不可能包含在这个短语中。
尽管如此,用一个次或短语来间接表达信息需求,希望网页中含有该词或该短语中的词,依然是主流的搜索引擎查询模式。
这不仅是因为他的确代表了大多数的情况,还因为它比较容易实现。
这样,一般来讲,系统面对的是查询短语。
一般地,用q0表示用户提交的原始查询,例如,q0=“网络与分布式系统实验室”。
它首先需要被“切词”(segment)或称“分词”,即把它分成一个词的序列。
如上例,则为“网络与分布式系统实验室”(注意,不同的分词软件可能得出不同的结果)。
然后需要删除那些没有查询意义或者几乎在每篇文档中都会出现的词(例如“的”),在本例中即为“与”。
最后形成一个用于参加匹配的查询词表,q={t1,t2,…,tm},在本例中就是q={网络,分布式,系统,实验室}。
倒排文件就是用词来作为索引的一个数据结构,显然,q中的词必须是包含在倒排文件词表中才有意义。
有了这样的q,它的每一个元素都对应倒排文件中的一个倒排表(文档编号的集合),记作L(ti),它们的交集即为对应查询的结果文档集合,从而实现了查询和文档的匹配。
上述过程的基本假设是:
用户是希望网页包含所输入查询文字的。
2.4.2结果排序
就目前的技术情况看,列表是最常见的