基于Lucene的搜索引擎的研究与实现_第1页
基于Lucene的搜索引擎的研究与实现_第2页
基于Lucene的搜索引擎的研究与实现_第3页
基于Lucene的搜索引擎的研究与实现_第4页
基于Lucene的搜索引擎的研究与实现_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、i 贵贵 州州 民民 族族 大大 学学 本本 科科 毕毕 业业 生生 论论 文文 基于基于 lucenelucene 的搜索引擎的研究与实现的搜索引擎的研究与实现 张三 摘要摘要: : 在 internet 蓬勃发展的当下,internet 上面的信息是广如大海。人们在享受 internet 所带来 的便利的同时,也面临着一个如何在此浩瀚的内容中精确,快捷地找到自己所需要的信息,由此 internet 搜索引擎应运而生,而对搜索引擎的研究也理所当然的成为了 internet 技术中最热门的领 域。 本文对搜索引擎的原理 组成 数据结构 工作流程等方面做了深入细致地研究与分析。搜索引擎的 未来发

2、展方向是个性化 智能化的。对于不同类型的用户群搜索相同的内容将得到不同的更适合用户的 搜索结果,这就是搜索引擎的个性化:而智能化则指搜索引擎具有自我学习的功能,能自动地适应用 户的查询需求,并能对用户进行智能分类从而为搜索引擎的个性化提供依据。本文详细地介绍了 lucene 的特点 系统结构及索引机制。lucene 是 apache 软件基金会下的一个开源项目,完全支持 java 技术,适用于需要全文搜索能力的应用程序,并具有很好的跨平台能力。 在理论研究的基础上,本文最后利用 java 技术实现了一个新闻搜索引擎系统。该搜索引擎系统的 网络蜘蛛部分采用了非递归爬行方式和 java 的多线程机

3、制,实现对网页的抓取。而索引和搜索部分借 助 lucene 全文搜索引擎库中的 java 类库进行实现。最后采用 jsp(java server pages)技术设计 一 个简单的新闻搜索引擎客户端 关键字关键字: :搜索引擎、 lucene ;、网络蜘蛛 、 java 、jsp、html ii research and implementation of web search engine based on lucene chenxianggao abstract:the contents on the web are increasing exponentially as the rapi

4、d development of the internet. a problem how to obtain the useful information from vast contents quickly and accurately is facing us while people are enjoying the convenience of the internet .the solver of this problem is web search engine. nowadays, search engine is one of the hottest topics in the

5、 field of internet technology. the future is content- oriented .people browse the internet through the search results of search engines. firstly this paper does an in-depth research and analysis on the theory, framework, and data structure of a web search engine .meanwhile this paper discusses the f

6、uture developing trend of search engine which includes individuation and intelligence . different types of users search the same content will get different search results that are more suitable for users and this is individuation of search engine ; and intelligence of search engine refers to that se

7、arch engine has self-learning function , can automatically adapt to user is query needs and classified users intelligently so as to provide foundation for its intelligence . then this paper describes the characteristics , system structure and indexing mechanism of lucene . lucene is an open source p

8、roject of the apache software foundation, which is implemented by java completely, is fit for the application required full-text search capability, and has a good cross-platform capability on the basis of the theory, use the java technology, this paper implements a news search engine system. in this

9、 search engine system , the part of the network spider using a non-based queue manager to take responsibility for operating the joining , distribution , handling and other operation of url ink in the process of web crawling using thread pool manager multiple crawling threads , concurrently crawl web

10、 pages . the implementation of index and search is with the java class in the full-text search engine library of lucene. and then, use jsp (java server pages) technology to design a simple news search engine clients. keywords: search engine、lucene、web spider、java 、html iii 目录目录 第一章 绪论.1 1.1 研究背景.1 1

11、.2 研究现状.1 1.3 研究的目及意义.2 1.4 本文的组织结构.3 第二章 相关技术研究.5 2.1 搜索引擎.5 2.1.1 搜索引擎的结构.5 2.1.2 搜索引擎的工作原理.5 2.2 网络机器人.6 2.1.1 如何解析 html .6 2.1.2 spider 程序结构 .7 2.1.3 如何构造 spider 程序 .8 2.1.4 网络机器人的代码分析.10 2.3lucene 概述 .12 2.3.1lucene 简介.12 2.3.2lucene 的特点和优势.13 2.3.3lucene 全文索引与数据库索引的比较.15 第三章 基于 lucene 的搜索引擎设计.

