`
weitao1026
  • 浏览: 1064908 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IndexReader家族

阅读更多
简单分析了Directory家族的功能以及作用,同时也对Directory家族中我们比较常用的几个子类,做了剖析和归纳,那么本篇文章,就来介绍下与Directory家族经常进行交互的另一大家族IndexReader家族,另外需要说明的是,散仙现在介绍的一些内容都是基于最新版Lucene4.6.0的版本,不过标题名还是Lucene4.3的,为了统一命名,散仙在这里就不改了,因为Lucene最近的更新发布,实在是太活跃了,还是哪一句话,越活跃的东西,前途越光明,就像最近一年来Hadoop的兴起和迅猛发展,lucene也是如此。


好了,开篇又扯淡了几句,下面我们开始进入正题,在这之前,我们先来看下IndexReader家族的家谱图。



下面我们来回忆下,我们在使用lucene的过程中,经常使用到的一行代码:




Java代码 复制代码 收藏代码
1.directory=FSDirectory.open(new File(indexReadPath));//打开索引目录 
2.    IndexReader  reader=DirectoryReader.open(directory);//获取数据句柄 



看过如上代码,我们是不是有种很熟悉的味道,然后我们在对比IndexReader家族图,就大概明白这段代码的意思了。


IndexReader是一个抽象的接口实现,提供了一个接口用于访问索引文件,由此我们可以推断出,任何一个读取索引的操作,就必须用到一个IndexReader的实现类,来辅助完成,否则,我们是不能直接读取索引信息的。


继续看下去,我们会发现IndexReader接口下面有两大类型的Reader实现,一个是基于AtomicReader实现的原子类型,另一个是基于CompositeReader实现的复合类型,那么这两个直接子类,究竟有什么区别和联系呢?
实际上,它们之间的联系我们从上图中,就能清晰的看出来,它们都实现了相同的父接口,所以说从某种程度上来讲,它们之间是可以转换的,事实上也的确如此。在AtomicReader的子类里面提供了一个SlowCompositeReaderWrapper的包装类,来把一个CompositeReader的子类,模拟成一个原子Reader。



那么,CompositeReader和AtomicReader它们之间究竟有什么区别呢? AtomicReader相对来说更细化,提供了具体层面访问索引文件内容的实现,而CompositeReader则在宏观的方向上,提供了读取索引文件,以及汇合多个索引的功能。

可以打这么一个比方,CompositeReader是一个类似半径为10的圆,而AtomicReader则是一个类似半径为5的圆,而我们的索引存储的数据就在圆心上,当然我们的这个假设是基于立体3维的圆,那么现在,我想要获取圆心上的数据,无论你从哪个方向,哪个位置切入,都必须的先经过大圆的范围,然后经过小圆的范围,最终我们才能获取圆心上存储的数据。所以我们说CompositeReader在宏观上起到了读取索引文件(可能是多份索引的读取(可以是单线程读,也可以是并行读)及合并)的作用,而AtomicReader则在微观的角度上,起到了读取索引文件内容的作用,通过两者组合,我们就可以完美的读取索引文件。


在IndexReader的旗下,又旗帜鲜明的分成了两个基类,这两个基类的下面的各个子类之间,既有区别也有联系,只有相互协作,才能高效的完成读取实现,当然这些lucene都给我们已经封装好了,我们可以在我们任何需要的时候,来调用他们来完成特定的工作,除此之外,我们也可以来自定义我们自己用的特定的reader,来完成某些不常见的功能,因为lucene给我们提供了一个非常方便,强大,而且易扩展的接口,由此可以看出lucene的设计架构充分利用接口和一些抽象类的组合,来使整体设计变更灵活和易扩展。


今天散仙就先分享到这里了,本篇文章的目的很简单,就是让大家在宏观上对IndexReader有一个整体认识和把握,方便我们以后在开发过程中能够做到有选择的,心里有底的,清晰的使用。
分享到:
评论

相关推荐

    索引更新索引更新

    FilterIndexReader是一个 IndexReader的子类,可以对一个IndexReader进行封装。我们可以实现一个自己的FilterIndexReader来过滤掉删除的文档,从而确保索引的实时性和一致性。 在实现FilterIndexReader时,我们需要...

    Lucene索引数据分析器

    `IndexReader.exe`可能是用于演示或测试如何使用`IndexReader`的可执行程序。`IndexReader`提供了读取文档、获取文档数量、检查索引是否已删除文档等功能。同时,它还支持多线程读取,确保了在并发环境下的安全性和...

    使用C sharp开发搜索引擎 C#搜索引擎开发实战 29-搜索界面(共12页).ppt

    通过`IndexReader.Open`方法打开索引目录,并保持`IndexReader`对象的复用,以减少打开和关闭的频率。当索引库有更新时,需要再次打开索引。为了有效地管理这些缓存的索引对象,可以使用`SearcherManager`类。在多个...

    有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题[整理].pdf

    - `IndexReader.deleteDocument(int docID)`:通过文档编号删除文档,立即对当前`IndexReader`生效。 - `IndexReader.deleteDocuments(Term term)`:删除包含特定词的文档,同样立即生效。 - `IndexWriter....

    lucene2.9.1完整DEMO及开发文档

    示例代码: //src要创建索引的文件,destDir索引存放的目录 public static void createIndex(File src, File destDir){ Analyzer analyzer = new ... IndexReader也提供了deleteDocuments(Term term);

    lucene搜索过程代码详解

    IndexReader reader = IndexReader.Open("index"); ``` 这里的`index`参数是索引文件所在的目录。`IndexReader`会加载索引文件的相关信息,为后续的搜索操作做准备。 接下来,我们需要实例化`IndexSearcher`,它是...

    Lucene 索引、删除、检索 实例

    - **打开IndexReader**: 首先,需要打开一个IndexReader,这允许读取索引而不修改它。例如,`DirectoryReader.open(directory)`。 - **获取Term**: 基于要删除的文档ID,创建一个Term对象,如`new Term("id_field",...

    lucene基础总结

    - 使用`IndexReader.open(Directory d)`方法打开索引时,默认情况下是只读模式(`readOnly=true`)。这意味着不能通过此`IndexReader`实例来修改索引。 - 如果需要进行索引的更新操作,则需要使用`IndexWriter`类...

    lucene工程,分词、索引

    2. 创建IndexReader:使用Directory实例创建IndexReader,它是读取索引的主要接口。 3. 创建IndexSearcher:基于IndexReader创建一个IndexSearcher,它负责执行查询。 4. 构建Query:根据用户输入构建Query对象,...

    lucene3.0入门

    5. 索引读写器(IndexReader/Writer):用于读取或修改现有索引,IndexWriter 负责创建和更新索引,而 IndexReader 用于检索索引信息。 二、入门示例 在提供的文件中,我们有三个关键的 Java 类: 1. Indexer.java...

    Lucene实战视频教程

    资源名称:Lucene实战视频教程资源目录:【】01_lucenc简介和创建索引初步【】02_lucene简介和搜索...06_对日期和数字进行索引【】07_IndexReader的设计【IT 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    Lucene+原理与代码分析完整版

    Lucene的架构主要包括以下几个部分:Analyzer(分析器)、Document(文档)、Field(字段)、IndexWriter(索引写入器)、IndexReader(索引读取器)、IndexSearcher(索引搜索器)和QueryParser(查询解析器)等。...

    Lucene检索

    5. **IndexReader** 和 **Directory**:IndexReader用于读取索引,Directory则像文件系统一样管理索引的存储位置。常见的Directory实现有FSDirectory(文件系统)和RAMDirectory(内存中)。 6. **Searcher**:...

    Lucene4 全文检索

    - **搜索执行**: IndexSearcher 使用 Query 对象和 IndexReader 执行搜索,找到匹配的 Document。 - **结果排序**: Lucene 支持多种评分机制,如 TF-IDF,用于确定文档的相关性,从而对搜索结果进行排序。 - **...

    搜索引擎的搭建(Lucene)代码

    4. **IndexReader** 和 **Directory**:IndexReader用于读取已建立的索引,而Directory则管理索引的物理存储。常见的Directory实现有FSDirectory(文件系统目录)和RAMDirectory(内存中的目录)。 5. **Searcher**...

    Lucene 3.5&API,最新版

    5. **IndexSearcher**: 负责执行搜索操作,它使用 IndexReader 访问索引,并通过 Query 对象来定义搜索条件。 6. **Query**: Lucene 提供了多种类型的 Query 类,如 TermQuery、BooleanQuery 和 PhraseQuery,它们...

    基于java的全文搜索引擎Lucene

    Analyzer负责将输入的文本分解成可搜索的词项,Document则用来表示要索引的数据,IndexWriter创建和更新索引,而IndexReader用于读取索引并执行搜索。 1. **集成Lucene到Web应用** - 在Java web项目中,首先需要...

    lucene全文检索简单索引和搜索实例

    2. 创建搜索器:基于IndexReader创建一个IndexSearcher对象,它是实际执行搜索操作的工具。 3. 构建查询:使用QueryParser或者QueryBuilder创建查询对象,指定查询字段和查询字符串。 4. 执行搜索:调用...

    Lucene2实战源码

    Lucene主要包括以下几个关键组件:Analyzer(分析器)、Document(文档)、Field(字段)、IndexWriter(索引写入器)、IndexReader(索引读取器)、IndexSearcher(索引搜索器)和QueryParser(查询解析器)。...

    lucenejar包

    其核心组件包括:Analyzer(分析器),Document(文档),Field(字段),IndexWriter(索引写入器),IndexReader(索引读取器),Directory(目录),Term(词项)和Query(查询)等。 2. **Analyzer(分析器)**...

Global site tag (gtag.js) - Google Analytics