2009-04-15 125 views
4

我从阅读可用文档中得知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); 

回答