Lucene IndexSearcher在重建时锁定导致IOException的索引

时间:2009-04-15 07:33:07

标签: lucene lucene.net

我从阅读可用文档中了解到,应该跨搜索共享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);

1 个答案:

答案 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。