12、16 3.1 索引的建立.16 3.1.1 索引工具 indexwriter.16 3.1.2 lucene 索引的建立过程.16 3.2 lucene的搜索.17 3.2.1 使用indexsearche进行搜索.17 3.2.2 lucene中的分词器.17 3.3 中文分词机制.18 iv 3.3.1 什么是中文分词.18 3.3.2 本文采用的中文分词.18 3.4 lucene与spider的结合 .19 3.5 基于tomcat的web的服务器设计.23 3.6 基于 lucene 的搜索引擎的实现.23 第四章 总结与展望.26 4.1 本文总结.26 4.2 研究展望.26 成

13、果声明.27 致谢.27 参考文献.28 - 1 - 第一章第一章 绪论绪论 1.11.1 研究背景研究背景 在 internet 蓬勃发展的当下,internet 上的信息更加是广如大海。人们在享受 internet 所带来的便利的同时,也面临着一个如何在此浩瀚的内容中精确、快速地找到 自己所需要的信息。由此 internet 搜索引擎应运而生,而对搜索引擎的研究也理所当然 地成了 internet 技术中最热门的领域。 当人们打开浏览器时,首先连接到搜索引擎再根据搜索引擎的查找结果连接到相关 的页面。搜索引擎特指互联网上提供内容查询服务的网站,根据人们输入的查询内容查 找索引数据库,将找到

14、的相关页面的链接提供给用户。从最初的搜索引擎的出现到现在 已有二十余年时间,搜索引擎在收集页面的数量、速度、准确率等方面已得到了长足的 进步,但搜索引擎的框架结构和基本技术并没有实质性的突破,未来的搜索引擎必将向 着个性化和智能化的方向发展。对于不同类型的用户群,搜索相同的内容将得到不同的 更适合用户的搜索结果,这就是搜索引擎的个性化。而智能化则指搜索引擎具有自我学 习的功能,能自动地适应用户的查询需求,并能对用户进行智能分类从而为搜索引擎的 个性化提供依据。 1.21.2 研究现状研究现状 现今新闻服务的竞争已经不仅仅是在新闻网站之间,搜索引擎在新闻搜索领域的竞 争也越来越激烈。基于 jav

15、a 的新闻搜索引擎作为一个新的研究领域,目前已经有一些较 好的 wap 应用出现:1)百度新闻搜索 :百度新闻搜索提供两种方式查看新闻:关键字 1 搜索、焦点新闻分类浏览。新闻源较多,内容较丰富,关键字搜索为按全文搜索,未提供 按标题搜索。每条新闻只能浏览部分内容,不能浏览全部内容。2)爱问新闻搜索 :爱 2 问新闻搜索提供两种方式查看新闻:关键字搜索、最热新闻浏览。关键字搜索提供了按 标题搜索和按全文搜索两种方式;最热新闻按照频道分类,每类 3 条。3)搜狗新闻搜索 :搜狗新闻搜索提供两种方式查看新闻:关键字搜索、最热新闻浏览。关键字搜索提 3 供了按标题搜索和按全文搜索两种方式。默认为标题

16、方式。最热新闻显示在首页,共 10 条,未按频道分类。用户使用百度等通用搜索引擎的方式是通过关键字的方式实现的, - 2 - 是语义上的搜索,返回的结果倾向于知识成果,比如文章,论文,新闻等;其不能满足 特殊领域、特殊人群的精准化信息需求服务。 传统的网络搜索经过多年的发展已经成为一个巨大的产业。据艾瑞市场最新的研究 显示,中国搜索引擎市场规模已达到 15.5 亿元,预计 2009 年将达到 85.2 亿元。据权威 机构预测,未来 4 年全球搜索市场每年将以高达 35%的增长速度快速成长,到 2009 年全 球搜索市场的整体规模将达到 110 亿美元。这里提到的市场规模主要是指互联网搜索, 因

17、为移动搜索由于起步较晚尚未引起人们的重视,但其发展空间不容小觑,毕竟移动终 端的普及率远远超过电脑。而且,作为移动通信工具,手机只是其中的一种,还有不少 数量的 pda 用户也将成为移动搜索的另一支主力军。 与互联网搜索相比,移动搜索无须上网设备,只要一台普通移动终端就可以随时随 地搜索而不受网络限制,还可以通过短信方式及时互动沟通。根据著名手机企业诺基亚 的预测,到今年年底时全球的手机用户将超过 20 亿,到 2010 年,全球手机用户将突破 30 亿。全球电脑用户只有手机用户十分之一,而这其中还有相当一部分不能上网。与传 统的互联网搜索市场竞争无比激烈的现状相比,现在的移动搜索市场还只不过

