16

ASP.NET で Lucene.Net を使用する場合、ある Web 要求がインデックスの更新をトリガーし、別の Web 要求が検索を実行していることが想像できます。Lucene.Net には、同時アクセスを管理する機能が組み込まれていますか?それとも、「別のプロセスによって使用されている」というエラーを回避するために管理する必要がありますか?

編集: ドキュメントと実験を読んだ後、これが私が学んだことだと思います: スレッドの安全性と同時実行性という 2 つの問題があります。マルチスレッドは、インデックスに悪いことを何もできないという点で「安全」です。ただし、一度に 1 つのオブジェクトがインデックスをロックするだけで安全です。2 番目のオブジェクトが来て、例外をスローします。したがって、検索を開いたままにして、別のスレッドのライターがインデックスを更新できると期待することはできません。また、スレッドがインデックスの更新でビジー状態の場合、サーチャーの作成は失敗します。

また、検索者は、インデックスを開いたときの状態でインデックスを見るので、インデックスを更新したままにしておくと、更新は表示されません。

検索者に最新の更新を見てもらいたかったのです。

私の設計は、これまでのところ機能しているように見えますが、現在の書き込みまたは検索が完了するまで、ライターとサーチャーが失敗しないようにロックを共有するというものです。

4

3 に答える 3

22

このページによると、

インデックス作成と検索は、スレッド セーフであるだけでなく、プロセス セーフでもあります。これが意味することは次のとおりです。

  • 複数のインデックス サーチャーが同時に lucene インデックス ファイルを読み取ることができます。
  • インデックス ライターまたはリーダーは、検索の進行中に lucene インデックス ファイルを編集できます。
  • 複数のインデックス ライターまたはリーダーが同時に lucene インデックス ファイルの編集を試みることができます (インデックス ライター/リーダーを閉じて、ファイル ロックを解放することが重要です)。ただし、クエリ パーサーはスレッド セーフではないため、インデックスを使用する各スレッドには独自のクエリ パーサーが必要です。

ただし、インデックス ライターはスレッド セーフであるため、人々が検索している間にインデックスを更新できます。ただし、新しく更新されたデータを取得するには、開いているインデックス サーチャーを持つスレッドがそれらを閉じ、新しいものを開くことを確認する必要があります。

于 2008-10-11T22:07:38.007 に答える
3

問題が発生する可能性があります。インデックス作成スレッドが新しいドキュメントを作成していて、その結果、一部のインデックスセグメントがマージされる場合、マージされたセグメントが削除され、新しいセグメントが作成されます。問題は、インデックスサーチャーが開いたときにすべてのセグメントをロードしたことです。つまり、開いたときに存在していたセグメントへの「ポインター」があります。これで、インデックスライターがセグメントのマージを実行してセグメントを削除した場合でも、インデックスサーチャーはセグメントファイルが存在すると見なし、「ファイルが見つかりません」エラーで失敗します。実際に行う必要があるのは、SOLRを使用するか、SOLRと同様に独自のインデックススナップショットレプリケーションを実行することにより、書き込み可能なインデックスを検索可能なインデックスから分離することです。Windowsで.NETとLucene.NETを使用してSOLRと非常によく似たシステムを構築しました。NTFSハードリンクを使用して効率的なスナップショットレプリケーションを作成します。興味があればもっと情報をあげることができます。

于 2008-10-29T20:29:42.633 に答える
2

インデックスへの同時書き込みの管理ほど問題はありません。SOLR はサーバーとして実行されるため、これらの違いのほとんどが抽象化されています。

于 2008-10-11T05:01:44.850 に答える