首先我看看一个典型的索引目录下都有哪些文件:
每次IndexWriter commit即写入索引,Lucene都会在指定的索引目录下创建文件名自动递增的三个文件_{no}.cfe, _{no}.cfs, {no}.si,并修改分段信息文件segements以及文件的序列号。write.lock文件顾名思义是为索引提供锁的。这个分段写入的机制保证了我们可以在写索引文件的同时对旧的索引文件进行读取。
lucene对多线程的支持
lucene能够很好地支持多线程/进程 访问。
1.并发读
一个索引可以被多个进程的IndexReader打开。一个进程中,推荐IndexReader被单例多线程使用。
IndexReader类不仅是线程安全的,还是线程友好的,即友好地支持并发访问,代码中同步代码(synchronized)块并不多。
2.单独写
对于一个索引来说,一次只能打开一个IndexWriter。
2.1 索引锁机制
Lucene采用了基于文件的锁。如果锁文件write.lock存在于目录内,那么创建新的IndexWriter就会失败,抛出LockObtainFailedException异常。
lucene允许我们修改锁的实现,通过调用Directory,setLockFactory()传入自定义的子类。
3.边读边写
IndexReader可以在IndexWriter正在修改索引时被打开。每个IndexReader对象将向索引展示自己被打开的时间点。该对象只有在Writer提交修改后才感知到索引变化。
打开IndexReader’时采用参数create=true,reader就会持续检查索引的情况。