Lock文件
写锁(write lock)文件名为“write.lock”,它缺省存储在索引目录中。如果锁目录(lock directory)与索引目录不一致,写锁将被命名为“XXXX-write.lock”,其中“XXXX”是一个唯一的前缀(unique prefix),来源于(derived from)索引目录的全路径(full path)。当这个写锁出现时,一个writer当前正在修改索引(添加或者清除文档)。这个写锁确保在一个时刻只有一个writer修改索引。
需要注意的是在2.1版本之前(prior to),Lucene还使用一个commit lock,这个锁在2.1版本里被删除了。
Deletable文件
在Lucene 2.1版本之前,有一个“deletable”文件,包含了那些需要被删除文档的详细资料。在2.1版本后,一个writer会动态地(dynamically)计算哪些文件需要删除,因此,没有文件被写入文件系统。
Compound文件(.cfs)
从Lucene 1.4版本开始,compound文件格式成为缺省信息。这是一个简单的容器(container)来服务所有下一章节(next section)描述的文件(除了.del文件),格式如下:
版本
包含的项
数目
类型
描述
1.4之后版本
FileCount
1
VInt
DataOffset
FileCount
Long
FileName
FileCount
String
FileData
FileCount
raw
Raw文件数据是上面命名的所有单个的文件数据(the individual named above)。
结构如下图所示:
从Lucene 2.3 版本开始,文档存储文件(存储fields和term vectors数据)能够让多个segment共享一个单独的文件集,当compound文件启用时,这些共享的文件将被添加进一个单独的compound文件,格式同上,但是文件扩展名为.cfx。
每个Segment包含的文件
剩下的文件(remaining files)都是per-segment(每个片断文件),因此(thus)都用后缀来定义(defined by suffix)。
Field信息(.fnm)Field的名字都存储在Field信息文件中,后缀是.fnm。
fileds将使用它们在这个文件中的顺序来编号(fields are numbered by thir order in this file)。因此Field为0表示为该文件中的第一个field,1表示下一个field,一次类推。
需要注意的是,就像文档编号(document numbers)一样,field编号(field numbers)与片断是相关的(are segment relative)。lucene中的同步机制(lucene locking mechanism)及规则(Concurrency rules)
1、多个只读操作都可以并发,可以是多线程的或者是平行的搜索同一个索引。
正在装载数据……
2、当索引文件被改变的时候,只读操作同样支持并发。也就是说当你优化索引或者是往索引中添加或者是更新删除索引中的documents,只读操作仍然是允许的(可以继续search)。
3、同一时间只允许一个读写操作。索引在同一时间只能被一个IndexWriter或者IndexReader所打开。
对索引进行操作是不会终止查询和读取索引的,但在实际使用中会影响到查询的效率。如何有线程在不段的做增量索引的话可以将 IndexWriter的mergeFactor和maxBufferedDocs的值设置的大些,这样会降低io操作并且不会频繁的merge,另外可以自定义optimize的时间,保证search的效率
。
指定lock文件存放位置
lucene
中lock files
的默认是由java.io.tempdir的系统属性来制定的。通常linux下是在/tem/,window下是在
C:\Documents and Settings\\Local Settings\Temp下。
我们可以通过java -Dorg.apache.lucene.lockDir=来制定lock files的存放位置。
lucene目前有write.lock和commit.lock两种。
write.lock是在对索引文件进行修改的时候生成的,这个时候IndexWriter的操作或者IndexReader 删除Documents, 取消删除都会抛出异常。
commit.lock 是在segments文件被读取或者合并的时候生成的。当IndexReader 读取索引文件之前会获得commit.lock,当segments被读取完毕的时候会释放。IndexWriter在添加文档或者合并索引的时候同样会获得commit.lock
可以用IndexReader的 isLocked来判读索引文件是否被锁,或者unlock方法来解锁
static boolean
isLocked(String directory)
static void
unlock(Directory directory)