利用可能なドキュメントを読んで、最適なパフォーマンスを得るためにIndexSearcherインスタンスを共有し、新しいインスタンスを作成して変更をロードする必要があることを知りました。インデックス。これは、同じディレクトリを指し示すIndexSearcherのインスタンスを作成した後で、そのインデックスが(IndexWriterを使用して)書き込み可能であることを意味します。しかし、これはLucene.Netの実装で見られる動作ではありません。 FSDirectoryを使用しています。 RAMDirectoryは実行可能なオプションではありません。 IndexSearcherはIndexSearcherインスタンスの存続期間中にインデックスを更新不可能にするインデックスファイル(私の実装では_1.cfsファイル)をロックします。Lucene IndexSearcherは、再構築時にIOExceptionの原因となるインデックスをロックします
これは既知の動作ですか?再構築前に作成された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を使用しています。
編集:Lucene.Net 2.1(THX KenE)へ
アップグレードと少し私はIndexWriterが問題固定作成方法の変更:
var directory = FSDirectory.GetDirectory(storagePath, false);
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true);
お返事ありがとうございました。私はそれを試してみて、そのバージョンが約束されたものかどうかを見ます。 – Marcus