`
baobeituping
  • 浏览: 1064930 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Lucene 3.0的简单解析及变化

阅读更多

一、 概述
      Lucene3.0(以下简称3.0)已于2009-11-25发布,3.0版本是重大的版本,改动很大。在API上做了很多的调整,已经删除了很多之前废弃的方法以及类,并支持了很多Java5 的新特性:包括泛型、可变参数、枚举和autoboxing等。
      因此,此版本和2.x版本不能兼容,如要使用3.0版本,最好是在新项目中去使用,而不是去升级2.x或之前的版本!

二、3.0的变化

1、2.9版本介绍:

      由于新版本变动很大,官方是不推荐从旧版本升级到新版本的。因为改动会很大。
      其实在2.9版本时改动就很大,因为2.9版本就是为3.0做准备的,但是为了向下兼容,2.9并没有抛弃之前的旧方法,所以可以直接向下兼容。2.9版本主要是在性能方面的优化,包括在Lucene对Lucene底层的内部结构改进、索引的管理方式等多个方面。

1.1、索引文件改进
      Lucene的索引数据是存放在独立的文件中的,这些文件就是存储着索引数据库一些列分离的“片段”。当我们想索引中增加文档时,便会不断的创建一些可以合并的新片段,因为读写文件的开销比较大,因此这些字段信息Lucene并非每次都直接加到索引文件里面去,而是先缓存,等到一定量的时候再一次写到文件中。在2.9以后,Lucene会为每个片段分别管理FieldCache以此避开跨片段加载FieldCatch的需求,这样就解决了Lucene跨片段加载FieldCatch的效率很低下问题,这个改动大为提高了性能。Lucid Imagination的Mark Miller运行了一个简单的性能测试,表明在5,000,000个不同字符串下的情况下,Lucene 相对于2.4版本会获得15倍左右的性能提高:
Lucene 2.4: 150.726s
Lucene 2.9: 9.695s

1.2 重开搜索
      新版本引入了IndexWriter.getReader()方法,它可用于搜索目前完整的索引,包括当前IndexWriter会话中还没有提交的改变,这带来了接近于实时搜索的能力。此外,你还可以调用IndexWriter.setMergedSegmentWarmer()方法进行“预热”,这样那些片断便可以立即投入使用了。

1.3、数字处理
      2.9版本之前的版本,都是基于文本搜索的,因为对于很多数字的处理方式就很头疼,例如在我们项目中遇到的很多问题都是由于把数字当作了文本处理出现的BUG:
     1、搜索价格的5,把包含.5的也搜索出来了;
     2、排序(降序)时,把800排到5000前面;
     ……
     这些都是由于Lucene把所有的都作为文本处理的方式造成的问题。Lucene 2.9以后已经自带对数字的处理方式。Field和Query类会采取合适的精度进行索引和搜索,这样大大降低了需要搜索的关键字数量,使查询的响应能力得以显著提高。


1.4 其他优化
      引入了新的查询类型和适用性更广的多关键字查询(通配、前缀等等)方式,以及新的针对波斯语,阿拉伯语及中文的分析器。此外,这次更新还包括更好Unicode支持,一个新的查询分析框架,以及对地理位置的查询,它允许根据距离信息对文档进行过滤和排序(如“找出我家5公里范围内的所有超市”)。

2、2.9版本和3.0比较
 
虽然2.9是为3.0做准备的一个版本,但是3.0和2.9相比较,变化还是比较大的,这处要体现在:
1、3.0抛弃了在2.9声明废弃的方法,因此3.0无法向下兼容;
2、3.0放弃了对Java1.4的支持,改为对高版本Java1.5和ant 1.7.0支持;
3、其他内核的一些变化,如oalLock.isLocked()现在会抛出IOException异常,对于一些静态变量的改变等。

3、主要方法的改变
 
这里这种讲下目前新版本后使用建立索引以及搜索的不同。

3.1、建立索引
新版本在建立索引时抛弃了很多未用的方法,见下图,所有声明被抛弃的IndexWriter构造函数都在3.0中被删除。

Lucene 3.0的简单解析 - 前方 - 前方

 


3.0版本的IndexWriter构造函数:

Lucene 3.0的简单解析 - 前方 - 前方

 


在增加索引时,每个field的常量也有改变,具体如下:

3.0和之前版本的常量修改

Lucene 3.0的简单解析 - 前方 - 前方

  

3.2、查询
      删除了Hits类,增加了TopScoreDocCollector去取得“Hits”,实际上在3.0给了个新命名:collector。使用方式和hits类同,同时删除了Search以及QueryParser的几个构造方法,QueryParser删除了 QueryParser(String f, Analyzer a)构造方法。
新查询例子如下(蓝色部分是与以往不同的部分):
view plaincopy to clipboardprint?

Lucene 3.0的简单解析 - 前方 - 前方

 
3.0版本的Search构造方法:

 

Lucene 3.0的简单解析 - 前方 - 前方

 
3.0前的构造方法:

 

Lucene 3.0的简单解析 - 前方 - 前方

 
三、总体图
      3.0版本的结构和之前的版本(2.9之前)相比,在程序结构上表现出来就只是多了一个message包,用来专门处理国际化。

Lucene 3.0的简单解析 - 前方 - 前方

 


      见上图,可以看到,3.0和之前的版本一样还是由对外接口、索引核心以及基础结构封装三大部分共八个模块(也即包package),详细介绍详见附件一。
我们从上图也可以看到Lucene搜索时的调用关系:当我们要查询一个词时,在查询模块(search)会先调用语法分析器(queryParser)对查询语句进行分析,语法分析模块调用了词法分析器(analysis)进行词法分析,如对搜索关键字分词、过滤等,词法分析器在使用时会根据实际情况调用国际化模块(message)进行一些国际化的处理。当这些前置工作做完之后,才真正进入到搜索核心,首先会调用索引模块(index),它负责向底层的存储类(store)去读取索引文件里面的数据,然后返回给查询模块。其他模块在整个搜索过程中是作为公共类存在的。

附件一、 Lucnen3.0包详细介绍
 
1、analysis
      Analysis包含一些内建的分析器,例如按空白字符分词的WhitespaceAnalyzer,添加了stopwrod过滤的StopAnalyzer,最常用的是StandardAnalyzer。

2、document
      Document包含文档的数据结构,例如Document类定义了存储文档的数据结构,Field类定义了Document的一个域。

3、index
      Index包含了索引的读写类,例如对索引文件的segment进行写、合并、优化的IndexWriter类和对索引进行读取和删除操作的 IndexReader类,这里要注意的是不要被IndexReader这个名字误导,以为它是索引文件的读取类,实际上删除索引也是由它完成, IndexWriter只关心如何将索引写入一个个segment,并将它们合并优化;IndexReader则关注索引文件中各个文档的组织形式。

4、queryParser
      QueryParser包含了解析查询语句的类,lucene的查询语句和sql语句有点类似,有各种保留字,按照一定的语法可以组成各种查询。 Lucene有很多种Query类,它们都继承自Query,执行各种特殊的查询,QueryParser的作用就是解析查询语句,按顺序调用各种 Query类查找出结果。

5、search
      Search包含了从索引中搜索结果的各种类,例如刚才说的各种Query类,包括TermQuery、BooleanQuery等就在这个包里。

6、store
      Store包含了索引的存储类,例如Directory定义了索引文件的存储结构,FSDirectory为存储在文件中的索引,RAMDirectory为存储在内存中的索引,MmapDirectory为使用内存映射的索引。

7、util
      Util包含一些公共工具类,例如时间和字符串之间的转换工具。

8、message
      处理国际化的类。

附件二、Lucene相关名词解释(部分)
 
1、IndexWriter
      lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。

2、Analyzer
      分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

3、Directory
      索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。

4、Document
      文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。

5、Field
      字段。

6、IndexSearcher
      是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;

7、Query
      查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。

8、QueryParser
       是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。

9、Hits
      在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的

分享到:
评论

相关推荐

    lucene3.0全文检索入门实例

    **Lucene 3.0 全文检索入门实例** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。它提供了一个高级、灵活的搜索功能框架,允许开发者在自己的应用中轻松地集成全文检索功能。本文将重点介绍如何使用 ...

    lucene 2.0 api以及lucene 3.0 api

    **Lucene 2.0 API 和 Lucene 3.0 API 深度解析** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当...

    lucene3.0-api.CHM

    《Lucene 3.0 API CHM指南》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,广泛应用于各种搜索引擎和信息检索系统。本指南主要关注的是Lucene 3.0版本的API,这是一个强大的工具集,用于在Java环境...

    Lucene 3.0 原理与代码分析

    《Lucene 3.0 原理与代码分析》一书主要涵盖了Lucene 3.0版本的核心概念、工作原理及其源代码解析。Lucene是Apache软件基金会的一个开源项目,是一个高性能、全文检索库,提供了Java API,使得开发者能够方便地在...

    Lucene in Action 2nd

    ### Lucene in Action 第二版 – Apache Lucene 3.0 深度解析 #### 知识点一:Lucene 简介与应用场景 Lucene 是一个高性能、全功能的文本搜索库,它为开发者提供了构建强大搜索应用的能力。本书《Lucene in Action...

    lucene3的最新代码

    10. **API 变更**:每个版本的 Lucene 都可能有 API 的调整,开发者需要关注这些变化,以确保代码兼容性。 在源代码中,`src` 文件夹通常包含了项目的源代码,你可以深入研究其中的类和方法,了解 Lucene 内部的...

    Lucene in Action 第二版

    《Lucene in Action 第二版》是一本深入探讨Apache Lucene搜索引擎库的权威指南,针对的是Lucene 3.0版本。这本书对于那些希望理解和掌握Lucene 3.0技术,以及想要在自己的应用程序中集成全文搜索功能的开发者来说,...

    Lucene in action 第二版 英文版

    《Lucene in Action 第二版》是一本针对Apache Lucene 3.0版本的深入解析与实战指南。从书名可以看出,本书旨在帮助读者通过实际操作掌握Lucene的核心功能和技术细节,尤其对于从3.0版本开始的重大变化进行了详细...

    lucune3.0 及高亮显示 所需的包及代码

    标题中的“lucene3.0”指的是Apache Lucene的3.0版本,这是一个开源的全文检索库,由Java编写。Lucene提供了强大的文本分析、索引和搜索功能,被广泛应用于各种信息检索系统中。而“高亮显示”通常是指在搜索结果中...

    lucene-core-2.9.4,lucene-core-3.0.2,lucene-core-3.0.3,lucene-core-3.4.0

    这个压缩包文件包含了Lucene从2.9.4版本到3.4.0版本的核心组件,让我们一起探讨这些版本中的关键变化和核心知识点。 1. **Lucene 2.9.4** - **查询解析器改进**:2.9.4版本中,查询解析器进行了优化,支持更复杂的...

    lucene 资料全集

    所提供的文档资源,如《Lucene学习总结之一》、《传智播客Lucene3.0课程》、《JAVA_Lucene_in_Action教程完整版》以及《Lucene_in_Action(中文版)》,都是深入了解 Lucene 的宝贵资料,建议结合这些材料进行系统...

Global site tag (gtag.js) - Google Analytics