4

ドキュメントの追加と検索に関する基本的な知識があるとしましょう。

IndexWriter と IndexReader のインスタンスを管理するためのベスト プラクティスは何ですか?

現在、私のアプリケーションは IndexWriter のシングルトン インスタンスを作成しています。検索を行う必要があるときはいつでも、次を使用して IndexWriter から IndexSearcher を作成するだけです

var searcher = new IndexSearcher(writer.GetReader())

これを行っているのは、新しい IndexReader を作成するとインデックスがメモリに読み込まれ、GC がメモリを再割り当てするのを待つためです。これにより、メモリ不足エラーが発生していました。

この現在の実装は理想的と考えられますか? この実装によりメモリの問題は解決されましたが、write.lock ファイルが常に存在するという問題があります (IndexWriter は常にインスタンス化されて開かれるため)。これは、アプリで発生したエラーのスタック トレースです。

ロック取得がタイムアウトしました: NativeFSLock@C:\inetpub\wwwroot\htdocs_beta\App_Data\products3\write.lock: System.IO.IOException: プロセスがファイル 'C:\inetpub\wwwroot\htdocs_beta\App_Data\products3\ にアクセスできませんwrite.lock' は、別のプロセスによって使用されているためです。System.IO.__Error.WinIOError (Int32 errorCode、文字列の多分フルパス) で System.IO.FileStream.Init (文字列パス、FileMode モード、FileAccess アクセス、Int32 権限、ブール値の useRights、FileShare 共有、Int32 bufferSize、FileOptions オプション、SECURITY_ATTRIBUTES secAttrs , String msgPath, Boolean bFromProxy, Boolean useLongPath) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access) at Lucene.Net.Store.NativeFSLock.Obtain()

検索用に IndexSearcher のシングルトン インスタンスを作成し、必要に応じてメモリ内に IndexWriter を作成するのが最善ではないかと考えています。そうすれば、インデックスの更新時に write.lock ファイルが作成/削除されます。これに関する唯一の問題は、IndexSearcher インスタンスが古くなることです。インデックスが更新されている場合は、IndexSearcher をリロードするタスクを実行する必要があります。

どう思いますか?

ライブ更新で大規模なインデックスをどのように処理しますか?

4

1 に答える 1

1

ロックの問題を回避するために、1 つのインデックス ライターのみを使用する必要があります。ご覧ください:Lucene.Netの書き込み/読み取りの同期

于 2011-04-20T14:29:13.427 に答える