Lucene IndexSearcher блокирует индекс, вызывая IOException при перестройке - PullRequest
4 голосов
/ 15 апреля 2009

Из прочитанной документации я узнал, что экземпляр 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);

1 Ответ

3 голосов
/ 16 апреля 2009

Последняя версия Lucene.Net (2.1), по-видимому, поддерживает открытие IndexWriter с create = true, даже когда есть открытые читатели:

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

В более ранних версиях неясно, поддерживают ли они это или нет. Я бы попробовал использовать 2.1.

...