Chapter2lucene框架基础.ppt_第1页
Chapter2lucene框架基础.ppt_第2页
Chapter2lucene框架基础.ppt_第3页
Chapter2lucene框架基础.ppt_第4页
Chapter2lucene框架基础.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

Chapter2 lucene框架基础,陈珂锐 计算机与信息工程学院,目录,1.Lucene简介 2.预备知识-类图 3.Lucene类图 4.入门实例,1. Lucene简介,1.1 什么是Lucene 1.2 全文检索系统的结构 1.3 为什么使用Lucene 1.4 Lucene版本号 1.5 Lucene移植版本 1.6 Lucene倒排索引原理 1.7 基于Lucene的搜索程序 1.8 Nutch,1.1 什么是Lucene,Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。 全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。 Lucene是一个高性能、可伸缩的信息搜索(IR)库。 Information Retrieval (IR) library.它使你可以为你的应用程序添加索引和搜索能力。 Lucene的作者Doug Cutting是资深的全文索引/检索专家,最开始发布在他本人的主页上,2001年10月贡献给APACHE,成为APACHE基金的一个子项目。 /lucene/ Lucene是一个IR库而不是现成的产品, 当然也不是Lucene的初识者常常认为的web爬行器,1.2 全文检索系统的结构,1.3 为什么使用Lucene,Lucene具有如下突出的优点: (1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。 (2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。 (3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。 (4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。 (5)已经默认实现了一套强大的查询引擎,用户无需编写代码,系统可获得强大的查询能力,Lucene的查询中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。 开源,可扩展能力强,有各种语言版本,适合各种平台,1.4 Lucene版本号(1),1.4 Lucene版本号(2),1.5 Lucene 移植版本,Lucene implementations in languages other than Java: CLucene - Lucene implementation in C+ dotLucene - Lucene implementation in .NET Lucene4c - Lucene implementation in C LuceneKit - Lucene implementation in Objective-C (Cocoa/GNUstep support) Lupy - Lucene implementation in Python (RETIRED) NLucene - another Lucene implementation in .NET (out of date) Zend Search - Lucene implementation in the Zend Framework for PHP 5 Plucene - Lucene implementation in Perl KinoSearch - a new Lucene implementation in Perl PyLucene - GCJ-compiled version of Java Lucene integrated with Python MUTIS - Lucene implementation in Delphi Ferret - Lucene implementation in Ruby,1.6 Lucene倒排索引原理,假设有两篇文章1和2 文章1: Tom lives in Guangzhou,I live in Guangzhou too. 文章2: He once lived in Shanghai. 经过分词处理后 文章1的所有关键词为:tom live guangzhou i live guangzhou 文章2的所有关键词为:he live shanghai 加上“出现频率”和“出现位置”信息后,我们的索引结构为:,Lucene只关注文本的索引和搜索!,1.7 基于Lucene的搜索程序,ActiveMath - a user adaptive, interactive and web-based learning environment for mathematics Aduna AutoFocus - a visual desktop search tool Aduna Metadata Server - RDF-based indexing server for metadata and full text Ahahi - a search engine (web,news,image,forum,crawler) Affiliate Ranker - an affiliate program search engine Bigsearch.ca - uses nutch, based on lucene open source software to deliver its search results. BibleDesktop - A Bible study program using lucene to search Bibles,/jakarta-lucene/PoweredBy,1.7 基于Lucene的搜索程序,Bixee - Search Engine for Jobs in India. BNCF Opac - Online Public Access Catalog, indexing data in unimarcslim format Australia Unclassified - Australias 100% FREE online classifieds service Celoxis - web based project management tool CodeCrawler - is a smart, web-based search engine specifically built for use by developers for searching source code. Coolposting - a search engine for discussion forums. Coolposting helps you find the real solutions, experiences and opinions people have posted in different discussion forums. Corinis CCM - a web content management and community system CvMail - web based tool for recruiters (to manage job-applications by mail) ,1.8 Nutch,Nutch 是一个刚刚诞生开放源代码(open-source)的web搜索引擎。 Nutch是采用Lucene核心的一个web搜索引擎的实现 Nutch使用Lucene进行索引,所以所有的Lucene工具和API都可以在Nutch生成的索引上工作。 它是一个真正的应用程序。也就是说,你可以直接下载下来拿过来用。它在Lucene的基础上加了网络爬虫和一些和Web相关的东东。其目的就是想从一个简单的站内索引和搜索推广到全球网络的搜索上,像Google和Yahoo一样。当然,和那些巨人竞争,你得动一些脑筋,想一些办法。,2. 预备知识类图,3. Lucene类图,3. Lucene类图,3.1 基础封装类 3.2 索引核心类 3.3 term 3.4 field 3.5 document 3.6 段(segment),3.1 基础封装类,1.org.apache.lucene.util定义了一些常量和优化过的常用的数据结构和算法。 Arrays:数组的排序方法的静态类,提供了优化的基于快排序的排序方法sort BitVectorC/C+语言中位域的java实现品,但是加入了序列化能力 Constants常量静态类,定义了一些常量 PriorityQueue一个优先队列的抽象类,用于后面实现各种具体的优先队列,提供常数时间内的最小元素访问能力,内部实现机制是哈析表和堆排序算法 2. org.apache.lucene.document文档(document)和域(field)概念的一个类定义,3.2 索引核心类,1. org.apache.lucene.store包 。存储抽象是唯一能够直接对索引文件存取的包,因此其主要目的是抽象出和平台文件系统无关的存储抽象,提供诸如目录服务(增、删文件)、输入流和输出流 2. org.apache.lucene.index包,3.2 索引核心类-store,整个org.apache.lucene.store中主要的继承体系共有三个抽象类定义: Directory InputStream OutputStrem,3.2 索引核心类-store,构成了一个完整的基于抽象文件系统的存取体系结构,在此基础上,实作出了两个实现品:(FSDirectory,FSInputStream,FSOutputStream)和(RAMDirectory,RAMInputStream和RAMOutputStream)。 前者是以实际的文件系统做为基础实现的,后者则是建立在内存中的虚拟文件系统。前者主要用来永久的保存索引文件,后者的作用则在于索引操作时是在内存中建立小的索引,然后一次性的输出合并到文件中去,这一点我们在后面的索引逻辑部分能够看到。,3.2 索引核心类-store,此外,还定以了org.apache.lucene.store.lock和org.apache.lucene.store.with两个辅助内部实现的类用在实现Directory方法的makeLock的时候,以在锁定索引读写之前来让客户程序做一些准备工作 。 (FSDirectory,FSInputStream,FSOutputStream)的内部实现依托于java语言中的io类库,只是简单的做了一个外部逻辑的包装,3.2 索引核心类-store,(RAMDirectory,RAMInputStream和RAMOutputStream)的内部实现就比较直接了,直接采用了虚拟的文件RAMFile类 。RAMFile中采用数组来表示文件的存储空间 Lucene中存储抽象这部分设计时采用了工厂模式(Factory parttern),3.2 索引核心类-store,3.2 索引核心类-store,3.2 索引核心类-store,3.2 索引核心类-index,是一个承上启下的索引核心部分。无论是对外接口中的查询,还是分析各种文本以进一步生成索引,都需要直接调用这部分来获得对索引文件的访问能力 。 上边的基础类已经设计了DOCUMENT,FIELD,因此实际上Lucene在这部分需要完善的概念结构还有segment和term。,3.3 term,项(Term)所表示的是一个字符串,它拥有域、频数和位置信息等等属性。因此,Lucene中设计了两个类来表示这个概念: Term TermInfo,3.3 term,上图中,有意的突出了类Term和TermInfo中的数据成员,因为它反映了对于项(Term)这个概念的具体表示。同时上图中也同时列出了用于永久化项(Term)的代理类TermInfosWriter和TermInfosReader,它们完成永久化的功能,需要注意的是,TermInfosReader内部使用了数组indexTerms和indexInfos来存储一系列项;而TermInfosWriter则是一个类似于链表的结构,通过一个other指向下一个TermInfosWriter,每一个TermInfosWriter只负责本身那个lastTerm和lastTi的永久化工作。这是一个设计上的技巧,通过批量读取(或者称为缓冲的方式)来获得读入时候的效率优化;而通过一个链表式的、各负其责的方式,来获得写出时候的设计简化。,3.3 term,项(term)这部分的设计中,还有一些重要的接口和类,我们先介绍如下,同样我们也先展示UML图,3.3 term,TermEnum、TermDocs与TermPositions,第一个是抽象类,后两个都是接口。TermEnum的设计主要用在后面Segment和Document等等的实现中,以提供枚举其中每一个项(Term)的能力。TermDocs是一个接口,用来继承以提供返回值对的能力,通过这个接口就可以获得某个项(Term)在某个文档中出现的频数。TermPositions则是在TermDocs上的扩展,将项(Term)在文档中的位置信息也表示出来。TermDocs(TermPositions)接口的使用方式类似于java中的Enumration接口,即通过next方法跳转,通过doc,freq等方法获得当前的属性值。,3.4 field,由于Field的基本概念在org.apache.lucene.document中已经做了定义,因此在这部分主要是针对项文件(.fnm文件、.fdx文件、.fdt文件)所需要的信息再来设计一些类。,域表和存取逻辑的UML图:,3.4 field,FieldInfos即为域表的概念表示,内部采用了冗余的方式以获取在通过域的编号访问或者通过域的名字来访问时候的高效率。FieldsReader与FieldsWriter则分别是写出和读入的代理类,3.5 document,Document的设计基本上沿用了链表的处理方法。左边的Document类作为一个数据外包类,用来提供对于内部结构DocumentFieldList的增加删除访问操作等等。DocumentFieldList才是实际上的数据存储单位,它用了链表的处理方法,直接指向一个当前的Field对象和下一个DocumentFieldList对象,这个与前面的类似。为了能够逐个访问链表中的节点,还设计了DocumentFieldEnumeration枚举类。,3.5 document,3.5 document,3.6 段(segment),段(Segment)这一部分设计的比较特殊,在实现简单的对象结构之上,还特意的设计了用于段之间合并的类,3.6 段(segment),Lucene定义了一个类SegmentInfo用来表示每一个段(Segment)的信息,包括名字(name)、含有的文档的数目(docCount)和段所位于的目录的位置(dir)。根据索引文件中的段的意义,有了这三点,就能唯一确定一个段了。SegmentInfos这个类则是用来表示一个段的链表(从标准的java.util.Vector继承而来),实际上,也就是索引(index)的意思了。需要注意的是,这里并没有在SegmentInfo中安插一个文档(documen

温馨提示

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

评论

0/150

提交评论