是Lucene搜索API的新手。 我在更新Lucene索引时不断遇到异常...为什么我会收到此错误,我该如何避免呢?
System.IO.IOException: Lock obtain timed out: SimpleFSLock@C:\Indexes\write.lock
at Lucene.Net.Store.Lock.Obtain(Int64 lockWaitTimeout)
at Lucene.Net.Index.IndexWriter.Init(Directory d, Analyzer a, Boolean create, Boolean closeDir)
at Lucene.Net.Index.IndexWriter.Init(String path, Analyzer a, Boolean create)
at Lucene.Net.Index.IndexWriter..ctor(String path, Analyzer a, Boolean create)
感谢阅读。
答案 0 :(得分:11)
在写入模式下打开索引时,Lucene会创建锁定文件。当您完全关闭索引时,将删除此锁定文件。在编写索引时,如果程序在不关闭lucene IndexWriter的情况下退出,则下次尝试写入时会出现此异常。如果从索引目录中删除锁定文件,则不会看到此异常。
您可以选择使用FSDirectory.setDisableLocks(false)禁用锁定,但这是不可取的,因为会以静默方式忽略错误。
答案 1 :(得分:1)
我认为如果索引写入时间超过超时值并且在锁定到期之后和索引写入结束之前出现另一个索引写入,我也会遇到此错误 - 至少看起来就是这样。“ / p>
当我开始接近单个Windows目录中最大文件数的50%左右时,我开始遇到同样的问题。这种速度慢下来写下来导致问题。 (WIN2K3)
我相信您可以重新编译Lucene以更改超时值。
答案 2 :(得分:0)
尝试以下方法:
try
{
writer = new IndexWriter(directory, new StandardAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
}
catch (LockObtainFailedException ex)
{
DirectoryInfo indexDirInfo = new DirectoryInfo(directory);
FSDirectory indexFSDir = FSDirectory.Open(indexDirInfo, new Lucene.Net.Store.SimpleFSLockFactory(indexDirInfo));
IndexWriter.Unlock(indexFSDir);
writer = new IndexWriter(directory, new StandardAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
}