WebアプリケーションでのIndexSearcher / IndexWriterを使用したLucene.net
-
05-07-2019 - |
質問
現在、Lucene.netをWebアプリケーションで実行していますが、パフォーマンスの観点から最良の方法について疑問に思っています。
現在、すべてのインデックス書き込みがスケジュールされたプロセスで一緒に処理され、インデックスの最適化が行われるように設定しています。
ただし、検索の場合-現在、検索ごとにサーチャーを開いたり閉じたりしていますが、これは理想的ではないことがわかっています。
この状況で最良のアプローチは何だと思いますか?
更新/最適化が処理されたらインデックスサーチャーを閉じて再度開く必要があるため、スケジュールされたプロセス(Windowsコンソールアプリ)が終了したことをWebアプリケーションに通知する必要があります。
解決
Lucene.NETをBugTracker.NETに統合しました。私がやったことが最高かどうかはわかりませんが、うまくいっているようです。
アプリの起動時にインデックスを作成します。
サーチャーを作成し、検索ごとにインデックスがリロードされないように保持します。すべてのスレッドが同じサーチャーを共有します。検索者が検索すると、ロックを取得します。
一方、データが変更されたときにインデックスを更新するIndexWriterがあります。それはほんの少し変化しているだけなので、そのタスクは迅速に行われます。実行されると、同じロックを取得し、サーチャーを破壊し、インデックスを更新し、サーチャーを再作成します。新しいサーチャーは、インデックスの次の更新まで待機します。検索者は常に最新のインデックスを使用しています。
BugTracker.NETソースを取得し、my_lucene.csファイルとsearch_text.aspxファイルを確認できます。これらはすべてこれらの2つのファイルにあり、それほど多くのコードはありません。
他のヒント
リーダーのIsCurrent()メソッドを呼び出して、利用可能なインデックスの新しいバージョンが存在するかどうかを確認し、それが再度開いている場合は確認できます。最良の方法ではありませんでしたが、十分に簡単であり、要件がそれほど大きくなければ十分です。