18、才刚刚起 步,毕竟 2002 年 8 月英国出现“手机搜索乐曲名”服务才算得上是移动搜索的鼻祖, 2004 年 5 月英国三家主要的移动运营商 orange、沃达丰以及 20o2 年推出的被称为 aqa 的基于短信的搜索服务才为移动搜索正名,之后搜索巨头 google、雅虎、百度等企业才 陆续推出相应业务,但由于它们主要的精力放在传统的互联网搜索市场上,所以整个移 动搜索市场仍处于孕育之中,有着不可限量的发展空间。 1.31.3 研究的目研究的目的的及意义及意义 随着 internet 的迅速发展,网上信息以爆炸性的速度不断丰富和扩展,internet 用户在具备获取最大限度的信息量能力的同时

19、,搜索引擎应运而生,而面临一个突出的 问题:在上百万个网站中,如何快速有效地找到用户想要得到的信息?搜索引擎 (search engine)正是为解决用户的查询问题而出现的,它是 internet 上的一个网站, 该网站专门提供用户查询 internet 上的信息。当用户输入关键字(keyword)查询时, 该网站会告诉用户包含该关键字信息的所有网址,并提供通向该网站的链接。 搜索引擎的发展分为四个阶段 第一代搜索引擎出现于 1994 年,以集中式检索为主要特征。这类搜索引擎一般都索 - 3 - 引少于一百万个网页,极少重新搜集网页并去刷新索引。而且其检索速度非常慢,一般 都要等待 10 秒甚

20、至更长的时间。在实现技术上也基本沿用较为成熟的 ir(information retrieval)、网络、数据库等技术,相当于利用一些已有技术实现的一个 www 上的应用。 第二代搜索引擎系统大约出现在 1996 年,大多采用分布式检索方案,即多个微型计 算机协同工作来提高数据规模、响应速度和用户数量。它们一般都保持一个大约五千万 网页的索引数据库,每天能够响应一千万次用户检索请求。 第三代搜索引擎系统出现在 1998 年到 2000 年期间,这一时期是搜索引擎空前繁荣 的时期。第三代搜索引擎的发展有如下凡个特点: 第四代搜索引擎出现于 21 世纪,这一阶段的搜索引擎是分类细致精确、数据全面深

21、 入、更新及时的面向主题的搜索引擎。由于主题搜索运用了人工分类以及特征提取等智 能化策略,因此它比面提到的前三代的搜索引擎将更加有效和准确。在中国,对搜索引 擎的研究起源于“中国教育科研网”一期工程中的子项目,北京大学计算机系的项目组 在 1997 年 10 月在该网上推出了天网搜索 1.0 的版本。在这之后,几位在美国留学的华 术的依赖性。 目前,互联网上信息量和信息的种类在不断增加。一个搜索引擎要覆盖所有的网上 信息查询需求已出现困难,因此各种主题搜索引擎、个性化搜索引擎、问答式搜索引擎 纷纷兴起。并且如今的搜索引擎存在搜索速度慢、死链接太多、重复信息或不相关信息 较多。难以满足人们的各种

22、信息需求,搜索引擎将向智能化、精确化、交叉语言检索、 多媒体检索、专业化等适应不同用户需求的方向发展。百度公司于 2000 年推出了“百度” 商业搜索引擎,并一直处于国内的领先地位。随着网上信息量越来越多,单纯靠人工整 理网站目录取得较高精度查询结果的优势逐渐退化,对 web 上的信息进行高质量的人工 分类已经不太现实。目前有两个发展方向。一是利用文本自动分类技术,在搜索引擎上 提供对每篇网页的自动分类。另一个发展方向是将自动网页抓取和一定的人工分类目录 相结合,希望形成一个既有高信息覆盖率,又有高查询准确性的服务。 1.41.4 本文的组织结构本文的组织结构 本文共分为四部分:第一章是绪论,

23、介绍本文的研究背景、研究现状、目的和意义; 第二章介绍对搜索引擎相关技术的研究,其中包括:搜索引擎的结构、工作原理、网络 - 4 - 机器人、lucene 的简单介绍;第三章是基于 lucene 的搜索引擎设计 通过索引的建立工 具类 indexwriter、索引的搜索类 indexsearcher 建立搜索、还涉及到通过中文分词对索 引进行分词处理、然后通过 lucene 与 spider 的结合建立搜索引擎、最后通过 tomach 服 务器实现搜索引擎;第四章是对全文的总结和展望。 - 5 - 第二章第二章 相关技术研究相关技术研究 2.12.1 搜索引擎搜索引擎 2.1.1 搜索引擎的结

24、构 搜索引擎是根据用户的查询请求,按照一定算法从索引数据库中查找信息返回给 用户的。为了保证用户查找信息的精确度和新鲜度,搜索引擎需要建立并维护一个庞大 的索引数据库。一般的搜索引擎由网络机器人程序、索引与搜索程序、索引数据库等部 分组成。搜索引擎的结构如图 2.1.1 所示。 图 2.1.1 搜索引擎的结构 2.1.2 搜索引擎的工作原理 搜索引擎的工作原理可以分为以下三步: 第一步:从互联网上抓取网页。利用某种能够自动对互联网进行访问的网络爬虫程 序,搜索引擎能够自动地从互联网上收集网页,并利用已经搜集到网页中的所有 url 对 其它新的网页进行爬取,不断地重复以上过程,并将所有爬取到的网

25、页收集起来存放到 网页数据库中。 第二步:建立索引数据库。分析索引系统程序首先要对网络爬虫程序收集回来的网 页进行分析,将相关网页的一系列信息从中提取出来,根据特定的相关度算法,通过一 www 文档 网络机器人程序 建立 lucene 索 引 从数据库中搜索信 息 tomcat 服务器 lucene 索引库 www 浏览器www 浏览器 jsp 网络机器人程序 - 6 - 系列复杂的计算,从而针对每一个网页算出页面文字中或超链中所有关键字的相关度, 最后就可以根据得到的相关信息建立网页索引数据库。 第三步:在索引数据库中进行搜索排序。在用户输入某个搜索关键词开始搜索之后, 搜索引擎系统程序就在

26、网页索引数据库中进行搜索,并且能够把网页索引数据库中所有 与该关键词相关的网页都找出来。因为之前就已经将所有相关网页针对该关键词的相关 度算好,故只需按照己有的相关度数值由高到低进行排序,相关度高的网页排在前面, 相关度低的网页排在后面。 2.22.2 网络机器人网络机器人 网络机器人又称为 spider 程序,是一种专业的 bot 程序。用于查找大量的 web 页面。 它从一个简单的 web 页面上开始执行,然后通过其超链接在访问其他页面,如此反复理 论上可以扫描互联网上的所有页面。基于因特网的搜索引擎是 spider 的最早应用。例如 搜索巨头 google 公司,就利用网络机器人程序来遍

27、历 web 站点,以创建并维护这些大型 数据库。网络机器人还可以通过扫描 web 站点的主页来得到这个站点的文件清单和层次 机构。还可以扫描出中断的超链接和拼写错误等。 2.2.1 如何解析 html 因为 web 中的信息都是建立在 html 协议之上的,所以网络机器人在检索网页时的第 一个问题就是如何解析 html。在解决如何解析之前,先来介绍下 html 中的几种数据。 文本:除了脚本和标签之外的所有数据。 注释:程序员留下的说明文字,对用户是不可见的。 简单标签:由单个表示的 html 标签。 开始标签和结束标签:用来控制所包含的 html 代码我们在进行解析的时候不用关心 所有的标签

28、,只需要对其中几种重要的进行解析即可。 超连接标签:超连接定义了 www 通过 internet 链接文档的功能。他们的主要目的是 使用户能够任意迁移到新的页面,这正是网络机器人最关心的标签。 图像映射标签:图像映射是另一种非常重要的标签。它可以让用户通过点击图片来 迁移到新的页面中。 表单标签:表单是 web 页面中可以输入数据的单元。许多站点让用户填写数据然后 - 7 - 通过点击按钮来提交内容,这就是表单的典型应用。 表格标签:表格是 html 的构成部分,通常用来格式化存放、显示数据。 我们在具体解析这些 html 标签有两种方法:通过 javatm 中的 swing 类来解析或者 通

