Из прочитанной документации я узнал, что экземпляр IndexSearcher должен совместно использоваться поисками для обеспечения оптимальной производительности и что для загрузки любых изменений, внесенных в индекс, необходимо создать новый экземпляр. Это означает, что индекс доступен для записи (используя IndexWriter) после создания экземпляра IndexSearcher, который указывает на тот же каталог. Однако, это не то поведение, которое я вижу в моей реализации 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.
Edit:
Обновление до Lucene.Net 2.1 (спасибо KenE) и незначительное изменение способа создания IndexWriter устранили проблему:
var directory = FSDirectory.GetDirectory(storagePath, false);
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true);