Я новичок в Lucene, поэтому, пожалуйста, медведь со мной.Lucene - AlreadyClosedException: этот IndexReader закрыт
У меня есть класс LuceneUtility, который мое приложение использует для вызова RequestIndexSearcher() для приобретения объекта indexSearcher и для выполнения всего поиска. Каждый раз, когда возвращаю объект indexSearcher, я обновляю индекс (если что-то нужно обновить) и воссоздал объект IndexSearcher, чтобы отразить новое обновление (если есть новое обновление), но иногда я получаю AlreadyClosedException: этот IndexReader закрыт.
public class LuceneUtility
{
private static IndexSearcher _searcher;
private static Directory _directory;
private static Lazy<IndexWriter> _writer = new Lazy<IndexWriter>(() => new IndexWriter(_directory, new KeywordLowerCaseAnalyser(), IndexWriter.MaxFieldLength.UNLIMITED));
private static Object lock_Lucene = new object();
//this private constructor makes it a singleton now.
private LuceneUtility() { }
//Static constructor, opening the directory once for all.
static LuceneUtility()
{
string s ="Path of lucene Index";
_directory = FSDirectory.Open(s);
}
public static IndexSearcher IndexSearcher
{
get
{
if (_searcher == null)
{
InitializeSearcher();
}
else if (!_searcher.IndexReader.IsCurrent())
{
_searcher.Dispose();
InitializeSearcher();
}
return _searcher;
}
}
public static IndexWriter IndexWriter
{
get
{
return _writer.Value;
}
}
private static void InitializeSearcher()
{
_searcher = new IndexSearcher(_directory, false);
}
public static IndexSearcher RequestIndexSearcher()
{
lock (lock_Lucene)
{
PerformIndexUpdation();
}
return IndexSearcher;
}
/// <summary>
/// Performs Lucene Index Updation
/// </summary>
private static void PerformIndexUpdation()
{
// Performs Index Updation
}
StackTrace:
AlreadyClosedException: this IndexReader is closed
Lucene.Net.Index.IndexReader.EnsureOpen()
at Lucene.Net.Index.DirectoryReader.IsCurrent()
at LuceneOperation.LuceneUtility.get_IndexSearcher()
at LuceneOperation.LuceneUtility.RequestIndexSearcher()
Итак ... Что же здесь дело? ... Что я делаю не так ?
Большое спасибо заранее! :)
В новой версии Lucent.net версии 4.8 есть «SearcherManager» для этой цели – AndyPook