我从阅读可用文档中得知IndexSearcher实例应该跨搜索共享,以获得最佳性能,并且必须创建新实例才能加载对该指数。这意味着在创建指向相同目录的IndexSearcher实例之后,该索引是可写的(使用IndexWriter)。但是,这并不是我在执行Lucene.Net时看到的行为。我正在使用FSDirectory。 RAMDirectory不是一个可行的选择。 IndexSearcher会锁定其中一个索引文件(在我的实现中它是_1.cfs文件),使索引在IndexSearcher实例的生命周期内不可更新。Lucene IndexSearcher锁定索引在重建时导致IOException
这是一个已知的行为?我无法使用重建之前创建的IndexSearcher实例从头开始重建索引?是否只能修改索引,但不能重建它?
这里是我创建IndexSearcher的实例:
// Create FSDirectory
var directory = FSDirectory.GetDirectory(storagePath, false);
// Create IndexReader
var reader = IndexReader.Open(directory);
// I get the same behaviour regardless of whether I close the directory or not.
directory.Close();
// Create IndexSearcher
var searcher = new IndexSearcher(reader);
// Closing the reader will cause "object reference not set..." when searching.
//reader.Close();
这里是我创建的IndexWriter:
var directory = FSDirectory.GetDirectory(storagePath, true);
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true);
我使用Lucene.Net版本2.0。
编辑:
升级到2.1 Lucene.Net(THX KenE)和略微修改创建我的IndexWriter固定问题的方式:
var directory = FSDirectory.GetDirectory(storagePath, false);
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true);
感谢一群人的回答。我会尝试一下,看看这个版本是否做到了承诺。 – Marcus 2009-04-17 06:32:26