转载请务必注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/1990616
时间过的真快,又有半个月没更新lucene的文章了,散仙最近在工作上,稍微忙了一点,还学了一些其他的知识,不过这都不是借口,还是有点小懒啊,呵呵,今天晚上,就再写一篇吧,说实话,几天不写博客,心里挺憋的慌的,不知道你们是否有这种情况?学点技术,最好能整理一下到博客里,比较好,因为,我们的大脑就像一块内存,是有LRU功能的,定时持久化一下,还是很不错滴,希望在写博客的朋友们,也能够继续坚持下去,没有写过的,也可以尝试一下嘛!
好了,散仙每当写一篇博客时,总喜欢在开头部分唠叨几句心里话,大家别介意啦,下面开始进入正题,散仙在上篇文章中,介绍了lucene的存储根基Directory的一些原理,以及也给出了Directory家族的继承分布图,那么本篇呢,散仙将重点介绍下Directory的一个很重要的子类FSDirectory,为什么说此类非常重要呢?如果你是正在使用lucene的开发者,那么你就知道,我们经常使用的一行代码:
Directory directory=FSDirectory.open(new File(indexPath))
通过这行代码,我们可以获取一个Directory的子类文件存储目录,然后我们对索引的一些操作,都是以这个子类的文件目录为基础的,
下面我们从源码的角度来详细剖析下FSDirectory这个类的作用,在此之前,散仙先用一个表格来介绍下lucene存储索引的几种方式:
序号 | 方式 |
1 | 将索引存储在内存中 |
2 | 将索引通过JDBC存储在数据库中 |
3 | 将索引存储在一般的文件系统上,如Windows,Linux,Solaris |
4 | 将索引存储在分布式文件系统上,如HDFS |
上面的几种存储方式是lucene目前为止,能够支持良好的的格式,那么今天,散仙要介绍的FSDirectory这类方式,就是上图表格中,第三类基于文件系统存储方式的根基,FSDirectory并不是一个具体的文件目录,通常情况下,我们使用的是FSDirectory下某一个具体的子类(MMapDirectory,SimpleFSDirectory,NIOFSDirectory)来作为我们的索引目录,那么我们可能有个很大的疑惑,我们在实际开发中大部分时候并没有直接指定具体使用的是那个目录,为什么我们还能正常使用它呢?
别着急,下面散仙,会给大家详细解说的,我们先来看下我们经常使用的那个FSDirectory的open()方法源码是怎么实现的:
/** Just like {@link #open(File)}, but allows you to
* also specify a custom {@link LockFactory}. */
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);
}
}
这段代码,还是比较通俗易懂的,相信各位朋友,已经看出来它是怎么实现的,那么散仙就来分析一下这段代码的含义,事实上我们通过open方法,lucene底层通常情况下,会给我们选择一个最适合我们当前操作系统用的索引目录,当然这种选择通常跟我们的JRE的位数是直接相关的,大多数的Solaris,Linux和windows64位系统的jre会返回MMapDirectory,而其他的一些位数的JRE,如32位的JRE在Windows上会返回SimpleFSDirectory,剩余的部分则会直接使用NIOFSDirectory来存储索引。那么这三种方式有什么不同呢?散仙总结如下:
1,SimpleFSDirectory,这个类简单的实现使用RandomAccessFile来完成索引的存储,读写速度一般,并发性很差,在多个线程同时访问索引时,会造成线程同步,从而大大降低了性能,当然,如果我们并发性不是很大的话,使用它也是一个不错的选择
2,MMapDirectory使用内存映射IO的方式来操作索引,在性能上是非常优秀的,读写速度非常快,并发性支持一般,当然这种情况仅仅局限于,你的索引的大小小于系统内存的时候,这才是一个好的选择,否则,使用不当,将常常会造成内存溢出的异常。
3,NIOFSDirectory使用的是JAVA NIO的 FileChannel的来操作索引的,读写速度快,对并发支持非常优秀,因为它利用NIO的特性,避免了同步的读取,所以在高并发的场景下,这个目录往往是最佳的选择。
下面,我们来分析下FSDirectory的另外一个重要的方法sysc()。
protected final Set<String> staleFiles = synchronizedSet(new HashSet<String>()); // Files written, but not yet sync'ed
@Override
public void sync(Collection<String> names) throws IOException {
ensureOpen();
Set<String> toSync = new HashSet<String>(names);//需要持久化的一些元数据标识
toSync.retainAll(staleFiles);//此方法会与staleFiles里面的数据求交集
for (String name : toSync)
fsync(name);//把内存中或缓冲区的数据,强制写到磁盘上,确保数据不会流失
staleFiles.removeAll(toSync);//在staleFiles中移除已经持久化到磁盘的数据,等待下一次的数据添加
}
protected void fsync(String name) throws IOException {
File fullFile = new File(directory, name);
boolean success = false;
int retryCount = 0;
IOException exc = null;
while (!success && retryCount < 5) {
retryCount++;
RandomAccessFile file = null;
try {
try {
file = new RandomAccessFile(fullFile, "rw");
file.getFD().sync();//写入磁盘上
success = true;
} finally {
if (file != null)
file.close();
}
} catch (IOException ioe) {
if (exc == null)
exc = ioe;
try {
// Pause 5 msec
Thread.sleep(5);
} catch (InterruptedException ie) {
throw new ThreadInterruptedException(ie);
}
}
}
if (!success)
// Throw original exception
throw exc;
}
其实,sysc这个方法,是从Directory这个顶级父类,继承过来的,由FSDirectory这个类,对其进行了重写,这个方法的目的,就是定期根据某些条件,来将我们内存或缓冲区的数据持久化到磁盘上,以确保我们已经索引的数据是非常安全的,不会因为一些意外情况,如系统崩溃,或突然宕机,停电的情况下,对索引结构造成破坏或一些影响。
一个简单的工作流程是这样的,当我们进行添加操作时,文件目录通常会打开一个或几个特定的文件格式来存储我们的数据,比如索引正文的存储,向量的存储,位置增量的存储,不同的索引格式负责存储不同的内容,当一些数据添加完毕后,通过某些条件触发持久化操作,比如超出了设置的缓冲区大小,或者超出了默认的Doc数,或者我们调用了commit方法,这时lucene会调用sysc方法,来把已经添加的数据,存储到磁盘上,以确保数据的安全存储,当然这些工作,lucene底层已经给我们实现好了,我们并不需要显示的调用这个方法来完成数据持久操作,就能绝大多数情况下,安全可靠的完成存储,而这一切正是sysc发挥的关键作用。
今天,散仙就分享到这里了,文章如有什么不当之处,欢迎指正交流,最后,感谢各位道友能坚持看完。
转载请务必注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/1990616
分享到:
相关推荐
在"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排序...
1.XunTa是在lucene4.3上创建的通过“知识点”来找人的搜人引擎。 输入一个关键词(或组合),XunTa返回一个排名列表,排在前面的人是与该关键词(组合)最相关的“达人”。 可访问 http://www.xunta.so立即体验...
在本课程中,我们主要探讨了Lucene 4.x版本的高级进阶应用,特别是针对大规模文档搜索引擎的构建。Lucene作为一个开源全文搜索引擎库,它提供了高效、灵活的索引和搜索功能,是构建高性能搜索系统的基石。在这个部分...
结合笔者的实际开发经验,总结了一些新的开发技巧和开发思路,并对网上流传的一些错误...本书既可为零起点的Lucene初学者提供系统全面的学习指导,也可帮助有相关经验的开发者解决在开发过程中遇到的一些难题和疑惑。
在高级进阶部分,我们将重点探讨Lucene在索引、搜索、排序、过滤以及分词器等方面的高级用法,旨在帮助开发者掌握Lucene的精髓,打造高效、精确的搜索体验。 1. **Document与索引更新**: 在Lucene中,`Document`...
【Lucene4.X实战类baidu搜索的大型文档海量搜索系统】课程主要涵盖了Lucene搜索引擎的各个方面,包括基础和高级进阶。以下是课程的主要知识点: 1. **Lucene入门与系统架构**:介绍Lucene的基本概念,以及其系统...
Lucene是Java开发的开源库,它提供了文本分析、索引和搜索功能,使得开发者能够轻松地在应用程序中实现复杂的搜索功能。这个项目的重点在于提升对Lucene高级特性和优化技巧的理解。 首先,我们要了解Lucene的核心...
通过学习《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排序...