私はLuceneを初めて使用しています。Lucene - AlreadyClosedException:このIndexReaderが閉じている
私はRequestIndexSearcher()を呼び出してindexSearcherオブジェクトを取得し、すべての検索を実行するために私のアプリケーションで使用するクラスLuceneUtilityを持っています。 返す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
}
スタックトレース:
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()
そう...ここに取り引きは何ですか...?私は間違って何をしていますか?
事前に感謝します。 :)
Lucene.netの新しい4.8バージョンには、この目的のための 'SearcherManager'があります – AndyPook