扩展Lucene的索引文件存储.doc
文本预览下载声明
扩展Lucene的索引文件存储
本文主要叙述如何通过引入Commons-VFS项目来扩展Lucene的索引文件存储方式。在阅读本文之前,您必须对Lucene有一定的了解,最好是有编写过Lucene代码。另外文章中所提到的Lucene如果不做特殊说明指的是Lucene的Java版本。
使用过Lucene来做为搜索引擎的朋友知道,Lucene默认的使用文件系统来存储索引文件。一般我们需要指定一个路径做为参数来初始化索引的读写类。例如下面语句准备在D盘的lucene_idx目录下写索引信息。
IndexWriter idx_writer = new IndexWriter(“D:/lucene_idx”,new StandardAnalyzer(),false);
因此整个系统的索引一般就会集中在某台服务器的某个目录。为了保证写索引不会产生冲突,经常我们只运行一个负责写索引的进程,其他的应用可以访问索引目录进行查询。当应用程序是集群环境下的不同机器时,其他的机器如何访问到索引服务器上的索引数据目录呢?你肯定已经想到很多种方法来访问其他机器的目录:例如Windows机器可以通过网上邻居;Linux服务器之间可以通过NFS访问;或者Linux和Windows服务器之间可以通过SAMBA来相互访问各自的文件系统。还有没有其他更加灵活的解决方案吗?
当然有,通过扩展Lucene的索引存储接口,你可以通过FTP、HTTP来读写索引文件,你甚至可以将Lucene的索引数据保存在数据库中,虽然我不知道这到底是不是一个好主意,但起码技术上是可行的。
为了使我们对Lucene的扩展有着实际的意义,我们将引入另外一个Apache组织新的开源项目—— Commons-VFS,我们简称为VFS。VFS项目把对各种各样的文件系统的访问封装成统一的应用程序接口,这大大的简化了应用程序本身代码的复杂度。目前VFS支持下面一些文件系统,而这个列表会越来越多,当然你也可以自行进行扩展。
FTP
Local Files
HTTP and HTTPS
SFTP
Temporary Files
Zip, Jar and Tar (uncompressed, tgz or tbz2)
gzip and bzip2
res
ram
或许你已经猜出来了引入VFS项目的目的:我们要利用VFS 项目和Lucene结合,使Lucene的索引文件可以存放在VFS所支持的各种可读写的文件系统中。
因此接下来我们的任务就是让Lucene使用VFS来存取索引数据,至于这些数据放在哪里,是放在数据库、文件系统还是其他地方,这个问题就交给VFS的配置去处理了。
你准备好了嘛?下面我们要深入到Lucene的代码中去探个究竟了。首先我们注意到了IndexReader、IndexWriter、IndexSearcher等这几个索引数据的读写类的构造函数都可以接受名为org.apache.lucene.store.Directory 的类做为参数。再查看api文档发现Directory有两个子类分别是:FSDirectory和RAMDirectory,从类名上可以猜出FSDirectory是基于文件系统的,而RAMDirectory是基于内存的。再读一下IndexWriter类的源码后证实了这个猜想,当我们传递路径字符串而不是Directory对象给IndexXxxxx类时,Lucene会初始化一个FSDirectory对象来处理索引数据的读写操作。
而另外一个RAMDirectory类是基于内存的索引数据存取,它是Lucene所提供的第二种索引数据存取方式。它可以接受一个FSDirectory做为构造函数的参数,相当于把存放在磁盘中的索引数据全部加载到内存中,以提高索引搜索的性能,我们暂不理会这种方式。但我们已经了解到org.apache.lucene.store包中的类便是Lucene存储的核心,我们可以通过扩展Directory类来实现存储自定义。姑且把所要扩展的这个类命名为VFSDirectory。
先来看看Directory都有什么方法:
Method Summary
abstract ?void
HYPERLINK file:///C:\\PROJECTS\\OpenSource\\lucene-2.0.0\\docs\\api\\org\\apache\\lucene\\store\\Directory.html \l close%28%29 close() ?关闭存储.
abstract ? HYPERLINK file:///C:\\PROJECTS\\OpenSource\\lucene-2.0.0\\docs\\api\\org\\apache\\lucene\\store\\I
显示全部