我从阅读可用文档中了解到,应该在搜索之间共享 IndexSearcher 实例,以获得最佳性能,并且必须创建一个新实例才能加载对索引所做的任何更改。这意味着在创建了指向同一目录的 IndexSearcher 实例之后,索引是可写的(使用 IndexWriter)。但是,这不是我在 Lucene.Net 实现中看到的行为。我正在使用 FSDirectory。RAMDirectory 不是一个可行的选择。IndexSearcher 锁定一个索引文件(在我的实现中它是 _1.cfs 文件),使索引在 IndexSearcher 实例的生命周期内不可更新。
这是一种已知的行为吗?在使用重建之前创建的 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 版。
编辑:
升级到 Lucene.Net 2.1 (thx KenE) 并稍微修改我创建 IndexWriter 的方式解决了这个问题:
var directory = FSDirectory.GetDirectory(storagePath, false);
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true);