나는 Lucene을 처음 사용하므로 나와 함께하시기 바랍니다.Lucene - AlreadyClosedException :이 IndexReader가 닫혀있다
내 응용 프로그램이 indexInstxSearcher()를 호출하여 indexSearcher 객체를 가져 와서 모든 검색을 수행하는 데 사용하는 클래스 LuceneUtility가 있습니다. return 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