`
leiwuluan
  • 浏览: 705035 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

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

阅读更多

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

索引核心类

1、IndexWriter(写索引)
2、Directory(索引存放位置)
3、Analyzer(分析器)
4、document(文档)
5、Field(域) 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 笔记一(是什么?,能做什么?,怎么做?)

 

Apache Lucene 3.x推荐教程

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Lucene索引分析工具

    2. **Lucene.Net.dll**:这是Lucene.net的核心库,包含了Lucene的所有主要类和方法,用于创建、维护和搜索索引。 3. **ICSharpCode.SharpZipLib.dll**:这是一个用于处理压缩和解压缩的库,可能在LukeNet中用于读取...

    lucene搜索过程代码详解

    《Lucene搜索过程深度解析》 Lucene,作为一款强大的全文搜索引擎库,其搜索机制是其核心功能之一。本文将详细剖析Lucene的搜索实现过程,通过代码解析,帮助读者深入理解其工作原理。 首先,搜索过程始于打开并...

    Lucene 实时搜索视频详解

    1. **索引过程**:Lucene 的核心概念之一是建立索引,将原始文本数据转化为可快速查询的结构。这个过程包括分析(Analyzer)文本、分词、创建倒排索引等步骤。倒排索引允许我们快速定位包含特定词汇的文档。 2. **...

    lucene搜索引擎配置详解

    本文将深入探讨Lucene搜索引擎的配置过程,包括文件加载、索引创建和搜索操作,帮助你理解其核心技术。 ### 文件加载 在Lucene中,首先需要将待搜索的数据加载到内存或磁盘上的某个结构中。这通常涉及到读取各种...

    lucene、lucene.NET详细使用与优化详解

    - 分布式索引和搜索:通过分布式部署,lucene可以处理大规模数据,提高系统的并发处理能力。 5. 应用场景 - 内容管理系统:为站内新闻、文章提供快速的全文搜索。 - 数据库辅助:对数据库中的文本字段进行索引,...

    lucene实现全文搜索

    它提供了一种机制,使得开发者能够轻松地为自己的应用程序添加索引和搜索功能。作为Apache软件基金会的项目,Lucene具有开源和免费的特性,受到Apache软件许可证的保护。它的创始人Doug Cutting也是著名搜索引擎...

    lucene索引

    《Lucene索引详解》 在信息技术领域,搜索引擎扮演着至关重要的角色,而Lucene作为开源的全文检索库,是构建高效、可扩展搜索功能的首选工具。本文将深入探讨Lucene索引的工作原理和核心概念,特别是针对中文词汇...

    Lucene开发详解.pdf

    它是Lucene的核心组件之一,对于中文的支持通常需要通过扩展此类来实现。 2. **org.apache.lucene.document**:该包定义了文档的结构,用于存储索引中的文档信息。 3. **org.apache.lucene.index**:该包提供了索引...

    Lucene 常用功能介绍视频详解

    它提供了一个简单但功能强大的API,用于在各种应用中实现全文索引和搜索。以下是对Lucene常用功能的详细介绍: 1. **创建索引** 创建索引是Lucene工作的第一步。通过`Directory`接口,如`FSDirectory`,Lucene可以...

    lucene做的桌面搜索

    《基于Lucene的Java桌面搜索实现详解》 在信息技术日新月异的今天,高效、便捷的文件搜索已经成为用户日常操作的重要部分。本文将详细解析一个由Java编程语言实现,利用Lucene API技术构建的桌面搜索程序。该程序...

    基于lucene3.6平台搜索工具相关包及使用说明

    1. 近实时搜索:通过NRTManager(Near Real Time Search Manager),可以在不关闭索引的情况下实现快速的更新和搜索。 2. 分词器插件:Lucene允许开发者编写自定义分词器,以适应各种语言和领域的需求。 3. 高亮...

    lucene 实现类似百度搜索

    **Lucene 搜索引擎实现详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会维护。它提供了一套强大的数据结构和算法,用于高效地存储和检索大量文本数据。通过 Lucene,开发者可以轻松地在自己的应用...

    基于lucene 的简单搜索引擎.rar

    在这里,我们将深入探讨Lucene的主要组件和构建过程。 ### 1. Lucene核心概念 **1.1 文档(Document)** 在Lucene中,每个文档是信息的基本单位,可以视为一个独立的信息源,比如一篇网页或电子邮件。文档由多个...

    详解SpringBoot+Lucene案例介绍

    * lucene-core:Lucene的核心包,提供了基本的索引和搜索功能。 * lucene-queryparser:提供了查询解析的功能,用于将用户输入的查询语句转换为Lucene的查询对象。 * lucene-analyzers-common:提供了基础的分词器,...

    Lucene分词与查询详解

    **Lucene分词与查询详解** Lucene是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发中。它提供了一套强大的API,用于索引文本数据,并执行复杂的查询操作。在深入理解Lucene的分词与查询机制之前,我们...

    lucene文档笔记详解

    它提供了强大的文本分析、索引构建和搜索功能,但值得注意的是,Lucene本身并不包含完整的全文检索引擎,而是作为核心组件供开发者集成到自己的应用系统中,以实现高效、精准的全文搜索。 ### Lucene的核心概念 1....

    lucene搜索引擎demo

    它提供了强大的索引和搜索功能,使得开发者能够轻松地在应用中集成高级的文本搜索功能。在这个“lucene搜索引擎demo”中,我们将会探讨如何利用Lucene实现一个简单的搜索引擎,包括数据抓取、分词处理以及源码分析。...

Global site tag (gtag.js) - Google Analytics