论坛首页 Java企业应用论坛

Lucene 索引和搜索过程核心类详解

浏览 2904 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-01  

Lucene 索引和搜索过程核心类详解

索引核心类

1、IndexWriter(写索引)
2、Directory(索引存放位置)
3、Analyzer(分析器)
4、document(文档)
5、Field(域)

 

搜索核心类
1、IndexSearcher(搜索引)
2、Term(搜索功能基本单元)
3、Query(查询)
4、TermQuery(Query 子类 最基本查询类型)
5、TopDocs(指针容器)

 

 

IndexWriter

      IndexWriter是在索引过程中的中心组件。这个类创建一个新的索引并且添加文档到一个已有的索引中。
它可以对索引进行添、删、更新操作,但是不能读取或搜索。

添加方法
      addDocument (Document)加Document使用默认的分词器
      addDocument (Document, Analyzer)加入的时候使用指定的分词器

删除方法
     deleteDocuments (Term);
     deleteDocuments (Term[]);
     deleteDocuments (Query);
     deleteDocuments (Query[]);
     一般最好有个唯一索引,这样才好删,不然的话有可以会一删一大堆
     如:writer.deleteDocument(new Term(“ID”, documentID));

更新方法
      注意:更新索引也提供两个方法,其实Lucene是没有办法更新的,只有先删除了再更新,
      updateDocument (Term, Document);
      如:writer.updateDocument(new Term(“ID”, documenteId), newDocument);
      updateDocument (Term, Document, Analyzer)

 

 

Directory
      Directory类代表一个Lucene索引的位置。它是一个抽象类,允许它的子类(其中的两个包含在Lucene中)在合适时存储索引。在我们的Indexer示例中,我们使用一个实际文件系统目录的路径传递给IndexWriter的构造函数来获得Directory的一个实例。IndexWriter然后使用Directory的一个具体实现FSDirectory,并在文件系统的一个目录中创建索引。
      在你的应用程序中,你可能较喜欢将Lucene索引存储在磁盘上。这时可以使用FSDirectory,一个包含文件系统真实文件列表的Driectory子类,如同我们在Indexer中一样。另一个Directory的具体子类是RAMDirectory。尽管它提供了与FSDirectory相同的接口,RAMDirectory将它的所有数据加载到内存中。所以这个实现对较小索引很有用处,可以全部加载到内存中并在程序关闭时销毁。因为所有数据加载到快速存取的内存中而不是在慢速的硬盘上,RAMDirectory适合于你需要快速访问索引的情况,不管是索引或搜索。做为实例,Lucene的开发者在所有他们的单元测试中做了扩展使用:当测试运行时,快速的内存驻留索引被创建搜索,当测试结束时,索引自动销毁,不会在磁盘上留下任何残余。当然,在将文件缓存到内存的操作系统中使用时RAMDirectory和FSDirectory用法 :http://eryk.iteye.com/blog/1115456

 

Analyzer(分析器)

      在文本索前之前,它先通过Analyzer。Analyzer在IndexWriter的构造函数中指定,是指对文本内容提取关键词并除去其它的。如果要索引的内容不是普通的文本,首先要转化成文本,Analyzer是个抽象类,但是Lucene中有几个它的实现。有的处理不能用来把某个文件与其它文件区分开的常用的词);有的处理时把关键字转化为小写字母,所以这个搜索不是大小写敏感等等。Analyzer是Lucene的一个重要的部分并且不只是在输入过滤中使用。对一个将Lucene集成到应用程序中的开发者来说,对Analyzer的选择在程序设计中是重要元素。

 

 

深入浅出Lucene Analyzer

Lucene中Analyzer处理过程详解


Document
      一个Document代表字段的集合。你可以把它想象为以后可获取的虚拟文档—一块数据,如一个网页、一个邮件消息或一个文本文件。一个文档的字段代表这个文档或与这个文档相关的元数据。文档数据的最初来源(如一条数据库记录、一个Word文档、一本书的某一章等等)与Lucene无关。元数据如作者、标题、主题、修改日期等等,分别做为文档的字段索引和存储。
注意 当我们在本书中提到一个文档,我们指一个Microsoft Word、RTF、PDF或其它文档类型;我们不是谈论Lucene的Document类。注意大小写和字体的区别。
      Lucene只用来处理文本。Lucene的核心只能用来处理java.lang.String和java.io.Reader。尽管很多文档类型都能被索引并使之可搜索,处理它们并不像处理可以简单地转化为java的String或Reader类型的纯文本内容那样直接。在我们的Indexer中,我们处理文本文件,所以对我们找出的每个文本文件,创建一个Document类的实例,用Field(字段)组装它,并把这个Document添加到索引中,完成对这个文件的索引。

 

 

Field
    在索引中的每个Document含有一个或多个字段,具体化为Field类。每个字段相应于数据的一个片段,将在搜索时查询或从索引中重新获取。


Lucene提供四个不同的字段类型,你可以从中做出选择:
1、Keyword不被分析,但是被索引并逐字存储到索引中。
      这个类型适合于原始值需要保持原样的字段,如URL、文件系统路径、日期、个人名称、社会安全号码、电话号码等等。例如,我们在Indexer(列表1.1)中把文件系统路径作为Keyword字段。


