質問

現在、Lucene.netをWebアプリケーションで実行していますが、パフォーマンスの観点から最良の方法について疑問に思っています。

現在、すべてのインデックス書き込みがスケジュールされたプロセスで一緒に処理され、インデックスの最適化が行われるように設定しています。

ただし、検索の場合-現在、検索ごとにサーチャーを開いたり閉じたりしていますが、これは理想的ではないことがわかっています。

この状況で最良のアプローチは何だと思いますか?

更新/最適化が処理されたらインデックスサーチャーを閉じて再度開く必要があるため、スケジュールされたプロセス(Windowsコンソールアプリ)が終了したことをWebアプリケーションに通知する必要があります。

役に立ちましたか?

解決

Lucene.NETをBugTracker.NETに統合しました。私がやったことが最高かどうかはわかりませんが、うまくいっているようです。

アプリの起動時にインデックスを作成します。

サーチャーを作成し、検索ごとにインデックスがリロードされないように保持します。すべてのスレッドが同じサーチャーを共有します。検索者が検索すると、ロックを取得します。

一方、データが変更されたときにインデックスを更新するIndexWriterがあります。それはほんの少し変化しているだけなので、そのタスクは迅速に行われます。実行されると、同じロックを取得し、サーチャーを破壊し、インデックスを更新し、サーチャーを再作成します。新しいサーチャーは、インデックスの次の更新まで待機します。検索者は常に最新のインデックスを使用しています。

BugTracker.NETソースを取得し、my_lucene.csファイルとsearch_text.aspxファイルを確認できます。これらはすべてこれらの2つのファイルにあり、それほど多くのコードはありません。

他のヒント

リーダーのIsCurrent()メソッドを呼び出して、利用可能なインデックスの新しいバージョンが存在するかどうかを確認し、それが再度開いている場合は確認できます。最良の方法ではありませんでしたが、十分に簡単であり、要件がそれほど大きくなければ十分です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top