- 浏览: 2188743 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
转载请务必注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/2016197
上篇,散仙介绍了Lucene检索的一系列流程,本篇来看下Lucene中一个特殊的Directory的实现之FileSwitchDirectory,顾名思义,从字面上的意思来理解是一个基于文件目录切换的一个实现,实际上也正是如此。
那么,此类的作用是什么呢? 我们都知道lucene的索引文件是非常松散灵活的,各个文件格式之间相互独立而又有联系,在Lucenen检索的时候,会并行的打开所有的段文件,然后合并结果集至一个公共队列里返回。
Lucene的Directory基类,提供了非常丰富的子类实现,为什么如此呢,其实跟不同的操作系统和平台有紧密的联系,所以在我们的代码里,经常会使用FSDirectory的静态方法来打开一个能在我们所使用的平台上发挥最大优势的Directory,在源码里我们可以发现这个方法里面是对主流的操作系统进行了判断和选择后,会给我们返回一个合适的Directory,可能这个方法在不同的操作平台上返回不一样的Directory的实现,这一点是很正常的。
FileSwitchDirectory的出现,可以使我们组合不同Directory的优点,来充分利用我们的系统资源,我们都知道使用内存索引RAMDirectory来访问索引其速度和效率都是非常优异的,然后,有时候我们的数据量大的惊人,以至于内存中根本放不下这个索引文件,那么这时候我们既想获取高效的索引访问性能,又想获取读取和检索大索引的优异的并发性能,这时候我们怎么做呢?
这时候就是该FileSwitchDirectory大显身手的时候了,利用这个类,我们可以轻而易举的结合任意2个Directory的优异点,来为我们所用,下面我们先来看下FileSwitchDirectory在源码里的构造实现。
由构造方法可以看出FileSwitchDirectory是需要2个Directory的实现才可以组装起来,而通过第一个参数我们可以指定主索引需要加载的索引文件,其它的将会由从Directory来实现,由此达到,快速切换不同的Directory来获取他们各自的优点。
一般情况下我们会将fdt和fdx文件放在NIODirectory里,因为这两个文件分别存储的是文档的正向信息包含具体的term,fdx文件是fdt文件的一个索引文件,实际上在后来,所有的文本数据都会保存在fdt里,索引在索引非常大的时候,这两个文件是最占容量的,所以我们选择将此放入NIO中,由此来访问大索引信息,其他的一些段信息文件,字典文件,放入内存索引中由此来获取更高的检索效率。
下面是散仙的一个示例的索引截图:
注意上图中可能大家会发现tim的项词典文件,也挺大的,散仙在这里解释一下,散仙在索引只索引了2个非常短的字段,然后循环添加了1万次,在实际项目中,肯定是多个字段组成且文本内容会比较多,那个时候索引出来的数据fdt文件一般都是最大的数据文件。
实现切换索引的代码如下:
运行效果如下所示:
由输出结果,我们可以看出除了fdt文件和fdx文件是从NIO里打开的,其他的都会被加载到RAM里,与我们预期的假设是一致的。
最后我们来简单分析下,Lucene是如何实现索引的动态的切换?
实际上在程序一开始启动时,是打开了2个Directory,然后通过FileSwitchDirectory 组装在了一起,在一个检索请求发来时,会选择具体的索引文件打开并读取,此时就是切换目录的时候,我们可以在FileSwitchDirectory 的源码里找到如下的一段代码:
其实,就是在启动的时候打开了同一份索引的2个不同的Directory的实现,然后通过FileSwitchDirectory 这个类,来动态的完成的索引切换的过程。
转载请务必注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/2016197
http://qindongliang1922.iteye.com/blog/2016197
上篇,散仙介绍了Lucene检索的一系列流程,本篇来看下Lucene中一个特殊的Directory的实现之FileSwitchDirectory,顾名思义,从字面上的意思来理解是一个基于文件目录切换的一个实现,实际上也正是如此。
那么,此类的作用是什么呢? 我们都知道lucene的索引文件是非常松散灵活的,各个文件格式之间相互独立而又有联系,在Lucenen检索的时候,会并行的打开所有的段文件,然后合并结果集至一个公共队列里返回。
Lucene的Directory基类,提供了非常丰富的子类实现,为什么如此呢,其实跟不同的操作系统和平台有紧密的联系,所以在我们的代码里,经常会使用FSDirectory的静态方法来打开一个能在我们所使用的平台上发挥最大优势的Directory,在源码里我们可以发现这个方法里面是对主流的操作系统进行了判断和选择后,会给我们返回一个合适的Directory,可能这个方法在不同的操作平台上返回不一样的Directory的实现,这一点是很正常的。
public static FSDirectory open(File path, LockFactory lockFactory) throws IOException { if ((Constants.WINDOWS || Constants.SUN_OS || Constants.LINUX) && Constants.JRE_IS_64BIT && MMapDirectory.UNMAP_SUPPORTED) { return new MMapDirectory(path, lockFactory); } else if (Constants.WINDOWS) { return new SimpleFSDirectory(path, lockFactory); } else { return new NIOFSDirectory(path, lockFactory); } }
FileSwitchDirectory的出现,可以使我们组合不同Directory的优点,来充分利用我们的系统资源,我们都知道使用内存索引RAMDirectory来访问索引其速度和效率都是非常优异的,然后,有时候我们的数据量大的惊人,以至于内存中根本放不下这个索引文件,那么这时候我们既想获取高效的索引访问性能,又想获取读取和检索大索引的优异的并发性能,这时候我们怎么做呢?
这时候就是该FileSwitchDirectory大显身手的时候了,利用这个类,我们可以轻而易举的结合任意2个Directory的优异点,来为我们所用,下面我们先来看下FileSwitchDirectory在源码里的构造实现。
/** * @param primaryExtensions 由主索引负责打开的文件 * @param primaryDir 主索引目录 * @param secondaryDir 从索引目录 * @param doClose 是否在关闭时关闭所有Directory的资源 * **/ public FileSwitchDirectory(Set<String> primaryExtensions, Directory primaryDir, Directory secondaryDir, boolean doClose) { this.primaryExtensions = primaryExtensions; this.primaryDir = primaryDir; this.secondaryDir = secondaryDir; this.doClose = doClose; this.lockFactory = primaryDir.getLockFactory(); }
由构造方法可以看出FileSwitchDirectory是需要2个Directory的实现才可以组装起来,而通过第一个参数我们可以指定主索引需要加载的索引文件,其它的将会由从Directory来实现,由此达到,快速切换不同的Directory来获取他们各自的优点。
一般情况下我们会将fdt和fdx文件放在NIODirectory里,因为这两个文件分别存储的是文档的正向信息包含具体的term,fdx文件是fdt文件的一个索引文件,实际上在后来,所有的文本数据都会保存在fdt里,索引在索引非常大的时候,这两个文件是最占容量的,所以我们选择将此放入NIO中,由此来访问大索引信息,其他的一些段信息文件,字典文件,放入内存索引中由此来获取更高的检索效率。
下面是散仙的一个示例的索引截图:
注意上图中可能大家会发现tim的项词典文件,也挺大的,散仙在这里解释一下,散仙在索引只索引了2个非常短的字段,然后循环添加了1万次,在实际项目中,肯定是多个字段组成且文本内容会比较多,那个时候索引出来的数据fdt文件一般都是最大的数据文件。
实现切换索引的代码如下:
String path="E:\\1111111111111111111\\1\\"; try{ //添加放置在nio文件里的索引文件 Set<String> files=new HashSet<>(); files.add("fdt"); files.add("fdx"); Directory d1=FSDirectory.open(new File(path));//装载磁盘索引 RAMDirectory map=new RAMDirectory(d1,IOContext.READ);//放置内存索引 NIOFSDirectory nio=new NIOFSDirectory(new File(path));//基于并发大文件的NIO索引 FileSwitchDirectory fsd=new FileSwitchDirectory(files,nio,map,true); //切换实现 for(String s:fsd.listAll()){ //System.out.println(s); System.out.println("文件:"+s+" 读取类型: "+fsd.getDirectory(s)); }
运行效果如下所示:
文件:_2.si 读取类型: org.apache.lucene.store.RAMDirectory@6a059fa4 lockFactory=org.apache.lucene.store.SingleInstanceLockFactory@1733fe5d 文件:_2_Lucene41_0.tim 读取类型: org.apache.lucene.store.RAMDirectory@6a059fa4 lockFactory=org.apache.lucene.store.SingleInstanceLockFactory@1733fe5d 文件:segments.gen 读取类型: org.apache.lucene.store.RAMDirectory@6a059fa4 lockFactory=org.apache.lucene.store.SingleInstanceLockFactory@1733fe5d 文件:_2.fdt 读取类型: org.apache.lucene.store.NIOFSDirectory@E:\1111111111111111111\1 lockFactory=org.apache.lucene.store.NativeFSLockFactory@37263a93 文件:segments_2 读取类型: org.apache.lucene.store.RAMDirectory@6a059fa4 lockFactory=org.apache.lucene.store.SingleInstanceLockFactory@1733fe5d 文件:_2_Lucene41_0.doc 读取类型: org.apache.lucene.store.RAMDirectory@6a059fa4 lockFactory=org.apache.lucene.store.SingleInstanceLockFactory@1733fe5d 文件:_2_Lucene41_0.tip 读取类型: org.apache.lucene.store.RAMDirectory@6a059fa4 lockFactory=org.apache.lucene.store.SingleInstanceLockFactory@1733fe5d 文件:_2.fdx 读取类型: org.apache.lucene.store.NIOFSDirectory@E:\1111111111111111111\1 lockFactory=org.apache.lucene.store.NativeFSLockFactory@37263a93 文件:_2.fnm 读取类型: org.apache.lucene.store.RAMDirectory@6a059fa4 lockFactory=org.apache.lucene.store.SingleInstanceLockFactory@1733fe5d
由输出结果,我们可以看出除了fdt文件和fdx文件是从NIO里打开的,其他的都会被加载到RAM里,与我们预期的假设是一致的。
最后我们来简单分析下,Lucene是如何实现索引的动态的切换?
实际上在程序一开始启动时,是打开了2个Directory,然后通过FileSwitchDirectory 组装在了一起,在一个检索请求发来时,会选择具体的索引文件打开并读取,此时就是切换目录的时候,我们可以在FileSwitchDirectory 的源码里找到如下的一段代码:
/** * 切换目录的核心代码 * @param name 具体的索引文件名 * @return 返回的具体Directory * ***/ public Directory getDirectory(String name) { String ext = getExtension(name); if (primaryExtensions.contains(ext)) {//在初始化的集合里判断 return primaryDir;//true,将会从主索引加载 } else { return secondaryDir;//false将会从从索引加载 } }
其实,就是在启动的时候打开了同一份索引的2个不同的Directory的实现,然后通过FileSwitchDirectory 这个类,来动态的完成的索引切换的过程。
转载请务必注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/2016197
发表评论
-
如何使用Spark大规模并行构建索引
2016-02-01 12:54 2725使用Spark构建索引非常简单,因为spark提供了更高级的 ... -
Lucene4.3进阶开发之纯阳无极(十九)
2014-12-09 16:37 2738原创不易,转载请务必注明,原创地址,谢谢配合! http:/ ... -
Lucene4.3进阶开发之神游北冥(十八)
2014-03-13 18:21 2420原创不易,转载请务必 ... -
Lucene4.3进阶开发之潇湘夜雨(十七)
2014-02-13 23:14 2813转载请务必注明,原创 ... -
Lucene4.3进阶开发之溪山行旅(十五)
2014-02-11 00:24 3631转载请务必注明,原创地址,谢谢配合! http://qind ... -
Lucene4.3进阶开发之日照光华(十四)
2014-01-24 09:25 3967转载请务必注明,原创 ... -
Lucene4.3进阶开发之礼敬如来(十三)
2014-01-23 00:40 3921转载请务必注明,原创地址,谢谢配合! http://qind ... -
Lucene4.3进阶开发之千象奔鸣(十二)
2014-01-18 23:30 3239转载请务必注明,原创地址,谢谢配合! http://qind ... -
Lucene4.3进阶开发之气定六合(十一)
2014-01-18 22:13 1631转载请务必注明,原创地址,谢谢配合! http://qind ... -
Lucene4.3进阶开发之见龙在田(十)
2014-01-18 00:11 1601转载请务必注明,原创 ... -
Lucene4.3进阶开发之亢龙有悔( 九)
2014-01-17 00:00 1551转载请务必注明,原创 ... -
Lucene4.3进阶开发之李代桃僵( 八)
2014-01-15 18:54 1607转载请务必注明,原创地址,谢谢配合! http://qind ... -
Lucene4.3进阶开发之潜龙勿用( 七)
2014-01-14 20:38 1688转载请务必注明,原创地址,谢谢配合! http://qind ... -
Lucene4.3进阶开发之柳暗花明( 六)
2014-01-05 15:33 3907转载请务必注明,原创地址,谢谢配合! http://qind ... -
Lucene4.3进阶开发之二渡天劫( 五)
2014-01-03 01:58 3271转载请务必注明,原创 ... -
Lucene4.3进阶开发之漫漫修行( 四)
2013-12-31 01:50 3027转载请务必注明,原创地址,谢谢配合! http://qind ... -
Lucene4.3进阶开发之入乡随俗(三)
2013-12-25 15:20 4609转载请务必注明,原创地址,谢谢配合! http://qind ... -
Lucene4.3进阶开发之乱世丛生(二)
2013-12-17 01:10 3783转载请务必注明,原创地址,谢谢配合! http://qind ... -
Lucene4.3进阶开发之初入仙界(一)
2013-11-25 15:40 5563转载请务必注明,原创地址,谢谢配合! http://qind ...
相关推荐
在"lucene4.3 按坐标距离排序"这个主题中,我们将探讨如何在Lucene 4.3版本中利用地理位置信息进行文档排序,特别是在处理地理空间搜索时的应用。 首先,Lucene 4.3引入了对地理空间搜索的支持,这允许我们根据地理...
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会...
lucene4.3增删改查的的一个工具类,对新手来说是一份不可多得的入门资料。
全文检索lucene 4.3 所用到的3个jar包,包含lucene-queryparser-4.3.0.jar、 lucene-core-4.3.0.jar、lucene-analyzers-common-4.3.0.jar。
《Lucene高级搜索进阶项目_04》 在深入探讨Lucene的高级搜索进阶项目时,我们首先需要理解Lucene的核心概念及其在信息检索中的应用。Lucene是一个高性能、全文本搜索库,它提供了丰富的搜索功能,包括布尔运算、...
lucene4.3源代码 censed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information ...
本课程由浅入深的介绍了Lucene4的发展历史,开发环境搭建,分析lucene4的中文分词原理,深入讲了lucenne4的系统架构,分析lucene4索引实现原理及性能优化,了解关于lucene4的搜索算法优化及利用java结合lucene4实现...
Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。在Java编程环境中,它为开发者提供了强大的文本检索功能,使得在海量数据中快速查找相关信息变得简单易行。本篇文章将详细探讨Lucene 4.3.1版本的...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...
在本课程中,我们主要探讨了Lucene 4.x版本的高级进阶应用,特别是针对大规模文档搜索引擎的构建。Lucene作为一个开源全文搜索引擎库,它提供了高效、灵活的索引和搜索功能,是构建高性能搜索系统的基石。在这个部分...
1.XunTa是在lucene4.3上创建的通过“知识点”来找人的搜人引擎。 输入一个关键词(或组合),XunTa返回一个排名列表,排在前面的人是与该关键词(组合)最相关的“达人”。 可访问 http://www.xunta.so立即体验...
结合笔者的实际开发经验,总结了一些新的开发技巧和开发思路,并对网上流传的一些错误...本书既可为零起点的Lucene初学者提供系统全面的学习指导,也可帮助有相关经验的开发者解决在开发过程中遇到的一些难题和疑惑。
在高级进阶部分,我们将重点探讨Lucene在索引、搜索、排序、过滤以及分词器等方面的高级用法,旨在帮助开发者掌握Lucene的精髓,打造高效、精确的搜索体验。 1. **Document与索引更新**: 在Lucene中,`Document`...
【Lucene4.X实战类baidu搜索的大型文档海量搜索系统】课程主要涵盖了Lucene搜索引擎的各个方面,包括基础和高级进阶。以下是课程的主要知识点: 1. **Lucene入门与系统架构**:介绍Lucene的基本概念,以及其系统...
Lucene是Java开发的开源库,它提供了文本分析、索引和搜索功能,使得开发者能够轻松地在应用程序中实现复杂的搜索功能。这个项目的重点在于提升对Lucene高级特性和优化技巧的理解。 首先,我们要了解Lucene的核心...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...