Lucene4.3进阶开发之高山流水(十六)
本篇来看下Lucene中一个特殊的Directory的实现之FileSwitchDirectory,顾名思义,从字面上的意思来理解是一个基于文件目录切换的一个实现,实际上也正是如此。
那么,此类的作用是什么呢? 我们都知道lucene的索引文件是非常松散灵活的,各个文件格式之间相互独立而又有联系,在Lucenen检索的时候,会并行的打开所有的段文件,然后合并结果集至一个公共队列里返回。
Lucene的Directory基类,提供了非常丰富的子类实现,为什么如此呢,其实跟不同的操作系统和平台有紧密的联系,所以在我们的代码里,经常会使用FSDirectory的静态方法来打开一个能在我们所使用的平台上发挥最大优势的Directory,在源码里我们可以发现这个方法里面是对主流的操作系统进行了判断和选择后,会给我们返回一个合适的Directory,可能这个方法在不同的操作平台上返回不一样的Directory的实现,这一点是很正常的。
FileSwitchDirectory的出现,可以使我们组合不同Directory的优点,来充分利用我们的系统资源,我们都知道使用内存索引RAMDirectory来访问索引其速度和效率都是非常优异的,然后,有时候我们的数据量大的惊人,以至于内存中根本放不下这个索引文件,那么这时候我们既想获取高效的索引访问性能,又想获取读取和检索大索引的优异的并发性能,这时候我们怎么做呢?
这时候就是该FileSwitchDirectory大显身手的时候了,利用这个类,我们可以轻而易举的结合任意2个Directory的优异点,来为我们所用
一般情况下我们会将fdt和fdx文件放在NIODirectory里,因为这两个文件分别存储的是文档的正向信息包含具体的term,fdx文件是fdt文件的一个索引文件,实际上在后来,所有的文本数据都会保存在fdt里,索引在索引非常大的时候,这两个文件是最占容量的,所以我们选择将此放入NIO中,由此来访问大索引信息,其他的一些段信息文件,字典文件,放入内存索引中由此来获取更高的检索效率。
最后我们来简单分析下,Lucene是如何实现索引的动态的切换?
实际上在程序一开始启动时,是打开了2个Directory,然后通过FileSwitchDirectory 组装在了一起,在一个检索请求发来时,会选择具体的索引文件打开并读取,此时就是切换目录的时候.
Please read full article from Lucene4.3进阶开发之高山流水(十六)
本篇来看下Lucene中一个特殊的Directory的实现之FileSwitchDirectory,顾名思义,从字面上的意思来理解是一个基于文件目录切换的一个实现,实际上也正是如此。
那么,此类的作用是什么呢? 我们都知道lucene的索引文件是非常松散灵活的,各个文件格式之间相互独立而又有联系,在Lucenen检索的时候,会并行的打开所有的段文件,然后合并结果集至一个公共队列里返回。
Lucene的Directory基类,提供了非常丰富的子类实现,为什么如此呢,其实跟不同的操作系统和平台有紧密的联系,所以在我们的代码里,经常会使用FSDirectory的静态方法来打开一个能在我们所使用的平台上发挥最大优势的Directory,在源码里我们可以发现这个方法里面是对主流的操作系统进行了判断和选择后,会给我们返回一个合适的Directory,可能这个方法在不同的操作平台上返回不一样的Directory的实现,这一点是很正常的。
FileSwitchDirectory的出现,可以使我们组合不同Directory的优点,来充分利用我们的系统资源,我们都知道使用内存索引RAMDirectory来访问索引其速度和效率都是非常优异的,然后,有时候我们的数据量大的惊人,以至于内存中根本放不下这个索引文件,那么这时候我们既想获取高效的索引访问性能,又想获取读取和检索大索引的优异的并发性能,这时候我们怎么做呢?
这时候就是该FileSwitchDirectory大显身手的时候了,利用这个类,我们可以轻而易举的结合任意2个Directory的优异点,来为我们所用
- * @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();
- }
一般情况下我们会将fdt和fdx文件放在NIODirectory里,因为这两个文件分别存储的是文档的正向信息包含具体的term,fdx文件是fdt文件的一个索引文件,实际上在后来,所有的文本数据都会保存在fdt里,索引在索引非常大的时候,这两个文件是最占容量的,所以我们选择将此放入NIO中,由此来访问大索引信息,其他的一些段信息文件,字典文件,放入内存索引中由此来获取更高的检索效率。
- //添加放置在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));
- }
最后我们来简单分析下,Lucene是如何实现索引的动态的切换?
实际上在程序一开始启动时,是打开了2个Directory,然后通过FileSwitchDirectory 组装在了一起,在一个检索请求发来时,会选择具体的索引文件打开并读取,此时就是切换目录的时候.
- public Directory getDirectory(String name) {
- String ext = getExtension(name);
- if (primaryExtensions.contains(ext)) {//在初始化的集合里判断
- return primaryDir;//true,将会从主索引加载
- } else {
- return secondaryDir;//false将会从从索引加载
- }
- }
Please read full article from Lucene4.3进阶开发之高山流水(十六)
No comments:
Post a Comment