1

LINQ to Lucene の適切な使用パターンは何Index<T>ですか?

実装するIDisposibleので、using ステートメントでラップするのが最も理にかなっていると思いました。

IEnumerable<MyDocument> documents = null;

using (Index<MyDocument> index = new Index<MyDocument>(new System.IO.DirectoryInfo(IndexRootPath)))
{
    documents = index.Where(d => d.Name.Like("term")).ToList();
}

ディスク上のインデックスが不要に削除されることがあります。インデックスの複数のインスタンスが同時に存在する場合、100% の確率で発生するようです。PLINQ を使用して 2 つの検索を並行して実行するテストを作成しました。1 つの検索は機能しますが、インデックスが空であるため、もう 1 つの検索は 0 の結果を返します。

  • 代わりに単一の静的インスタンスを使用することになっていますか?
  • でラップする必要がありLazy<T>ますか?
  • 複数のユーザーが同時に静的インデックスにアクセスすると、他の問題が発生する可能性がありますか?

また、Windows サービスなどの別のプロセスを使用して、必要に応じて定期的にインデックスを再作成したいと考えています。インデックスの再構築中にユーザーが検索を行った場合、問題が発生することはありますか?

4

1 に答える 1

0

コードはLinq-to-Lucene のようになります。

完全にクリアされた Lucene インデックスのほとんどのケースは、createパラメーターを true に設定して作成された新しい IndexWriters です。問題のコードはインデックス作成を処理しないため、これをさらにデバッグすることは困難です。

Lucene.Net はスレッド セーフであり、linq-to-lucene もこの動作を阻害することを期待しています。単一の静的インデックス インスタンスはメモリにキャッシュしますが、インデックスの変更のリロードを自分で処理する必要があると思います (linq-to-lucene がこれを行うかどうかはわかりません)。

インデックスの再作成時に複数のサーチャー/リーダーを使用しても問題はありません。Lucene はそのシナリオをサポートするように構築されています。ただし、ディレクトリごとに 1 つのライターしか存在できないため、Windows サービスがインデックスを最適化する間、他のプロセスがドキュメントをインデックスに書き込むことはできません。

于 2013-05-04T10:11:35.370 に答える