コンテキスト:
ヘルパーファサードクラスが自分のアプリケーションに検索メソッドを提供しています。 パフォーマンスは問題ではないため、クエリごとに新しいIndexSearcher
が作成されます。クエリごとに Lucene 2.9.2:IndexSearcherのインスタンス化時にAlreadyClosedExceptionが発生する
File indexFile = new File(String absolutePathToIndex);
IndexSearcher searcher = new IndexSearcher(indexFile.getAbsolutePath(), true);
は、時々私は、検索対象のない共有はありませんので、私は理解していない
AlreadyClosedException
を取得します。
アイデア?どのようにインデックスを開くためのベストプラクティス?既知の問題点? ありがとうございます。
スタックトレース:
org.apache.lucene.store.AlreadyClosedException: this Directory is closed
at org.apache.lucene.store.Directory.ensureOpen(Directory.java:251)
at org.apache.lucene.store.FSDirectory.listAll(FSDirectory.java:530)
at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:585)
at org.apache.lucene.index.DirectoryReader.open(DirectoryReader.java:69)
at org.apache.lucene.index.IndexReader.open(IndexReader.java:476)
at org.apache.lucene.index.IndexReader.open(IndexReader.java:243)
at org.apache.lucene.search.IndexSearcher.<init>(IndexSearcher.java:78)
提案された解決策#1:移動するための方法?
Directory directory = FSDirectory.open(File indexFile);
IndexSearcher searcher = new IndexSearcher(directory, true);
...do the query...
searcher.close();
質問:溶液#1から上記のコードは、クエリごとに作成されます。ディレクトリも閉じる必要がありますか? Lucene 2.9.2のソースコードを確認したところ、searcher.close()
はreader
オブジェクトに関連付けられたdirectory
を閉じません。
を修正しました...なぜ複数のスレッドが同じオブジェクトをクローズしようとする必要がありますか?各スレッドはIndexSearcherの独自のインスタンスを取得します。 – basZero