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://www.cnblogs.com/live41/archive/2009/12/31/1636900.html
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示