我从阅读可用文档中了解到,应该跨搜索共享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);
答案 0 :(得分:3)
最新版本的Lucene.Net(2.1)似乎支持使用create = true打开IndexWriter,即使有开放阅读器也是如此:
http://incubator.apache.org/lucene.net/docs/2.1/Lucene.Net.Index.IndexWriter.html
早期版本尚不清楚它们是否支持此功能。我会尝试使用2.1。