lucene 文件存储相关的几个类,以及他们的派生关系如下图:
- Directory 代表了 Lucene 的索引的存储的位置,这是一个抽象类。
- DbDirectory 存储到 Berkeley DB 4.3 的实现,Berkeley DB是历史悠久的嵌入式数据库系统,主要应用在UNIX/LINUX操作系统上,其设计思想是简单、小巧、可靠、高性能。
- JEDirectory 存储到 Berkeley DB Java Edition (JE) 的实现, Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。
- FileSwitchDirectory,多个目录存储索引,注意:这个API先不要用,因为API文档注明过有可能在将来的版本进行修改。
- 如果数据量不大,可以直接使用RAMDirectory,毕竟在内存中,数据的访问会更快。RAMDirectory还有一个地方比较常用,那就是单元测试,可以在初始化测试方法时创建索引,测试完成后删除索引,这样就不会留下不必要的垃圾文件。 RAMDirectory 转 FSDirectory 可以参看这篇文章:http://vincent-feng.javaeye.com/blog/205832
- FSDirectory,它表示一个存储在文件系统中的索引的位置;这也是一个抽象类。
- SimpleFSDirectory 这个类是对FSDirectory的一个简单实现,一般的系统都是使用这个Directory对象进行操作的。
- NIOFSDirectory 与FSDirectory一样,将文件存放在文件系统中,不同的地方是它利用的java.nio.*来读取文件,当多线程来读取同一文件时,不用像FSDirecotyr使用锁机制。
- MMapDirectory 与FSDirectory一样,将文件存放在文件系统中,不同的地方是它不是利用io来操作文件,而是利用内存映射。
lucene 的 CHANGES.txt 文件中有如下说明:
21. LUCENE-753: Added new Directory implementation org.apache.lucene.store.NIOFSDirectory, which uses java.nio's FileChannel to do file reads. On most non-Windows platforms, with many threads sharing a single searcher, this may yield sizable improvement to query throughput when compared to FSDirectory, which only allows a single thread to read from an open file at a time. (Jason Rutherglen via Mike McCandless)
注意:官方不推荐在 windows 开台下用 NIOFSDirectory ,因为 windows 下 java 的 NIO 有个 bug:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6265734
Lucene的并发性规则:
操作 | 是否允许 |
对同一个索引运行多个并行的搜索进程 | 允许 |
对一个正在生成、被优化或正在与另一索引合并的索引运行多个并行的搜索进程,或该索引正在进行删除、更新文档等操作时,对索引运行多个并行的搜索进程 | 允许 |
对同一个索引用多个IndexWriter对象执行添加、更新文档的操作 | 不允许 |
当一个从索引中删除文档的IndexReader对象没有成功关闭时,打开一个IndexWriter对象用于在这个索引中添加新的文档 | 不允许 |
IndexWriter对象向索引中添加新文档后,未成功关闭;在此之后,打开一个IndexReader对象用于从这个索引中删除文档 | 不允许 |
参考资料:
如何提高Lucene的搜索速度http://hi.baidu.com/expertsearch/blog/item/2195a237bfe83d360a55a9fd.html
lucene学习(4)
http://liliang1222.javaeye.com/blog/513734
lucene/solr FSDirectory NIOFSDirectory 性能测试对比与Http11NioProtocol
http://blog.chenlb.com/2009/05/lucene-solr-fsdirectory-niofsdirectory-performance-and-http11nioprotocol.html
Java Lucene (3):锁机制
http://dev.firnow.com/course/3_program/java/javajs/2008224/100826.html
Lucene--Directory解析
http://hi.baidu.com/dangjun625/blog/item/9cd9012ea9473e5a4fc226f6.html