Lock obtain timed out: SimpleFSLock@E://javasource//LuceneTest//index//write.lock异常的原因:
1、 lucene在写入索引时, 用在索引目录下建write.lock文件来标识锁定. 而只有在执行close()方法后, 才会删除这个锁文件. 只要这个文件存在, 其他的写索引的程序都会报错:
caught a class org.apache.lucene.store.LockObtainFailedException
with message: Lock obtain timed out: SimpleFSLock@E://javasource//LuceneTest//index//write.lock
所以,需要注意, 一定要注意关闭indexWrite. 包括异常下,用finally关闭.否则会导致下一次写索引失败.
2、 如果lucene的索引目录下出现了很多文件, 肯定是有问题的. 几个方面.首先lucene在执行写操作时, 会先在目录下写如一个write.lock的文件锁定这个目录,以避免别的索引再操作这个路径. 否则那样肯定会乱. 锁定之后, 开始写索引, 写索引时lucene建了几个或者几十个临时片段文件, 都似乎又短又乱的字符.cfs的文件. 当索引建立完毕后,没有执行 indexWriter.optimize();方法, 他就不会合并那些乱七八糟的文件. 所以,索引建完后, 一定要执行 上面的优化方法, 保持目录下保留3个文件即可. 也就是很多临时文件会合并到一个文件中去. 切不可大意删除. 但当数据很多时, 另行考虑策略.
3、 批量增加索引, 如果要成批的用循环加入索引,该怎么办呢. 首先请注意: IndexWriter indexWriter = new IndexWriter(indexDir,
new ThesaurusAnalyzer(), false); 最后一个参数为false表示持续想索引增加数据. 如果为true, 则每次会删除全部, 重新开始.
4、在批量增加索引时, 程序可以一直执行
indexWriter.addDocument(doc); 但不能一直执行优化:indexWriter.optimize(); 因为优化方法比较耗时, 特别是当索引很大时, 更要注意. 因为优化, 也仅仅似乎优化会消耗很多时间和cpu. 所以这个时候.多几个文件也没关系.