`
阅读更多
① 我们使用Lucene的IndexSearcher和FSDirectory类来打开我们的索引以进行搜索。
② 我们使用QueryParser来把human-readable查询分析成Lucene的查询类。
③ 搜索以一个Hits对象的形式返回结果集。
④ 注意Hits对象包含的仅仅是隐含的文档的引用。换句话说,不是在搜索的时候立即加载,而是采用从索引中惰性加载的方式—仅当调用hits.doc(int)时。
运行Searcher


1.5 理解核心索引类
在Indexer类中可见,你需要以下类来执行这个简单的索引过程:
n IndexWriter
n Directory
n Analyzer
n Document
n Field
接下来是对这些类的一个简短的浏览,针对它们在Lucene的角色,给出你粗略的概念。我们将在整本书中使用这些类。
1.5.1 IndexWriter
IndexWriter是在索引过程中的中心组件。这个类创建一个新的索引并且添加文档到一个已有的索引中。你可以把IndexWriter想象成让你可以对索引进行写操作的对象,但是不能让你读取或搜索。不管它的名字,IndexWriter不是唯一的用来修改索引的类,2.2小节描述了如何使用Lucene API来修改索引。
1.5.2 Directory
Directory类代表一个Lucene索引的位置。它是一个抽象类,允许它的子类(其中的两个包含在Lucene中)在合适时存储索引。在我们的Indexer示例中,我们使用一个实际文件系统目录的路径传递给IndexWriter的构造函数来获得Directory的一个实例。IndexWriter然后使用Directory的一个具体实现FSDirectory,并在文件系统的一个目录中创建索引。
在你的应用程序中,你可能较喜欢将Lucene索引存储在磁盘上。这时可以使用FSDirectory,一个包含文件系统真实文件列表的Driectory子类,如同我们在Indexer中一样。
另一个Directory的具体子类是RAMDirectory。尽管它提供了与FSDirectory相同的接口,RAMDirectory将它的所有数据加载到内存中。所以这个实现对较小索引很有用处,可以全部加载到内存中并在程序关闭时销毁。因为所有数据加载到快速存取的内存中而不是在慢速的硬盘上,RAMDirectory适合于你需要快速访问索引的情况,不管是索引或搜索。做为实例,Lucene的开发者在所有他们的单元测试中做了扩展使用:当测试运行时,快速的内存驻留索引被创建搜索,当测试结束时,索引自动销毁,不会在磁盘上留下任何残余。当然,在将文件缓存到内存的操作系统中使用时RAMDirectory和FSDirectory之间的性能差别较小。你将在本书的代码片断中看到Directory的两个实现的使用。
1.5.3 Analyzer
在文本索前之前,它先通过Analyzer。Analyzer在IndexWriter的构造函数中指定,司职对文本内容提取关键词并除去其它的。如果要索引的内容不是普通的文本,首先要转化成文本,如果2.1所示。第7章展示了如何从常见的富媒体文档格式中提取文本。Analyzer是个抽象类,但是Lucene中有几个它的实现。有的处理氖焙蛱  罩勾?不能用来把某个文件与其它文件区分开的常用的词);有的处理时把关键字转化为小写字母,所以这个搜索不是大小写敏感等等。Analyzer是Lucene的一个重要的部分并且不只是在输入过滤中使用。对一个将Lucene集成到应用程序中的开发者来说,对Analyzer的选择在程序设计中是重要元素。你将在第4章学到更多有关的知识。
1.5.4 Document
一个Document代表字段的集合。你可以把它想象为以后可获取的虚拟文档—一块数据,如一个网页、一个邮件消息或一个文本文件。一个文档的字段代表这个文档或与这个文档相关的元数据。文档数据的最初来源(如一条数据库记录、一个Word文档、一本书的某一章等等)与Lucene无关。元数据如作者、标题、主题、修改日期等等,分别做为文档的字段索引和存储。
注意 当我们在本书中提到一个文档,我们指一个Microsoft Word、RTF、PDF或其它文档类型;我们不是谈论Lucene的Document类。注意大小写和字体的区别。
Lucene只用来处理文本。Lucene的核心只能用来处理java.lang.String和java.io.Reader。尽管很多文档类型都能被索引并使之可搜索,处理它们并不像处理可以简单地转化为java的String或Reader类型的纯文本内容那样直接。你将在第7章学到处理非文本文档。
在我们的Indexer中,我们处理文本文件,所以对我们找出的每个文本文件,创建一个Document类的实例,用Field(字段)组装它,并把这个Document添加到索引中,完成对这个文件的索引。
1.5.5 Field
在索引中的每个Document含有一个或多个字段,具体化为Field类。每个字段相应于数据的一个片段,将在搜索时查询或从索引中重新获取。
Lucene提供四个不同的字段类型,你可以从中做出选择:
n Keyword—不被分析,但是被索引并逐字存储到索引中。这个类型适合于原始值需要保持原样的字段,如URL、文件系统路径、日期、个人名称、社会安全号码、电话号码等等。例如,我们在Indexer(列表1.1)中把文件系统路径作为Keyword字段。
n UnIndexed—不被分析也不被索引,但是它的值存储到索引中。这个类型适合于你需要和搜索结果一起显示的字段(如URL或数据库主键),但是你从不直接搜索它的值。因为这种类型字段的原始值存储在索引中,这种类型不适合于存放比较巨大的值,如果索引大小是个问题的话。
n UnStored—和UnIndexed相反。这个字段类型被分析并索引但是不存储在索引中。它适合于索引大量的文本而不需要以原始形式重新获得它。例如网页的主体或任休其它类型的文本文档。
n 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字段能够用来创建词向量(高级的话题,在5.7节中描述)。为了让Lucene针对指定的UnStored或Text字段创建词向量,你可以使用Field.UnStored(String, String, true),Field.Text(String, String, true)或Field.Text(String, Reader, true)。
在使用Lucene来索引时你会经常用到这几个类。为了实现基本的搜索功能,你还需要熟悉同样简单的几个Lucene搜索类。
1.6 理解核心搜索类
Lucene提供的基本搜索接口和索引的一样直接。只需要几个类来执行基本的搜索操作:
n IndexSearcher
n Term
n Query
n TermQuery
n Hits
接下来的部分对这些类提供一个简要的介绍。我们将在深入更高级主题之前,在接下来的章节中展开这些解释。
1.6.1 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);
我们将在第3章中描述IndexSearcher的细节,在第5、6章有更多信息。
1.6.2 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类型。
1.6.3 Query
Lucene中包含一些Query的具体子类。到目前为止,在本章中我们仅提到过最基本的Lucene Query:TermQuery。其它Query类型有BooleanQuery,PhraseQuery, PrefixQuery, PhrasePrefixQuery, RangeQuery, FilteredQuery和SpanQuery。所有这些都在第3章描述。Query是最基本的抽象父类。它包含一些通用方法,其中最有趣的是setBoost(float),在第3.5.9小节中描述。
1.6.4 TermQuery
TermQuery是Lucene支持的最基本的查询类型,并且它也是最原始的查询类型之一。它用来匹配含有指定值的字段的文档,这在前几段只已经看到。
1.6.5 Hits
Hits类是一个搜索结果(匹配给定查询的文档)文档队列指针的简单容器。基于性能考虑,Hits的实例并不从索引中加载所有匹配查询的所有文档,而是每次一小部分。第3章描述了其中的细节。
1.7 其它类似的搜索产品
在你选择Lucene做为你的IR库之前,你可能想看看相同领域中的其它方案。我们对你可能相考虑的其它方案做了研究,这个小节对我们的发现做了总结。我们将这些产品分成两大类:
n 信息搜索(IR, Information Retrieval)库
n 索引和搜索程序
第一组比较小;它由一些比Lucene小的全文索引和搜索库组成。你可以把这个组的产品嵌入到你的程序中,如前面的图1.5所示。
第二组,比较大的组由一些现成的索引的搜索软件组成。这个软件一般设计为针对某种特定的数据,如网页,不如第一组的软件灵活。然而,其中一些产品也提供了它们的底层API,所以有时你也可以把它们当做IR库。
分享到:
评论

相关推荐

    Lucene in Action 中文版

     《Lucene实战 第2版 》基于Apache的Lucene 3 0 从Lucene核心 Lucene应用 案例分析3个方面详细系统地介绍了Lucene 包括认识Lucene 建立索引 为应用程序添加搜索功能 高级搜索技术 扩展搜索 使用Tika提取文本 Lucene...

    Lucene实战

    《Lucene实战(第2版)》基于Apache的Lucene 3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本...

    Lucene in action(中文版)

    《Lucene实战(第2版)》基于Apache的Lucene 3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本...

    Lucene 3.6 学习笔记

    1.1 索引部分的核心类 2 1.2 分词部分的核心类 2 1.3 搜索部分的核心类 2 第二章 索引建立 3 2.1 创建Directory 3 2.2 创建Writer 3 2.3 创建文档并且添加索引 4 2.4 查询索引的基本信息 5 2.5 删除和更新索引 5 (1)...

    Lucene实战中文版第2版.pdf

    lcene实战(第2版)》基于apache的lucene3.0,从lucene核心、lucene应用、案例分析3个方面详细系统地介绍了lucene,包括认识lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用tika提取文本、...

    LuceneInAction(第2版)_cn.pdf

     《Lucene实战(第2版)》基于Apache的Lucene 3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取...

    Lucene实战中文版第2版

    《Lucene实战(第2版)》基于apache的Lucene3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用tika提取...

    Lucene_in_Action(中文版).pdf

    第一部分 Lucene 核心 1. 接触 Lucene 2. 索引 3. 为程序添加搜索 4. 分析 5. 高极搜索技术 6. 扩展搜索 第二部分 Lucene 应用 7. 分析常用文档格式 8. 工具和扩充 9. Lucene 其它版本 10. 案例学习

    全文检索 lucene

    引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。apache软件基金...

    lucene实战

    Michael McCandless的《Lucene实战(第2版)》基于Apache的Lucene 3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展...

    Lucene文件检索实战项目

    引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。apache软件基金...

    Lucene_in_Action(中文版)

    基于Apache的Lucene 3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本、Lucene的高级扩展、...

    基于lucene的搜索引擎总结

    Lucene索引过程的核心类 IndexWriter :提供对索引的写入操作 Directory:描述了索引存放的位置 Analyzer:对文本进行分析,提取词汇(token),剔除无用的信息 Document:虚拟的文档 Field:每个Document包含一个或...

    lucene-pdf:一个能够轻松对 PDF 文本和元数据进行 Lucene 索引的库

    lucene-pdf lucene-pdf 是一个 JVM(Java、Scala、Groovy、Clojure 等)库,通过与集成,可以轻松地对 PDF 文本和元数据进行 Lucene 索引。“安装” lucene-pdf 在 Maven 中心可用; 将它添加到您的 Maven 项目的pom...

    lucene搜索引擎配置详解

    lucene搜索引擎配置,从载入文件,建立索引,搜索三步让你知道lucene搜索的核心技术

    lucene 3.0.1 jar包

    lucene-core-3.0.1.jar(核心包) contrib\analyzers\common\lucene-analyzers-3.0.1.jar(分词器) contrib\highlighter\lucene-highlighter-3.0.1.jar(高亮) contrib\memory\lucene-memory-3.0.1.jar(高亮)

    浅谈MySQL和Lucene索引的对比分析

    MySQL和Lucene都可以对数据构建索引并通过索引查询数据,一个是关系型数据库,一个是构建搜索引擎(Solr、ElasticSearch)的核心类库。两者的索引(index)有什么区别呢?以前写过一篇《Solr与MySQL查询性能对比》,...

    最新Lucene教程

    索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。 5)org.apache.1ucene.queryParser查询分析器,实现查询关键词间的...

    C#+Lucene.Net开发完成的一个自定义WEB搜索引擎

    C#+Lucene.Net开发完成的一个自定义WEB搜索引擎,本项目实现了分词、模糊索引,加以Lucene.Net内部核心功能共同实现了搜索机制引擎

    一个例子学懂搜索引擎(lucene)

    lucene是一个很容易上手的搜索引擎框架,...本文尝试通过一个例子,使大家掌握lucene的使用核心方法,包括分词、索引、搜索不同的目录、搜索不同的域,希望大家通过这个实例,对lucene和搜索引擎能有比较全面的认识!

Global site tag (gtag.js) - Google Analytics