基于Lucene的桌面全文搜索引擎研究--论文_第1页
基于Lucene的桌面全文搜索引擎研究--论文_第2页
基于Lucene的桌面全文搜索引擎研究--论文_第3页
基于Lucene的桌面全文搜索引擎研究--论文_第4页
基于Lucene的桌面全文搜索引擎研究--论文_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、*学院毕业设计(论文)开题报告 * 系 * 专业 200* 级 01班课题名称: 基于lucene的桌面全文搜索引擎研究 学生姓名: * 学号:*指导教师: * 报告日期: 200*年3月 26 日 1 本课题所涉及的问题及应用现状综述本课题来源于科研项目,主要是研究中文搜索中的关键算法和基于luence的搜索引擎,设计一个桌面搜索系统。本课题要求熟悉c/c+/java编程和人工智能。luence是一个用java写的全文搜索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎及部分文本分析引擎,支持多用户访问,访问索引速度快,可以跨平台使用。l

2、ucene的目的是为软件开发人员提供一个简单易用的工具包,以方便地在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎. lucene可以对任何的数据做索引和搜索.lucene不管数据源是什么格式,只要它能被转化为文字的形式,就可以被lucene所分析利用.也就是说不管是word,html,pdf还是其他什么形式的文件只要你可以从中抽取出文字形式的内容就可以被lucene所用,就可以用lucene对它们进行索引以及搜索.应用它可以快速的开发一个搜索引擎。本课题就是要研究利用基于java的全文检索工具包luence开发一个桌面搜索系统。经过多年的发展,lucene在全文检索领

3、域已经有了很多的成功案例,并积累了良好的声誉.基于lucene的全文检索产品和应用lucene的项目在世界各地已经非常之多, 例如,众所周知的apache软件基金会的网站使用了lucene作为全文检索的引擎,ibm公司开源软件eclipse的2.1版本中也采用了lucene作为帮助子系统的全文索引引擎,相应的ibm公司的商业软件web sphere中也采用了lucene.lucene正以其开放源代码的特性,优异的索引结构,良好的系统架构获得了越来越多的应用.2本课题需要重点研究的关键问题、解决的思路及实现预期目标的可行性分析本课题需要重点研究的关键问题:1.中文搜索引擎中的关键算法。2. 建立

4、索引和搜索。建立索引和搜索是搜索引擎最重要的也是最基本的两部分.3.如何利用lucene来建立自己的桌面搜索引擎系统。解决思路:在开始做本课题之前,先要学习中文搜索引擎的算法,学习如何建立索引和搜索,学习并了解lucene以及如何应用lucene。并认真学习c/c+/java和人工智能等方面的知识。这些都需要通过阅读和学习大量的书籍和资料来完成。虽然这些东西以前接触的比较少,对这方面知识了解还不是很多,但是我想通过一段时间的学习和老师的指导,这些问题都可以解决。先要对这方面的知识要有一个初步的了解。可行性分析:要做好本课题,首先要了解算法方面的知识,其次要对c/c+/java和人工智能等方面的

5、知识要有充分的掌握来作为基础。这些现在对我来说都有一定的困难,但是我可以通过不断的学习和老师的指导来逐渐的克服这些困难。 3完成本课题的工作方案 要完成本课题首先要认真学习并掌握一定的算法方面的知识,认真学习c/c+/java和人工智能等方面的知识,提高自己的编程能力,还有就是要认真学习和了解lucene,然后才能应用lucene来建立搜索引擎,完成本课题。为此制定的具体的工作时间安排如下: 2007.3.20-2007.4.30 熟悉java语言,lucence库以及相关的搜索算法 2007.5.1-2007.5.31 软件的实现 2007.6.1-2007.6.25 论文撰写、准备答辩4指

6、导教师审阅意见指导教师(签字): 年 月 日说明:本报告必须由承担毕业论文(设计)课题任务的学生在毕业论文(设计) 正式开始的第1周周五之前独立撰写完成,并交指导教师审阅。*学院毕业设计 (论文)成绩评定表学生姓名*性别男学号*专 业班 级*1课题名称基于lucene的桌面全文搜索引擎研究课题类型实际应用难度难毕业设计(论文)时间200 年3月19日200 年6月 24日 共14周 指导教师* (职称:讲师)课题任务完成情况论 文 20 (千字); 设计、计算说 明书 2 (千字); 图纸 3 (张);其它(含附 件):程序指导教师意见 分项得分:开题调研论证 分; 课题质量(论文内容) 分;

7、 创新 分;论文撰写(规范) 分; 学习态度 分; 外文翻译 分指导教师审阅成绩: 指导教师(签字): 年 月 日评阅教师意见 分项得分:选题 分; 开题调研论证 分; 课题质量(论文内容 分; 创新 分;论文撰写(规范) 分; 外文翻译 分评阅成绩: 评阅教师(签字): 年 月 日验收小组意见 分项得分:准备情况 分; 毕业设计(论文)质量 分; (操作)回答问题 分验收成绩: 验收教师(组长)(签字): 年 月 日答辩小组意见 分项得分:准备情况 分; 陈述情况 分; 回答问题 分; 仪表 分答辩成绩: 答辩小组组长(签字): 年 月 日成绩计算方法(填写本系实用比例)指导教师成绩 ()

8、评阅成绩 () 验收成绩 () 答辩成绩 ()学生实得成绩(百分制)指导教师成绩 评阅成绩 验收成绩 答辩成绩 总评 答辩委员会意见 毕业论文(设计)总评成绩(等级): 系答辩委员会主任(签字): 系(签章) 年 月 日备注*学院毕业论文(设计)成绩评定表(续表)基于lucene的桌面全文搜索引擎研究目 录摘要iabstractii1 绪论12 lucene基础12.1 信息获取与搜索引擎12.2 lucnen的历史32.3 索引和搜索63 搜索引擎的中文问题83.1 中文分词问题84 用lucene来建立索引和搜索94.1 lucene分析器analyzer104.2 索引建立的过程114.

9、3 lucene的文档格式124.4 索引的添加indexwriter类154.5 lucene的索引文件格式简述164.6 搜索的流程184.7 搜索与结果184.8 lucene的评分机制205 构建自己的“搜索引擎”215.1 认识lucene225.2 为本机的文件创建索引235.3 搜索的效果245.4 总结26致谢27参考资料28附录29 基于lucene的桌面全文搜索引擎研究摘要lucene是一个用java写的全文搜索引擎工具包,支持多用户访问,访问索引速度快,可以跨平台使用.全文检索技术是信息检索领域广泛使用的基本技术.它是一个优秀的开源全文本搜索技术框架.按照lucene的框

10、架规范,扩展lucene的功能,可以将lucene很好地嵌入到自己的搜索引擎中.本文研究了lucene的中文切分词技术,lucene的索引原理,根据lucene的系统结构详细分析了lucene分析器、索引包、文档等结构, 描述了利用lucene开发定制的中文全文搜索引擎的方法,实现了一个基于lucene的全文搜索应用实例.关键词: lucene 全文检索技术 搜索引擎 索引 切分词abstractlucene is a full text using java to write search engine toolkit , which supports multiaccess , visit

11、s index speed quickly ,and can stride over platform usage. the full text search technology is the fundamental technology that the information retrieval field uses broadly. it is that one is excellent hold source full text searching for the technology frame originally. according to the lucene frame n

12、orm , the function expanding lucenes, in the search engine being able to lucene be implanted very good to self。unwieldy culture has studied the lucene chinese segments the word technology , the lucene index principle , the system structure according to lucene has analysed the lucene analyzer , index

13、 structure such as bag , document detailedly , has described search engine method making use of lucene to develop custom-built chinese full text , has realized a example applying owing to that the lucene full text searches for.key words: lucene,full text search technology, search engine, index, segm

14、ent word291 绪论lucene开始是作为个人项目。1997年,lucene的作者doug cutting编写了lucene。几年以后,2000年,他将lucene放到了自己的网站上。一些人马上开始使用lucene。2001年,apache的人提出采用lucene。lucene的代码捐助也慢慢开始了,lucene开始成为真正的合作项目。到2004年,lucene已经有了一个强有力的开发团队。这些年来,lucene已经被翻译为其它多种语言版本,包括c+,c#,perl和python。在最初的java以及其它各版本中,lucene的应用相当广泛。它在各种应用中为搜索提供动力,如财富100的

15、讨论组、商业的bug跟踪、微软提供的邮件搜索还有数十亿页面级的 web搜索引擎。越来越多的人开始使用lucene。下面我将更详细的介绍lucene,并用它来构建一个自己的搜索引擎。2 lucene基础2.1 信息获取与搜索引擎随着计算机技术和互联网技术的飞速发展,网络上的信息量急剧增长,要在浩如烟海的网络世界中寻找需要的信息,作为现代信息获取技术的主要应用一一搜索引擎是不必可少的。2.1.1 信息获取互联网(internet)正以前所未有的态势改变着整个世界,它现在已经成为了人类有史以来资源数量最多、资源种类最全、资源规模最大的一个综合信息库。其信息来源丰富、分布广泛,各种类型信息资源异构地分

16、布于网络空间中,如果不能使庞杂的信息有序化,就很难有效获取。如何准确有效的从互联网上获取信息,就显得十分迫切和需要。信息获取技术包含信息的表示、存储、组织和对信息的访问方法。信息的表示和组织是为了让用户更容易地访问到需要的信息。一般来讲,信息获取的流程分为以下几部分:在获取信息之前,首先需要构造文本数据库,即将来需要进行检索的数据。在有了文本数据之后,需要建立文档的索引。利用索引技术可以大大提高信息检索的速度。当前有很多种建立文档索引的方法,然而对于大规模的数据量来讲,用得最多的还是倒排索引技术。在lucene中,索引部分也是使用的倒排索引方法。在建立好索引之后,就可以对其进行检索了。我们首先

17、给出一个查询,该查询将被分析,然后利用文本处理技术进行处理。在查询操作进行之前还可以对其进行一些处理。最后根据查询将获取一些文档,这就是检索结果。在把检索结果反馈给我们之前,还可以对检索结果按照一定的次序排序,以使符合我们需要的文档能够排在更前面。搜索引擎在10年之前对大家来讲还是一个非常陌生的概念,然而现如今,它正在逐渐地改变着人们获取信息的方式,越来越引起人们的重视。下面,先来回顾一下搜索引擎的发展历史。2.1.2 搜索引擎的发展与分类a.发展历史搜索引擎的鼻祖就是黄页,诞生于19世纪末。因为黄页,在电话诞生后成为了以电话为主体的信息门户,而且黄页把有电话的企业分门别类,的确与现在的搜索引

18、擎有异曲同工之妙。不过,这更多地是从这两者的形式和用途做的类比。我们所说的搜索引擎其实是在近10年的不断发展中逐步形成的,它建立在互联网和诸多计算机技术之上,所以很难把搜索引擎的缘起与哪个具体的产品对应起来。然而,在它逐步发展的过程中,一些关键系统和产品的产生成为了具有里程碑意义的事情。1993年10月martijin koster创建了aliweb(martijin koster annouces the availability of aliweb),它相当于archie的http版本。aliweb不使用网络搜寻robot,如果网站主管们希望自己的网页被aliweb收录,需要自己提交每一个

19、网页的简介索引信息,类似于后来大家熟知的yahoo。1993年2月,6个stanford(斯坦福)大学生的想法是分析字词关系,以对互联网上的大量信息作更有效的检索,这就是excite,后来曾以概念搜索闻名。1994年1月,第一个既可搜索又可浏览的分类目录einet ga1axy(tradewave ga1axy)诞生。除了网站搜索,它还支持gopher和te1net搜索, lycos是搜索引擎史上又一个重要的进步。canegie me11on university的michael mau1din将john leavitt的spider程序接入到其索引程序中,创建了lycos。除了相关性排序外,

20、lycos还提供了前缀匹配和字符相近限制,lycos第一个在搜索结果中使用了网页自动摘要。1998年10月之前,google只是stanford大学的一个小项目backrub 。1999年2月,google完成了从a1pha到beta 的蜕变。google在pagerank、动态摘要、网页快照、dai1yr efresh、多文档格式支持、地图、股票、词典、寻人等集成搜索、多语言支持、用户界面等功能上的革新,像a1tavista一样,再一次彻底改变了搜索引擎的定义。(注意:计算机技术正在飞速发展,关于搜索引擎的定义和发展过程,也有各种各样不同的观点。)b.分类搜索引擎并没有一个精确的定义,一般来

21、讲,大致可以分为两大类:全文搜索引擎(fulltext search engine)和分类目录(directory)。全文搜索引擎通过一个叫网络机器人(spider)或叫网络蜘蛛(craw1ers)的软件, 自动分析网络上的各种链接并获取网页信息内容,按规则加以分析整理,记入数据库。google、百度就是比较典型的全文搜索引擎系统。分类目录则是通过人工的方式收集整理网站资料形成数据库的,比如雅虎中国以及搜狐,新浪,网易等网站的分类目录。这两种类型的搜索引擎各有自己得优缺点。全文搜索引擎的使用以关键词和一定的语法为特点,而分类目录则通过建立多级目录对网站进行分类。它们在使用上各有长短。全文搜索引

22、擎因为依靠网络机器人搜集数据,所以数据库的容量非常庞大,但是,它的查询结果往往不够准确;分类目录依靠人工收集和整理网站,能够提供更为准确的查询结果,但收集的内容却非常有限。此外,基于这两类搜索引擎,还衍生了其他的搜索服务,主要有元搜索引擎和集成搜索引擎等,这里就不一一介绍了。搜索引擎既然没有明确的定义,一般就以其发展中一些里程碑式的应用标志其阶段。大多数人普遍的共识是:第一代搜索引擎:是依靠于人工分拣的分类目录搜索,以“雅虎”为标志。第二代搜索引擎:是依靠于机器抓取,并建立在超级链接分析技术基础之上的网页搜索,以“google”为代表,其信息量大、更新及时,但返回信息过多,可能有很多无关信息。

23、第三代搜索引擎:是把“智能化”、 ”人机交互”等功能融入了主流。将自动分类技术、中文内容分析技术及区域识别技术应用到大型搜索引擎中,除了在信息检索速度、更新频率等基本技术指标方面处于领先地位外,它的网页相关检索、拼音纠错、模糊查询、语音查询技术也具有很高的水准。此外,还同时兼备了新闻、mp3、图片、flash搜索功能,已成为能够提供全面、综合的信息搜索服务。2.2 lucnen的历史lucene是一个支持全文检索的开源工具包,在介绍lucene之前,先来说明一下什么是全文检索和全文检索系统。2.2.1 什么是全文检索与全文检索系统全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建

24、立一个索引,指明该词在文章中出现的次数和位置,当我们查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给我们的检索方式。这个过程类似于通过字典中的检索字表查字的过程。全文检索的方法主要分为按字检索和按词检索两种。按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。按词检索指对文章中的词,即语义单位建立索引,检索时按词检索,并且可以处理同义项等。英文等西方文字由于按照空白切分词,因此实现上与按字处理类似,添加同义处理也很容易。中文文字则需要切分字词,以达到按词索引的目

25、的,关于这方面的问题,是当前全文检索技术尤其是中文全文检索技术中的难点,在此不做详述。全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。一般来说,全文检索需要具备建立索引和提供查询的基本功能,此外现代的全文检索系统还需要具有方便的用户接口、面向www的开发接口、二次应用开发接口等。功能上,全文检索系统具有建立索引、处理查询返回结果集、增加索引、优化索引结构等功能,外围则由各种不同应用具有的功能组成。结构上,全文检索系统具有索引引擎、查询引擎、文本分析引擎、对外接口等,加上各种外围应用系统共同构成了全文检索系统。 图2-1 全文检索系统结构2.2.2 什么是lucenelu

26、cene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎及部分文本分析引擎(英文与德文两种西方语言)。lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便地在目标系统中实现全文检索的功能,或者是以次为基础建立起完整的全文检索引擎。 lucene的原作者是doug cutting,他是一位资深全文索引/检索专家,曾经是v-twin搜索引擎的主要开发者,后在excite担任高级系统架构设计师, 目前从事于一些internet底层架构的研究。一开始d

27、oug cutting,将lucene发表在自己的个人主页上,2000年3月将其转移到了sourceforge上,并于2001年10捐献给血apache,使lucene成为jakarta的一个子工程。2.2.3 lucene的发展和现状经过多年的发展,lucene在全文检索领域已经有了很多的成功案例,并积累了良好的声誉。基于lucene的全文检索产品和应用lucene的项目在世界各地已经非常之多,其中比较知名的如下。 eclipse:主流java开发工具,其帮助文档采用lucene作为检索引擎。 jive:知名论坛系统,其检索功能基于lucene。 ifinder:出自德国的网站检索系统,基于

28、lucene(http://)。mit dspace federation:一个文档管理系统(http:/ //)。国内外采用lucene作为网站全文检索引擎的也很多,比较知名的有:http://weblucene/;http://;http://;http://;在所有这些应用案例中,开源应用占了很大一部分,但更多的还是商化业产品和网站。毫不夸张地说,lucene的出现,极大地推动了全文检索技术在各个

29、行业或领域中的更深层次应用。2.2.4 使用lucene能做什么lucene可以对任何的数据做索引和搜索。lucene不管数据源是什么格式,只要它能被转化为文字的形式,就可以被lucene所分析利用。也就是说不管是word、html、pdf还是其他什么形式的文件只要你可以从中抽取出文字形式的内容就可以被lucene所用,就可以用lucene对它们进行索引以及搜索。2.2.5 谁在使用lucene作为一个开放源代码的项目,lucene从问世之时起,就引发了开放源代码社区的巨大反响。我们不仅使用它构建具体的全文检索应用,而且也将它集成到了各种系统软件中,以及用它来构建各种web应用,甚至某些商业软

30、件也采用了lucene作为其内部全文检索子系统的核心。例如,众所周知的apache软件基金会的网站使用了lucene作为全文检索的引擎,ibm 司开源软件ec1ipse的2.1版本中也采用了lucene作为帮助子系统的全文索引引擎,相应的ibm 司的商业软件web sphere中也采用了lucene。lucene正以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。2.3 索引和搜索建立索引和搜索是搜索引擎最重要的也是最基本的两部分。不过,这涉及了方方面面的知识,在这里只先介绍最基础的,以后的内容会越来越深入地介绍相关内容。2.3.1 索引 基本的查询方法可以通过顺序扫描

31、文本的方式来实现,这种方法被称作是“顺序查找”。使用这样的方法之前,不需要对文档集合中的信息做任何形式的预处理,当我们进行查询时,直接在文档中进行字符串的简单匹配。相对来讲,这种方法比较简单,容易实现,但是,同时也存在一个很大的缺点。当需要查找的文件大小达到一定数量级别的时候,这种查找方法的效率就成为一个很大的问题。特别是需要查找的文件数量特别大时,这种方法几乎已经不能满足实际的需要了。正因如此,人们又创造了各种不同的查找方法,使用索引就是其中的一种方法。索引,是在搜索时使用到的一种特殊的数据结构。当文档的数量相当庞大,并且这些文档中的信息相对稳定时,建立索引可以大大提高搜索时的效率。不过,这

32、种索引结构不支持快速的信息更新,即当建立完成索引后,如果文档中的信息发生了变化,也必须对索引进行更新,才能够使用索引检索到最新的信息。(注意:在实际中,通常是通过定期更新索引,并把索引添加到原索引中实现的。)在使用索引进行查找时,首先对需要索引的文档进行预处理,建立关于这些文档的索引结构。索引的技术主要有以下3种:倒排索引,后缀数组和签名文件。其中,倒排索引技术在当前大多数的信息检索系统中得到了广泛的应用,它对于关键词的搜索非常有效,在lucene中也是使用的这种技术。后缀数组技术在短语查询中具有很快的速度,但是这样的数据结构在构造和维护时都比较复杂一些。签名文档技术在20世纪80年代时期比较

33、流行,但是后来倒排索引技术逐渐超越了它。2.3.2 搜索检索系统在建立好索引以后,既可以对我们的查询做出响应,该响应过程是通过搜索过程来实现的。搜索的目的就是要为用户提供高质量的搜索结果。既要求响应时间快,又要求搜索结果准确,这就涉及了搜索算法的问题。 此外,搜索程序在搜索到一定数量的结果之后,就要以一定的方式把搜索结果反馈给我们,包括以什么样的格式和什么样的次序返回给我们。我们最关心的还是所搜索到的结果是不是我们真正想要的,而且这些我们想要的结果当然是排在越前面越好,这就涉及了搜索结果的排序问题。 lucene之所以成为一个非常优秀的搜索引擎代码包,与它高效的搜索算法和对搜索结果丰富的排序方

34、法是密不可分的。在这里先只介绍一下lucene搜索的一般流程,在以后的章节中有关于搜索更详细的讲解。2.3.3 倒排索引倒排索引是一种面向单词的索引机制,利用它可以提高检索时的速度。通常情况下,倒排索引结构由“词典”和“出现情况”两部分组成。对于每一个单词,都会有一个词汇列表记录单词在所有文档中出现的位置,这些位置可以是单词的位置(文本中的第几个单词)也可以是字符的位置(文本中的第几个字符)。如果使用正常的索引结构,建立的是“文档到单词”的映射关系,在使用倒排索引技术后,建立的是“单词到文档”的映射关系,那么这两种映射关系到底有何不同呢?它们各自有什么有缺点呢?下面举例说明这两种映射关系的差别

35、。 假设现在有两篇文档:文档a和文档b。文档a的内容是:this is a dog。文档b的内容是:the dog is a kind of animal。下面对这两个文档建立索引结构。如果建立的是一般的索引结构,那么会有如表2-1所示的关系。 表2-1 一般的索引格式示例文档编号出现单词出现次数文档编号出现单词出现次数adog1kind1bdog1animal1从中可以看出,一般的索引结构是以文档为标准建立索引结构的,即它记录的是一篇文档中所有单词出现的情况。比如在文档b中dog,kind、anima1均出现了一次。然而,用户在进行检索时,都是输入关键字进行查询,如果使用这种索引结构,在查询

36、某一关键字时往往需要遍历所有的索引,当索引量非常大时,效率会成为一个很大的问题。倒排索引恰恰解决了这个问题它是以关键字为标准建立索引的。从表2-2可以看出,倒排索引是以单词为标准建立的索引结构,它描述了一个单词在所有文档中的出现情况,比如说“dog“在文档a和文档b中分别出现了一次,而单词“kind“只在文档b中出现了一次。表2-2 倒排索引结构示例单 词出现的文档出现次数单 词出现的文档出现次数doga,b1,1animalb1kindb1通过比较可以发现,一般的索引结构建立的是一种“文档到单词”的映射关系,而倒排索引建立的则是一种“单词到文档”的映射关系。因为在日常的检索中,通常都是按照关

37、键字进行检索的,所以,倒排索引可以更好地适合这种检索机制的需要。这也是到排索引如今被大规模使用的原因。3 搜索引擎的中文问题通过前面的学习,我们对lucene已经有了大概的认识。然而,由于一些很显而易见的原因,对于中文的支持一直是各种搜索工具的难点。3.1 中文分词问题所谓分词,指的就是将一个完整的句子划分为一个个词条(token)过程。这种词条应当满足某种语言规则,以便于为其建立索引。只有通过这样的方式,才能完成对一种语言的分析和检索。3.1.1 中文分词与英文分词的区别对于英文分词来说,分词是一件很容易的事。因为空格就是它们天然的分隔符。一个软件可以很轻易地根据英文文本中的分隔符为之切分出

38、一个一个的单词来。然而对于中文来说,情况就复杂的多了。中文是世界上最复杂的语言之一,语义的变换无穷和句型结构的不规整使得中文分词一直以来都是一件相当困难的事情。如要对“中华人民共和国”这样一个词进行分词,那么可以分为“中华”,“人民”,“共和国”,或是“中”,“华人”,“民”,“共和国”。很显然,前一种分词方法比较好。可是如何来判别分词的好坏呢?如果是人,则可以通过大脑进行分词识别,可是如何才能让机器知道对词组,对句子进行词语的切分呢?下面就具体讲述中文分词的方法。3.1.2 中文分词的方法对中文进行分词,通常情况下有几种方式。a.单字切分单字切分,就是按照中文一个字一个字地进行分词。以这样方

39、式切分出来的词再进入索引,称为字索引。很显然,这不是一种很好的分词方式,因为随着索引的增大,相应索引条目的内容会不断增大,严重影响效率。另外,当我们对索引进行检索时,如果用户输入5个字,则相当于要对索引进行5次检索,严重的影响效率。b.二分法第种方式就是无论什么词,都使用二分法来切分。所谓二分法,就是指每两个字进行一次切分。如对“天涯若比邻”这样一个词组进行二分法切分,则结果如下:天涯/涯若/若比/比邻这种切分方式完全不考虑词义,语境,机械地对语句进行处理。虽然结果看起来有些可笑,然而,在很长一段时间内,它一直是中文分词的一种很方便的方式。根据这样分词效果建起来的索引会存有大量的垃圾词汇,有可

40、能是我们根本不可能检索的词。因此,它也不是一种最好的方式。c.词库分词一直以来,词库分词被认为是最理想的一种中文分词方式。所谓词库分词其实就是用一个已经建好的词的集合(按某种算法)去匹配目标,当遇上集合中已经存在的词时,就将之切分出来。例如词库中已经存在了“天涯若比邻”这个词时,分词器就会把它当作一个词条加入索引。很显然,对于这种分词方式,词库的建立便成了关键。通常,词库的建立需要统计大量的内容,然后根据各种词出现的频率,概率再来进行筛选,最终决定什么词应当放入词库。另外,一些更高级的词库还加入了语义和词性的标注,甚至还有不同词的权重。使用这样的词库进行分词的效果应该是很理想的。4 用luce

41、ne来建立索引和搜索建立索引是使用搜索引擎功能的第一步。关于lucene建立索引的这一部分内容比较多,从索引的建立到索引的优化, 索引的同步机制都是非常重要的内容,而且lucene索引这部分内容与lucene的搜索模块也是密切相关的。除了检索这个必不可少的步骤外,搜索也是非常重要的一步。只有能够搜索到用户需要的内容,才算是一个好的搜索引擎。在建立索引和检索过程中,分析是很重要的一个环节。lucene使用分析器(analyzer)来对各种各样的输入进行分析,可以说analyzer在lucene开发包中占有举足轻重的地位,它的运行性能和分析能力直接影响到搜索引擎的许多环节。4.1 lucene分析

42、器analyzer4.1.1 analyzer的概述analyzer中文可以翻译成“分析器”,是lucene中内置的一种工具。它主要用于分析搜索引擎遇到的各种文本。所谓分析,用更具体的话说其实就是“分词”和“过滤”。从图4-1中可以看出,分析器位于索引和文本资源之间,这样所有进入索引库的文本资源都应当经过分析器的分析,以此来控制索引中的内容。未经过分析器分析的文本如果直接进入索引,可能会引起各种各样数据的一致性问题,同时会降底索引的效率,进而影响整个搜索引擎的性能。正如前面所述,在lucene中,一个分析器主要包括分词器和过滤器两种组件。分词器就是用于对文本资源进行切分,将文本按规则切分为一个

43、个可以进入索引的最小单位。而过滤器的功能则是对这种最小单位进行预处理,比如大写转小写,复数转单数等。这种操作可以简单(如最简单的大写转小写),也可以相当复杂(如根据语义改写拼写错误的单词)。 图4-1 分析器的位置4.1.2 lucene内建的分析器lucene提供了几种不同环境和需求下使用的analyzer,最常用的如standardanalyzer,另外还有simpleanalyzer,whitespaceanalyzer,germananalyzer等,这些都是被统一称为是lucene内置的analyzer。这其中的每一种analyzer都有它自己独特的功能和用途,因此在使用时可根据不同

44、的需要选择适合的analyzer。4.2 索引建立的过程在lucene所公开的api中,仅有为数不多的方法可以在建立索引时使用。从这一方面来看,大大简化了使用lucene建立索引的过程,提高了lucene的易用性;从另一方面来看,在简单的api的背后,隐藏着更为复杂的操作,并且只有熟悉并掌握了这些更为复杂的操作过程,才能更加灵活地使用lucene建立索引,逐步成为以为使用lucene的高手。从整体来看,lucene建立索引的过程有以下4步:提取文本;构建document;分析;建立索引。4.2.1 提取文本为了使用lucene对文档数据建立索引,第一步就是要把这些需要建立索引的文档数据转换成l

45、ucene可以处理的类型。在使用lucene过程中不得不面对一些更为复杂的文档数据类型,如图4-2所示。 图4-2 面对多种文档类型的处理假设现在的任务是对一系列的pdf文档数据建立索引。首先为了使lucene能够对这些文档数据建立索引,必须先想办法从这些pdf文档中提取出文本信息,并且使用这些提取出来的信息来构建lucene中的document和field。同样,当我们在需要对word文档或者其它任何类型的文档建立索引时也面临着类似的问题。4.2.2 构建document构建document是索引建立过程的第二步。有关lucene document的概念在后面会有详细说明,此处不再熬述。这一

46、步的主要目的就是将前面所提取出来的文本组装成lucene可以识别的格式来为索引的建立做准备。4.2.3 分析并建索在提取了需要lucene建立索引的数据并且创建了document之后,接下来就可以调用indexwriter类的adddocument()方法来使lucene建立索引了。在这样的调用中,lucene会首先对所要建立索引的数据进行分析(analysis)以使得在建立索引时可以更加容易地处理这些数据,然后索引器会按lucene所规定的索引格式将数据写入索引文件。4.3 lucene的文档格式在前面已经提到了两个概念:document(文档)和field(字段)。document和fie

47、ld在lucene的索引过程中占有举足轻重的地位,而且,在lucene的搜索部分也会涉及到相应的概念,因此可以说深入理解它们是使用lucene的基础,下面将分别进行介绍。4.3.1 文档(document)假设现在要对一些文本文件建立索引,首先需要确定索引的数据源。对文本文件来说,数据源可以是文件名,文件的内容,文件的最后修改时间等。对于每个不同的文件,这些数据源将提供出不同的内容,以便将来存储在索引中。在lucene中,可以把一个document看作是这些不同内容的集合,而“文件名”,“文件内容”等名称可以看成是对不同数据源进行分类的标记,在lucene中我们把这些标记称为field。从根本

48、上来讲,lucene的document代表了一个需要进行索引的“单元”,任何需要进行索引的“文件”都必须被转化成document对象才能够被索引和搜索到。需要注意的是,此处在“文件”二字上加了引号,这是因为并非只有文件才能转化为document类型,任何数据源经过组织都可以构建一个document类型。更进一步说,lucene并不为任何实际物理文件建立索引,而只对document对象建立索引。所以,建立索引的第一步就是将不同的数据源组织为一个document类型的对象。其实,可以把document对象看成一种虚拟的文件,它自身带有多个数据源。从文件能够提供数据源这个角度上来看,document

49、对象与实际的物理文件基本相似,不同之处仅仅在于lucene无法识别普通的物理文件而能识别一个document类型的对象而已。假设现在需要对一个网页执行建立索引的操作,以便在将来可以搜索到这个网页的相关内容,那么我们就需要先把这个网页转换成一个document对象。经过分析可以知道,该网页主要有几个属性(也就是数据源)可能在将来检索时会用到,分别是网页的标题,网页的url,网页的内容和网页的最后修改时间。因此,在为这网页构建document对象时就应当包含这几个不同的field。document的基本使用方法:在document()方法中首先构造了一个document类型的实例,然后依次往doc

50、ument对象中添加了path,modified和contents 3个field,这些field在以后搜索时都将用到,最后返回生成的document类型的对象doc。在对document添加field时,使用的是document对象的add(field fld)方法,例如,在添加path信息到doc对象中时,先通过f.getpath()方法获取到了文件的路径,再用field类自带的静态方法构造出一个field实例,然后将其传给add方法以完成添加。4.3.2 字段(field)正如前面所述,字段(field)是与文档(document)紧密相连的一个概念,在一个document中,它代表了不

51、同数据源的名称。然而,在现实中,数据源所提供的数据并不是以一种一成不变的方式进行处理,对于不同的字段,人们所希望处理的方式并不相同。对于每个field,lucene提供了3种方式以供用户选择进行处理,这3种方式分别是被称为“是否切词”,“是否索引”和“是否存储“。从意义上我们并不难理解这3种方式。a.“是否切词”表示在这个field中的数据是否需要被切词。b.“是否索引”表示在这个field中的数据是否在将来检索时需要被我们检索到,一个“不索引”的field通常仅提供辅助信息储存的功能。c.“是否存储”则表示该field内的信息是否要被原封不动的保存在索引中。lucene的field类提供的构

52、造方法支持用户构造不同类型的field,但更为常见的是使用field类所提供的静态方法来构造所需要的字段。在field中,通过静态方法定义了4种不同类型的字段text、keyword、unindexed和unstored可供使用,这4种字段在是否切词、是否索引以及是否存储等方面都有所不同,因此四种字段各有不同的用途。下面是详细介绍:(1) texttext类型的字段代表一段需要被切词和索引的内容,这也就说明了这种类型的字段可被搜索。但是,对于这个字段的大小一定要格外小心,因为text类型的字段有两个不同的构造函数:field. text(string, string)和field. text(

53、string, reader)。如果被索引的字段是java中的string类型,那么它不仅会被索引,同时也会被存储起来,但如果是由java里面的reader类型来为该字段提供数据源,那么它就会被索引,而不会被存储起来了。这一点在使用中往往引起一些混淆,因此在使用text类型的字段时一定要注意这些区别。通常,field. text(string,reader)用在从某个文本流数据源中获取数据,数据量一般会比较大,而在将来用户可能并不需要重现它的内容,仅是希望对其中的内容做全文检索,所以不需要去存储数据源的内容。但是希望存储数据源的内容,则只能先将其中的内容取出来保存在一个string中,再使用f

54、ield. text(string, string)来构建需要的字段。(2) keywordkeyword(关键字)类型的字段不会被切词,但是会被索引并且完整的存储在索引中。这种类型的字段适合于连接地址urls、文件系统路径信息、时间日期、人名、居民身份证号码,电话号码等。例如,需要存储一个文件的路径名信息,因为文件的路径名信息是不需要切分词的(而且切分词后反而失去了其意义),但是文件的路径名信息是需要索引和存储的,因此就可以把文件的路径名信息存储到keyword类型的字段中。通常情况下,可以通过field. keyword(string fieldname, string keyword)或field. keyword(string fieldname, data data)(专门针对日期型的关键字)这两个静态方法来构造keyword类型的字段。(3) unindexedunindexed类型的字段既不会被切词,也不会被索引,但是它的

温馨提示

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

评论

0/150

提交评论