2、UnIndexed—不被分析也不被索引,但是它的值存储到索引中。
      这个类型适合于你需要和搜索结果一起显示的字段(如URL或数据库主键),但是你从不直接搜索它的值。因为这种类型字段的原始值存储在索引中,这种类型不适合于存放比较巨大的值,如果索引大小是个问题的话。


3、UnStored—和UnIndexed相反。
      这个字段类型被分析并索引但是不存储在索引中。它适合于索引大量的文本而不需要以原始形式重新获得它。例如网页的主体或任休其它类型的文本文档。


4、Text—被分析并索引。
      这就意味着这种类型的字段可以被搜索,但是要小心字段大小。如果要索引的数据是一个String,它也被存储;但如果数据(如我们的Indexer例子)是来自一个Reader,它就不会被存储。这通常是混乱的来源,所以在使用Field.Text时要注意这个区别。

所有字段由名称和值组成。你要使用哪种字段类型取决于你要如何使用这个字段和它的值。严格来说,Lucene只有一个字段类型:以各自特征来区分的字段。有些是被分析的,有些不是;有些是被索引,然面有些被逐字地存储等等。
表1.2提供了不同字段特征的总结,显示了字段如何创建以及基本使用示例。
表1.2 不同字段类型的特征和使用方法
Fied method/type Analyzed Indexed Stored Example usage
Field.Keyword(String,String)
Field.Keyword(String,Date) ? ? Telephone and Social Security numbers, URLs, personal names, Dates
Field.UnIndexed(String,String) ? Document type (PDF, HTML, and so on), if not used as search criteria
Field.UnStored(String,String) ? ? Document titles and content
Field.Text(String,String) ? ? ? Document titles and content
Field.Text(String,Reader) ? ? Document titles and content

注意 所有字段类型都能用代表字段名称和它的值的两个String来构建。
另外,一个Keyword字段可以接受一个String和一个Date对象,Text字段接受一个String和一个Reader对象。
在所有情况下,这些值在被索引之前都先被转化成Reader,这些附加方法的存在可以提供比较友好的API。
注意 注意Field.Text(String, String)和Field.Text(String, Reader)之间的区别。String变量存储字段数据,而Reader变量不存储。为索引一个String而又不想存储它,可以用Field.UnStored(String, String)。
最后,UnStored和Text字段能够用来创建词向量。为了让Lucene针对指定的UnStored或Text字段创建词向量,你可以使用Field.UnStored(String, String, true),Field.Text(String, String, true)或Field.Text(String, Reader, true)。

 

 

//==========搜索核心类=======

 

IndexSearcher
      IndexSearcher用来搜索而IndexWriter用来索引:暴露几个搜索方法的索引的主要链接。你可以IndexSearcher想象为以只读方式打开索引的一个类。它提供几个搜索方法,其中一些在抽象基类Searcher中实现;最简单的接受单个Query对象做为参数并返回一个Hits对象。这个方法的典型应用类似这样:
IndexSearcher is = new IndexSearcher(
FSDirectory.getDirectory(“/tmp/index”, false));
Query q = new TermQuery(new Term(“contents”, “lucene”));
Hits hits = is.search(q);

lucene3.0_IndexSearcher的基础使用及注意事项  

 

Term
      Term是搜索的基本单元。与Field对象类似,它由一对字符串元素组成:字段的名称和字段的值。注意Term对象也和索引过程有关。但是它们是由Lucene内部生成,所以在索引时你一般不必考虑它们。在搜索时,你可能创建Term对象并TermQuery同时使用。


Query q = new TermQuery(new Term(“contents”, “lucene”));
Hits hits = is.search(q);

这段代码使Lucene找出在contents字段中含有单词lucene的所有文档。因为TermQuery对象继承自它的抽象父类Query,你可以在等式的左边用Query类型

 

 

 

Query
       Lucene中包含一些Query的具体子类。到目前为止,在本章中我们仅提到过最基本的Lucene Query:TermQuery。其它Query类型有BooleanQuery,PhraseQuery, PrefixQuery, PhrasePrefixQuery, RangeQuery, FilteredQuery和SpanQuery。

构建各种Lucene Query

 

TermQuery
       TermQuery是Lucene支持的最基本的查询类型,并且它也是最原始的查询类型之一。它用来匹配含有指定值的字段的文档,这在前几段只已经看到。

 

TopDocs
搜索结果的容器。TopFieldDocs是其派生类,也是存放搜索结果的容器

类 org.apache.lucene.search.TopDocs的使用
http://www.7-sun.com/doc/Lucene3.03/org/apache/lucene/search/class-use/TopDocs.html

 

 

 

 

Lucene 笔记一(是什么?,能做什么?,怎么做?)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   发表时间:2011-12-01  
不知道你对索引维护是怎么管理的?增量索引?有没有完全重建索引的的情况?
0 请登录后投票
   发表时间:2012-01-06  
需要入门后的实战提高,最好有项目经验的
网上lucene到处都充满着这种入门文章

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics