- 浏览: 1064908 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (1441)
- 软件思想&演讲 (9)
- 行业常识 (250)
- 时时疑问 (5)
- java/guava/python/php/ruby/R/scala/groovy (213)
- struct/spring/springmvc (37)
- mybatis/hibernate/JPA (10)
- mysql/oracle/sqlserver/db2/mongdb/redis/neo4j/GreenPlum/Teradata/hsqldb/Derby/sakila (268)
- js/jquery/jqueryUi/jqueryEaseyUI/extjs/angulrJs/react/es6/grunt/zepto/raphael (81)
- ZMQ/RabbitMQ/ActiveMQ/JMS/kafka (17)
- lucene/solr/nuth/elasticsearch/MG4J (167)
- html/css/ionic/nodejs/bootstrap (19)
- Linux/shell/centos (56)
- cvs/svn/git/sourceTree/gradle/ant/maven/mantis/docker/Kubernetes (26)
- sonatype nexus (1)
- tomcat/jetty/netty/jboss (9)
- 工具 (17)
- ETL/SPASS/MATLAB/RapidMiner/weka/kettle/DataX/Kylin (11)
- hadoop/spark/Hbase/Hive/pig/Zookeeper/HAWQ/cloudera/Impala/Oozie (190)
- ios/swift/android (9)
- 机器学习&算法&大数据 (18)
- Mesos是Apache下的开源分布式资源管理框架 (1)
- echarts/d3/highCharts/tableau (1)
- 行业技能图谱 (1)
- 大数据可视化 (2)
- tornado/ansible/twisted (2)
- Nagios/Cacti/Zabbix (0)
- eclipse/intellijIDEA/webstorm (5)
- cvs/svn/git/sourceTree/gradle/jira/bitbucket (4)
- jsp/jsf/flex/ZKoss (0)
- 测试技术 (2)
- splunk/flunm (2)
- 高并发/大数据量 (1)
- freemarker/vector/thymeleaf (1)
- docker/Kubernetes (2)
- dubbo/ESB/dubboX/wso2 (2)
最新评论
简单分析了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有一个整体认识和把握,方便我们以后在开发过程中能够做到有选择的,心里有底的,清晰的使用。
好了,开篇又扯淡了几句,下面我们开始进入正题,在这之前,我们先来看下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有一个整体认识和把握,方便我们以后在开发过程中能够做到有选择的,心里有底的,清晰的使用。
发表评论
-
elasticsearch异常信息汇总
2017-11-06 09:34 15621.IndexMissingException 异常信息 ... -
Elasticsearch的架构
2018-03-22 10:30 528为什么要学习架构? Elasticsearch的一些架构 ... -
怎么在Ubuntu上打开端口
2017-10-21 20:45 0Netstat -tln 命令是用来查看linux的端口使用情 ... -
Elasticsearch工作原理
2018-03-22 10:30 465一、关于搜索引擎 各 ... -
Elasticsearch的路由(Routing)特性
2017-10-11 10:41 0Elasticsearch路由机制介 ... -
Elasticsearch中的segment理解
2017-10-11 09:58 1912在Elasticsearch中, 需要搞清楚几个名词,如se ... -
Elasticsearch的路由(Routing)特性
2017-09-28 16:52 629Elasticsearch路由机制介绍 Elastics ... -
Elasticsearch 的 Shard 和 Segment
2017-09-28 16:05 1207Shard(分片) 一个Shard就是一个Lu ... -
开源大数据查询分析引擎现状
2017-09-22 03:04 841大数据查询分析是云计算中核心问题之一,自从Google在20 ... -
大数据处理方面的 7 个开源搜索引擎
2017-09-22 03:01 502大数据是一个包括一切 ... -
开源大数据查询分析引擎现状
2017-09-23 11:26 555大数据查询分析是云计算中核心问题之一,自从Google在2 ... -
elasticsearch 把很多类型都放在一个索引下面 会不会导致查询慢
2017-09-25 09:45 991主要看数据量ES索引优 ... -
腾讯大数据Hermes爱马仕的系统
2017-09-23 11:15 1011腾讯大数据最近做了几件事,上线了一个官方网站http:// ... -
配置高性能Elasticsearch集群的9个小贴士
2017-09-25 10:02 597Loggly服务底层的很多 ... -
Elasticsearch与Solr
2017-09-25 16:24 566Elasticsearch简介* Elasti ... -
大数据杂谈微课堂|Elasticsearch 5.0新版本的特性与改进
2017-09-26 09:57 813Elastic将在今年秋季的 ... -
ElasticSearch性能优化策略
2017-09-26 09:51 464ElasticSearch性能优化主 ... -
ES索引优化
2017-09-19 20:39 0ES索引优化篇主要从两个方面解决问题,一是索引数据过程;二是 ... -
分词与索引的关系
2017-09-19 20:33 0分词与索引,是中文搜索里最重要的两个技术,而且两者间是密不可 ... -
Elasticsearch中的segment理解
2017-09-19 20:30 0在Elasticsearch中, 需要搞清楚几个名词,如se ...
相关推荐
FilterIndexReader是一个 IndexReader的子类,可以对一个IndexReader进行封装。我们可以实现一个自己的FilterIndexReader来过滤掉删除的文档,从而确保索引的实时性和一致性。 在实现FilterIndexReader时,我们需要...
`IndexReader.exe`可能是用于演示或测试如何使用`IndexReader`的可执行程序。`IndexReader`提供了读取文档、获取文档数量、检查索引是否已删除文档等功能。同时,它还支持多线程读取,确保了在并发环境下的安全性和...
通过`IndexReader.Open`方法打开索引目录,并保持`IndexReader`对象的复用,以减少打开和关闭的频率。当索引库有更新时,需要再次打开索引。为了有效地管理这些缓存的索引对象,可以使用`SearcherManager`类。在多个...
- `IndexReader.deleteDocument(int docID)`:通过文档编号删除文档,立即对当前`IndexReader`生效。 - `IndexReader.deleteDocuments(Term term)`:删除包含特定词的文档,同样立即生效。 - `IndexWriter....
示例代码: //src要创建索引的文件,destDir索引存放的目录 public static void createIndex(File src, File destDir){ Analyzer analyzer = new ... IndexReader也提供了deleteDocuments(Term term);
IndexReader reader = IndexReader.Open("index"); ``` 这里的`index`参数是索引文件所在的目录。`IndexReader`会加载索引文件的相关信息,为后续的搜索操作做准备。 接下来,我们需要实例化`IndexSearcher`,它是...
- **打开IndexReader**: 首先,需要打开一个IndexReader,这允许读取索引而不修改它。例如,`DirectoryReader.open(directory)`。 - **获取Term**: 基于要删除的文档ID,创建一个Term对象,如`new Term("id_field",...
- 使用`IndexReader.open(Directory d)`方法打开索引时,默认情况下是只读模式(`readOnly=true`)。这意味着不能通过此`IndexReader`实例来修改索引。 - 如果需要进行索引的更新操作,则需要使用`IndexWriter`类...
2. 创建IndexReader:使用Directory实例创建IndexReader,它是读取索引的主要接口。 3. 创建IndexSearcher:基于IndexReader创建一个IndexSearcher,它负责执行查询。 4. 构建Query:根据用户输入构建Query对象,...
5. 索引读写器(IndexReader/Writer):用于读取或修改现有索引,IndexWriter 负责创建和更新索引,而 IndexReader 用于检索索引信息。 二、入门示例 在提供的文件中,我们有三个关键的 Java 类: 1. Indexer.java...
资源名称:Lucene实战视频教程资源目录:【】01_lucenc简介和创建索引初步【】02_lucene简介和搜索...06_对日期和数字进行索引【】07_IndexReader的设计【IT 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
Lucene的架构主要包括以下几个部分:Analyzer(分析器)、Document(文档)、Field(字段)、IndexWriter(索引写入器)、IndexReader(索引读取器)、IndexSearcher(索引搜索器)和QueryParser(查询解析器)等。...
5. **IndexReader** 和 **Directory**:IndexReader用于读取索引,Directory则像文件系统一样管理索引的存储位置。常见的Directory实现有FSDirectory(文件系统)和RAMDirectory(内存中)。 6. **Searcher**:...
- **搜索执行**: IndexSearcher 使用 Query 对象和 IndexReader 执行搜索,找到匹配的 Document。 - **结果排序**: Lucene 支持多种评分机制,如 TF-IDF,用于确定文档的相关性,从而对搜索结果进行排序。 - **...
4. **IndexReader** 和 **Directory**:IndexReader用于读取已建立的索引,而Directory则管理索引的物理存储。常见的Directory实现有FSDirectory(文件系统目录)和RAMDirectory(内存中的目录)。 5. **Searcher**...
5. **IndexSearcher**: 负责执行搜索操作,它使用 IndexReader 访问索引,并通过 Query 对象来定义搜索条件。 6. **Query**: Lucene 提供了多种类型的 Query 类,如 TermQuery、BooleanQuery 和 PhraseQuery,它们...
Analyzer负责将输入的文本分解成可搜索的词项,Document则用来表示要索引的数据,IndexWriter创建和更新索引,而IndexReader用于读取索引并执行搜索。 1. **集成Lucene到Web应用** - 在Java web项目中,首先需要...
2. 创建搜索器:基于IndexReader创建一个IndexSearcher对象,它是实际执行搜索操作的工具。 3. 构建查询:使用QueryParser或者QueryBuilder创建查询对象,指定查询字段和查询字符串。 4. 执行搜索:调用...
Lucene主要包括以下几个关键组件:Analyzer(分析器)、Document(文档)、Field(字段)、IndexWriter(索引写入器)、IndexReader(索引读取器)、IndexSearcher(索引搜索器)和QueryParser(查询解析器)。...
其核心组件包括:Analyzer(分析器),Document(文档),Field(字段),IndexWriter(索引写入器),IndexReader(索引读取器),Directory(目录),Term(词项)和Query(查询)等。 2. **Analyzer(分析器)**...