29、过 bot 包中的 htmlpage 类来解析,本人在实际编程中采用后者。bot 包中的 htmlpage 类用来从指定 url 中读取数据并检索出有用的信息。下面给出该类几种重要的方法。 2.2.2 spider 程序结构 网络机器人必须从一个网页迁移到另一个网页,所以必须找到该页面上的超连接。 程序首先解析网页的 html 代码,查找该页面内的超连接然后通过递归和非递归两种结构 来实现 spider 程序。 递归结构 递归是在一个方法中调用自己本身的程序设计技术。虽然比较容易实现但耗费内存 且不能使用多线程技术,故不适合大型项目。 非递归结构 这种方法使用队列的数据结构,当 spider

30、程序发现超连接后并不调用自己本身而是 把超连接加入到等待队列中。当 spider 程序扫描完当前页面后会根据制定的策略访问队 htmlpage 构造函数 /构造对象并指定用于通讯的 http 对象 public htmlpage(http http) getforms 方法 /获取最后一次调用 open 方法检索到的表单清单 public vector getforms() gethttp 方法 /获取发送给构造函数的 http 对象 public http gethttp() getimage 方法 /获取指定页面的图片清单 public vector getimage() getlinks

31、 方法 /获取指定页面的连接清单 public vector getlinks() open 方法 /打开一个页面并读入该页面,若指定了回调对象则给出所有该对象数据 public void open(string url,htmleditorkit.parsercallback a) - 8 - 列中的下一个超连接地址。虽然这里只描述了一个队列,但在实际编程中用到了四个队 列,他们每个队列都保存着同一处理状态的 url。 等待队列: 在这个队列中,url 等待被 spider 程序处理。新发现的 url 也被加入到 这个队列中 处理队列:当 spider 程序开始处理时,他们被送到这个队列中

32、错误队列: 如果在解析网页时出错,url 将被送到这里。该队列中的 url 不能被移入 其他队列中 完成队列: 如果解析网页没有出错,url 将被送到这里。该队列中的 url 不能被移入 其它队列中 在同一时间 url 只能在一个队列中,我们把它称为 url 的状态。状态图如图 2.2.2 所示 发现 url等待队列运行队列 完成队列 错误队列 完成 url 图 2.2.2url 的处理过程 以上的图表示了队列的变化过程,在这个过程中,当一个 url 被加入到等待队列中 时 spider 程序就会开始运行。只要等待队列中有一个网页或 spider 程序正在处理一个 网页,程序就会继续他的工作。

33、当等待队列为空并且当前没有任何网页时,spider 程序 就会停止它的工作。 2.2.3 如何构造 spider 程序 在构造 spider 程序之前我们先了解程序的各个部分是如何共同工作的。以及如何对 这个程序进行扩展。构造流程图如图 2.2.3 所示 - 9 - 把 url 加入等待队列 图 2.2.3 spider 构造流程图 ispiderreportable 接口 这是一个必须实现的接口,可以通过回调函数接受 spider 所遇到的页面。接口定义 了 spider 向他的控制者发送的几个事件。通过提供对每个事件的处理程序,可以创建各 种 spider 程序。 ispiderrepor

34、table 接口声明: spider 程序工作完 成 将这一网页送入完 成队列并继续 下载从等待队列中得 到的网页,并将它送 入运行队列中 报告外部连接 查看网页上的下一个超链接 将连 接加 入等 候队 列 报告网页连接 报告其他类型的连接 等待队列中 是否有 url? 这个网页包含 其他超链接吗 是否为指向 web 的连接? 否 否 是 是 是 连接是否与网页 所在的主机不同 且只处理本地连 接? 否 是 - 10 - package news; import com.heaton.bot.http; public interface ispiderreportable public boo

35、lean foundinternallink(string url); public boolean foundexternallink(string url); public boolean foundotherlink(string url); public void processpage(http page); public void completepage(http page, boolean error); public boolean getremovequary(); public void spidercomplete(); 2.2.4 网络机器人的代码分析 程序代码实现:

36、 package news; /* *新闻搜索引擎 */ import com.heaton.bot.http; import com.heaton.bot.httpsocket; import com.heaton.bot.ispiderreportable; import com.heaton.bot.iworkloadstorable; import com.heaton.bot.spider; import com.heaton.bot.spiderinternalworkload; /* * 构建一个bot程序 */ public class searcher implements

