1.Lucene 基础知识

原创 2011年01月16日 16:23:00

Lucene 简介

Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。 Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。

目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。 Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的, Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档, PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。

1 表示了搜索应用程序和 Lucene 之间的关系,也反映了利用 Lucene 构建搜索应用程序的流程:

 


--------------------------------------------------------------------------------------------------------------------------------------------------------------------

Lucene 软件包分析

Lucene 软件包的发布形式是一个 JAR 文件,下面我们分析一下这个 JAR 文件里面的主要的 JAVA 包,使读者对之有个初步的了解。

Package: org.apache.lucene.document

这个包提供了一些为封装要索引的文档所需要的类,比如 Document, Field 。这样,每一个文档最终被封装成了一个 Document 对象。

Package: org.apache.lucene.analysis

这个包主要功能是对文档进行分词,因为文档在建立索引之前必须要进行分词,所以这个包的作用可以看成是为建立索引做准备工作。

Package: org.apache.lucene.index

这个包提供了一些类来协助创建索引以及对创建好的索引进行更新。这里面有两个基础的类: IndexWriter IndexReader ,其中 IndexWriter 是用来创建索引并添加文档到索引中的, IndexReader 是用来删除索引中的文档的。

Package: org.apache.lucene.search

这个包提供了对在建立好的索引上进行搜索所需要的类。比如 IndexSearcher  Hits, IndexSearcher  定义了在指定的索引上进行搜索的方法, Hits  用来保存搜索得到的结果。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

建立索引

为了对文档进行索引, Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory 。下面我们分别介绍一下这五个类的用途:

Document

Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。

Field

Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。

Analyzer

在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。 Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer Analyzer 把分词后的内容交给 IndexWriter 来建立索引。

IndexWriter

IndexWriter Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。

Directory

这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory ,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory ,它表示一个存储在内存当中的索引的位置。

熟悉了建立索引所需要的这些类后,我们就开始对某个目录下面的文本文件建立索引了,清单 给出了对某个目录下的文本文件建立索引的源代码。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------

搜索文档

利用 Lucene 进行搜索就像建立索引一样也是非常方便的。在上面一部分中,我们已经为一个目录下的文本文档建立好了索引,现在我们就要在这个索引上进行搜索以找到包含某个关键词或短语的文档。 Lucene 提供了几个基础的类来完成这个过程,它们分别是呢 IndexSearcher, Term, Query, TermQuery, Hits. 下面我们分别介绍这几个类的功能。

Query

这是一个抽象类,他有多个实现,比如 TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query

Term

Term 是搜索的基本单位,一个 Term 对象有两个 String 类型的域组成。生成一个 Term 对象可以有如下一条语句来完成: Term term = new Term( fieldName , queryWord ); 其中第一个参数代表了要在文档的哪一个 Field 上进行查找,第二个参数代表了要查询的关键词。

TermQuery

TermQuery 是抽象类 Query 的一个子类,它同时也是 Lucene 支持的最为基本的一个查询类。生成一个 TermQuery 对象由如下语句完成: TermQuery termQuery = new TermQuery(new Term( fieldName , queryWord )); 它的构造函数只接受一个参数,那就是一个 Term 对象。

IndexSearcher

IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher 的实例在一个索引上进行操作。

Hits

Hits 是用来保存搜索的结果的。

介绍完这些搜索所必须的类之后,我们就开始在之前所建立的索引上进行搜索了,清单 给出了完成搜索功能所需要的代码。

参考文献:http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/

1.Lucene高级查询

1.Lucene高级查询 ~1.自定义排序  @Test  public void test(){   try {    Directory directory=Util.getDirect...
  • u010787396
  • u010787396
  • 2015年09月18日 15:00
  • 147

VC入门必备--基础知识(一)

VC入门必备--基础知识(一)首先我们要了解以下概念:应用程序(Application),他就是由指令(Instruction)组成的可以运行的文件。进程(Process),有时和应用程序的意思一样,...
  • huahuamoon
  • huahuamoon
  • 2007年12月20日 14:39
  • 1137

Web前端之基础知识

学习web前端开发基础技术需要掌握:HTML、CSS、Javascript 1.HTML是网页内容的载体 内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字、图片、视频等。 2.C...
  • bear_huangzhen
  • bear_huangzhen
  • 2015年06月06日 23:00
  • 3711

PHP基础知识总结(w3c)

刚开始学习PHP,以后大家多多指教: 学习后台是一个漫长的过程,刚学PHP,总结了一小部分,有人会问为什么把W3C的东西拷贝出来分享呢? 我的回答是:W3C都是一些入门基础,很有实在意义,...
  • u013808667
  • u013808667
  • 2016年06月14日 11:30
  • 495

linux基础知识总结

Linux是多用户,多任务的操作系统,这意味着多人可以同时使用一台主机。因为每个用户的个人喜好与隐私问题,文件的所有者就显得尤为重要。将用户分为不同的组别当然是为了方便管理。因此用户与文件之间的关系就...
  • wangdan199112
  • wangdan199112
  • 2015年02月28日 20:07
  • 1534

《Html5,基础知识、核心技术与前沿案例》阅读笔记- 待续

本着对前端知识重温梳理,可能有一些是错误的观点,请指出,不甚感激! 第一章:初探Html5 1. 如果需要页面充满全屏。定义 ,body{ height:100%; } 原书描述 ...
  • toberare
  • toberare
  • 2017年03月22日 22:04
  • 831

[总结]音视频基础知识·一

从2016/12/19开始学习音视频知识,原本笔记并不放到博客上,受@雷霄骅的影响,也想通这博客来加强学习。查看人群:音视频领域知识零基础,但想从事或研究音视频的开发人员 已学:1. 数学:高等数学...
  • bangdingshouji
  • bangdingshouji
  • 2017年01月06日 09:42
  • 816

加密与解密-基础知识

大端小端: 大端:高位字节存入低地址,低位字节存入高地址,依次排列 小端:低位字节存入低地址,高位字节存入高地址,反序排列 虚拟内存的实现方法和过程如下 ...
  • zang141588761
  • zang141588761
  • 2017年06月14日 16:04
  • 161

数据结构基础知识(2)

内容接自《数据结构基础知识(1)》。。。 链表的分类 单链表       单链表是一种链式存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素。图中阴影区域表示数据域,空白区表示...
  • happylee6688
  • happylee6688
  • 2013年04月05日 17:14
  • 4314

Android面试基础知识总结(一)

状态:未完成 Android面试基础知识总结。 Activity 生命周期 启动Activity:onCreate->onStart->onResume锁屏或被其它Activity覆盖...
  • wy819
  • wy819
  • 2016年05月16日 20:30
  • 1064
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1.Lucene 基础知识
举报原因:
原因补充:

(最多只允许输入30个字)