4

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

1 回答 1

3

最新版本的 Lucene.Net (2.1) 似乎支持使用 create=true 打开 IndexWriter,即使有打开的阅读器:

http://incubator.apache.org/lucene.net/docs/2.1/Lucene.Net.Index.IndexWriter.html

早期版本不清楚它们是否支持这一点。我会尝试使用 2.1。

于 2009-04-16T13:38:37.097 回答