37、ispiderreportable public static void main(string args) throws exception iworkloadstorable wl = new spiderinternalworkload(); - 11 - searcher _searcher = new searcher(); spider _spider = new spider(_searcher, http:/localhost:8088/searcher_test/002.htm, new httpsocket(), 100, wl); _spider.setmaxbody(1

38、00); _spider.start(); / 发现内部链接是调用,url表示程序发现的url,若返回true则加入作业中,否则不 加入 public boolean foundinternallink(string url) return false; / 发现内部链接是调用,url表示程序发现的url,若返回true则加入作业中,否则不 加入 public boolean foundexternallink(string url) return false; / 当发现其他连接时调用这个方法。其他连接指的是非html网页,可能是e-mail或者 ftp public boolean fou

39、ndotherlink(string url) return false; / 用于处理网页,这是spider程序要完成的实际工作 public void processpage(http http) system.out.println(扫描网页: + http.geturl(); new htmlparse(http).start(); / 用来请求一个被处理的网页。 public void completepage(http http, boolean error) / 由spider程序调用以确定查询字符串是否应删除。如果队列中的字符串应当删除,方 法返回真。 public boole

40、an getremovequery() return true; / 当spider程序没有剩余的工作时调用这个方法。 public void spidercomplete() - 12 - 2.32.3 lucenelucene 概述概述 在 internet 和数据存储高度发达的今天,任何一个成功的网站都应该具有像谷歌、 百度一样的搜索功能。复杂而多功能的搜索界面通常是被用户否定的,并且很少被用户 使用。用户想做的只是输入他们要查询的字或者词语,剩下的工作由计算机来完成。这 就像百度和谷歌这样的搜索引擎。如果你想添加这样丰富的全文搜索功能到你的网站上, lucene 是一个不错的选择。 2

41、.3.1 lucene 简介 lucene 并不是一个可以直接从 internet 上下载,安装和运行的完整程序。lucene 是一个用 java 编写的并带有文本索引和文本搜索功能的应用程序。lucene 提供了一个简 单但功能强大的核心 api,我们只需要了解几个 lucene 的类和方法就可以使用它了。 lucene 主要提供两种服务:文本索引和文本检索。用户或者软件开发人员一方面可以利用 lucene 方便地在自己的网站或系统中添加并实现全文检索的功能,另一方面也可以在 luene 的框架基础上建立一个自己的完整的全文搜索引擎系统。lucene 最初是由资深的 全文索引和搜索专家道格卡

42、廷编写的,并且发布在 sourceforge(开源软件的开发者进 行开发管理的集中式场所,也是全球最大的开源软件开发平台和仓库)的网站上以供下载。 lucene 与搜索应用程序之间的关系如图 2.3.1 所示 - 13 - 搜 索 应 用 程 序 - l u c e n e 图 2.3.1 lucene 与搜索应用程序之间的关系 总之,lucene 是一个用 java 编写的开放源代码的全文搜索引擎的工具包,它只是一 个全文搜索引擎的框架,并不是一个完整的全文搜索引擎系统,不但包括完整的索引引 擎和查询引擎,还包括文本分析引擎。 2.3.2 lucene 的特点和优势 lucene 作为一个开

43、源的项目,自从它出现之后,开源代码社区就发生了巨大的变 化,程序开发人员一方面可以用它来建立一个特定的全文搜索系统程序,另一方面也可 以用它来构建一个 web 应用系统程序。下面我们列出 lucene 的几个比较突出的优点: 1.lucene 检索引擎的索引文件的格式不受应用平台的影响,lucene 专门制定了索引 db web manual input file system gather data user get user query present search result index documents search index index - 14 - 文件的格式,这套索引文件格

44、式是以八位字节为基础的,这就能够使建立的索引文件被 不同平台和兼容系统的应用共享。 2.传统全文搜索引擎都是以倒排索引的方式建立索引的,lucene 全文检索引擎在此 基础上实现了分块索引,也就是可以为新的文件建立小文件索引,索引速度得到了明显 的提高,之后再与原来的索引进行合并,并最终实现优化。 3.lucene 的系统架构是面向对象的,这样就可以方便地为 lucene 添加新的功能,对 于 lucene 扩充的学习也容易了许多。 4.lucene 设计了自己的文本分析接口,与文件的格式和语言独立,索引器建立索引 文件是通过接受 token 流来完成的,用户只要实现文本分析的接口就可以扩充新

45、的文件 的格式和语言。 5.一个功能强大的搜索引擎已经默认地被 lucene 实现了,用户要使自己的网站或系 统程序具有强大的搜索功能只需使用 lucene 即可,并不需要自己去编写代码。 2.3.3 lucene 全文索引与数据库索引的比较 lucene 的 api 接口的设计与数据库系统的字段、表、记录的设计非常类似,简单地 说,可以把 lucene 看成一个支持全文检索的传统数据库系统但两者又有很多不同之处。 lucene 与数据库索引的比较如图 2.3.3 所示 对比项lucene 检索 数据库检索 索引数据 源 索引数据源:由 lucene 提供的 index 类及其 子类检索其数据

46、结构可以表示为: document(field1,field2,)。并将结果 以:hits(field1,field2,)形式输出 索引数据源:由数据库索引(或不需要 索引)检索记录并输出记录 检索对 象 document:lucene 检索时需要索引的文档, 一个文档由多个 field 组成 record:一个记录由多个字段组成 最小单 元 field : 域field :字段 检索结hits:由符合关键字条件的 document 按相似查询结果:由包含关键字的记录组成, - 15 - 果度排序而成不能按相似度排序 效率 将数据源中的数据建立反向索引,速度 较快 对于“like”查询来说,数

47、据库传统的 索引时根本用不上的,而需要逐个遍历 所有记录,所有查询速度有多个数量级 的下降 匹配过 程 通过词元(term)匹配,通过语言分析接口 进行关键字拆分,能够实现对中文的完美支 持 由于是模糊查询,匹配不精确,可能查 出大量无关的信息,另外,对于组合查 询,也不能灵活地变换词序关系,因此 针对两个或多个查询词也无法正确匹配 相似度有相似度算法,排序的时候相似度最高的在 前面 没有相似度算法,相似度再高也不一定 排在前面。没有匹配程度的控制 结果输 出 将相似度最高的前 100 条结果输出,并且是 缓冲式的小批量读取,系统开销较小 一次性输出,不存在相似度排序,结果 较多时系统开销非常

48、大 可定制 性 通过 api 接口制定出符合检索需要的排序规 则 不可制定 结论高负载的模糊查询应用,速度快,资料量大, 相似度高 不适合作为全文检索系统 图 2.3.3 lucene 索引与数据库索引的比较 - 16 - 第三章第三章 基于基于 lucenelucene 的搜索引擎设计的搜索引擎设计 3.13.1 索引的建立索引的建立 对于搜索引擎而言,索引的建立是非常重要的一步,只有建立了良好的索引库,在用 户进行查询时才能高效的反馈给用户。怎样建立索引呢?本论文借助的是 lucene 工具包 中有两个最重要的概念 document(逻辑文件)和 field(域)。它们对应于 lucene

49、 中的 document 类和 field 类。document 我们可以抽象的理解为数据库,而 field 就是该数据 库中的字段。在进行索引处理时,它提供了如下的几种方法。 是否存储:该数据源的数据是否要完整的存储于索引中。 是否索引:该数据源的数据是否要在用户检索时被检索。 是否分词:该数据源的数据是否要经过分词。 3.1.1 索引工具 indexwriter 当我们在构建完 document 对象并为其加入合适的 field 对象后,就可以使用 lucene 中的 indexsearcher 类为其建立索引了。具体构造函数如下: public indexwriter (string p

50、ath, analyzer a, boolean create); public indexwriter (file path, analyzer a, boolean create); public indexwriter (directory d, analyzer a, boolean create); 可以看出,这 3 个公有的构造函数都有 3 个参数。其实意思都是一样的。 第一个参数表示:需要建立索引文件的位置 第二个参数表示:进行索引时使用的分词器 第三个参数表示:是否覆盖也创建的索引库 true 表示覆盖,false 表示在已有的索引 库中创建,不会掩盖以前创建的索引。我们在第一

51、次创建索引时要把该值设为 true。其 后换成 false 即可 3.1.2 lucene 索引的建立过程 索引的建立过程主要分为 采集、加工、存入索引库 而用户的查询过程主要是输入 文本、分析、在从索引库中查找的。 lucene 索引的建立过程如图 3.1.2 所示 - 17 - 图 3.1.2 建立索引的过程 3.23.2 lucenelucene 的搜索的搜索 前面介绍了 lucene 建立索引的方法及相关过程。lucene 里与搜索相关 api 多数都被 包含在 org.apache.lucene.search 包中。 3.2.1 使用 indexsearcher 进行搜索 index

52、searcher 类是查询器搜索入口,继承自 search 类。在 lucene 中,实例化一个 indexsearcher 只需要一个索引的存放目录参数。它有 3 个构造函数: public indexsearcher(string path)throws ioexception public indexsearcher(directory directory)throws ioexception public indexsearcher(indexreader r) 这个 3 个构造函数的参数类型虽然有所不同,但是它们均表示存放索引的目录。 lucene 包括很多种不同的搜索方式。但都是通

53、过构造检索器 indexsearcher searcher = new indexsearcher(index_path, new standardanalyzer(), true)来实现搜索的。 3.2.2 lucene 中的分词器 信息检索所要处理的主要对象就是信息,而信息大部分时候是以一种文本的方式呈 现的。而信息检索的第一件事,就是要对这种文本进行分析,以便能够继续下面的处理。 对文本进行分析的最基本的工作,就是先进行分词,将一段文本拆分成多个词条来进行 .html .txt .doc .pdf 采集加工分析 输入要搜索文本 分析 采集 索引库 用 户 输 入 的 过 程 - 18 -

54、 处理的。分词器的结构如图 3.2.2 所示 图 3.2.2 图解分词器 由于不是本文研究的重点,故在这里不做更多的介绍,有兴趣朋友可以看看。 3.33.3 中文分词机制中文分词机制 3.3.1 什么是中文分词 众所周知英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位, 句子中所有的字连起来才能描述一个意思。例如,英文句子“i am a teacher” ,用中文 则为:“我是一名老师” 。计算机可以很简单通过空格知道 teacher 是一个单词,但是不 能很容易的明白“老“ 、 “师”两个字合起来才表示一个词。把中文的汉字序列切分成 有意义的词,就是中文分词,有些人也称为切词。

55、我是一名老师,分词的结果是:我 是 一名 老师。所以,如果要把语句中按“词”进行索引的话,这个词如何切分出来就是一 个很大的问题。 3.3.2 本文采用的中文分词 由以上介绍我们知道,lucene 自带的 standardanalyzer 有多种分析器。而本论文 建立的文本检索关键字 分词器 检索关键字检索关键字 索引 返回结果 - 19 - 才用的主要是 standardanalyzer 的子类 chineseanalyzer 来实现分词 ,该类的包全路 径为 import .chineseanalyzer; 3.43.4 lucenelucene 与与 spiderspider 的结合建立

56、搜索引擎的结合建立搜索引擎 通过第二章对网络机器人的介绍,我们已经知道关于 spider 的程序结构和它的构造 过程。并通过实例构造了一个 ispiderreportable 接口,用于实现对 url 各种状态的处 理。另一方面,通过对 lucene 的学习,使用 indexwriter 类和 indexsearcher 类建立索 引和搜索,那我们怎样才能把它们结合在一起呢?下面是本论文给出的核心代码。 核心代码如下: package news; /* * 新闻搜索引擎 */ import java.io.ioexception; import .chineseanalyzer; import

57、 org.apache.lucene.document.document; import org.apache.lucene.document.field; import org.apache.lucene.index.indexwriter; public class index indexwriter _writer = null; index() throws exception _writer = new indexwriter(c:newsindex, new chineseanalyzer(), true); /* * 把每条新闻加入索引中 * 新闻的 url - 20 - * 新

58、闻的标题 */ void addnews(string url, string title) throws exception document _doc = new document(); _doc.add(field.text(title, title); _doc.add(field.unindexed(url, url); _writer.adddocument(_doc); /* * 优化并且清理资源 */ void close() throws exception _writer.optimize(); _writer.close(); 构造 html 解析类,用于处理要进行建立索

59、引的 web 页面。 核心代码如下: package news; /* *新闻搜索引擎 * import java.util.iterator; import java.util.vector; import com.heaton.bot.htmlpage; import com.heaton.bot.http; - 21 - import com.heaton.bot.link; public class htmlparse http _http = null; public htmlparse(http http) _http = http; /* * 对web页面进行解析后建立索引 */

60、 public void start() try htmlpage _page = new htmlpage(_http); _page.open(_http.geturl(), null); vector _links = _page.getlinks(); index _index = new index(); iterator _it = _links.iterator(); int n = 0; while (_it.hasnext() link _link = (link) _it.next(); string _herf = input(_link.gethref().trim()

温馨提示

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

评论

0/150

提交评论