索引付け
IndexWriter
読んでいるうちに、クラスを使用してインデックス作成が行われていることに気付いたでしょう。LuceneIndexWriter
では、一度に 1 つのインスタンスしか開くことができません。デフォルトのロックを使用すると、インデックス ディレクトリにロック ファイルが作成され、他の IndexWriter インスタンスが作成されなくなります。このため、より制御しやすいプロセスでインデックス作成を実装する方がよい場合があります。
インデックス作成プロセスが極度の偏見で終了し、IndexWriter
クラスが閉じられない場合、インデックス フォルダーのロックが維持され、他のインスタンスは許可されません。このため、Lucene では ( を使用してIndexWriter.unlock
) インデックス付きフォルダーからロックを解除できます。これは危険な方法です。同じインデックスで 2 つの IndexWriter が開かれていると、インデックスが破損するからです。インデックス作成を実行している Windows サービスがあり、それがソリューション内でインデックス作成 (および更新) を実行する唯一のプロセスである場合、サービスの起動時にインデックス作成フォルダーのロックを確実に解除できます。Web メソッドからインデックス作成を実行している Web サービス ベースの環境では、ロックの問題の制御と回復が問題になります。
検索中
クラスはIndexSearcher
検索に使用されます。これは、読み取り専用モードで、サービス ベースのコードから実行できます。この目的のために別の WCF メソッド セットを作成する必要はないと思います。
最適化
ボリュームによっては、インデックスのパフォーマンスを定期的に最適化する必要がある場合があります。もう一度別のプロセスでインデックス作成を行うことで、毎晩、毎週、または必要に応じて最適化をスケジュールできます。最適化は、1 つのメソッドの呼び出しによって行われます。
新しいデータのインデックス作成
新しいデータをインデックス化するためのインデックス作成プロセスをいつ、どのように取得するか....インデックスを作成しているデータがわからないので、わかりにくいです。私のシナリオでは、大量の入力データを担当する WCF メソッドがあります。受信したデータをできるだけ早く検索できるようにする必要があります。そう、
私のモデル層には通知層があり、必要なタイプの新しいレコードが正常にコミットされると、単純な通知メッセージが MSMQ のローカル キューに挿入されます。
MSMQ の理由は、キューが永続的でトランザクション可能であり、システムの再起動によるクラッシュの後でもそこにあるすべてのメッセージを利用できるためです。
インデックス サービスは通知を受け取り、LuceneDocument
を構築してデータのインデックスを作成します。
インデックス作成サービスは、既存のインデックスを削除してデータベースをクロールすることにより、完全な再インデックスを実行するようにトリガーすることもできます。
編集:
アーキテクチャの例:
WCF サービス メソッドはデータを受け取り、それをモデル レイヤーにコミットします。モデル レイヤーは、アイテムに対して CRUD 操作が正常に行われたことをリッスンしているクライアントに通知します。リッスンしているクライアントは、通知をキューにポストします。
Windows サービスは、データのインデックス作成を処理し、インデックス作成要求のキューを監視します。
ASP.Net アプリは、検索機能を備えたユーザー インターフェイスを提供します。