2012-01-16 4 views
17

私はluceneを使って文書を索引付けし、検索を実行した後すぐに削除します。 このすべては、以下のステップを含むややアトミックアクションとして考えることができます。lucene良い練習とスレッドの安全性

指数(作家)- >検索(検索者)は、- > スコア(リーダー)ドキュメントを取得します - >削除ドキュメント(リーダ)

このアクションは(FSDirectoryを使用して)同じインデックス上の複数の同時スレッドによって行うことができます。

重要:各スレッドは、文書の別のセットを処理しますので、一つのスレッドは、その目的のために

に別のスレッドの文書を触れないだろう、私はいくつかの質問があります:

1)私はシングルを使用する必要がありますすべてのスレッドのインスタンス数はIndexWriter,IndexReaderIndexSearcher? (彼らはスレッドセーフであるはずです)

2)IndexWriterはインデックスを操作することができ、IndexReaderは文書を削除できますか?そのことをするためにもう一方を閉じる必要がありますか? 意味、1つはインデックスに書き込むことができますが、もう1つはインデックスから削除します(先に述べたように、別々のデータセットを扱うことが保証されます)。

3)他の良いプラクティスや提案があります最も感謝します。

ありがとう!

答えて

29

IndexWriterIndexReaderIndexSearcherスレッドセーフのAPIのjavadocに応じて、次のとおりです。

注:IndexSearcherのインスタンスが完全に 複数のスレッドが同時に、そのメソッドを呼び出すことができることを意味し、スレッドセーフです

注:IndexReaderインスタンスは完全にスレッドセーフであり、複数の意味を持ちます スレッドは、そのメソッドのいずれかを同時に呼び出すことができます。

注:IndexWriterのインスタンスが完全に 複数のスレッドが(複数の読み取り専用IndexReader sが開くことができますが、それは1を共有する方が良いでしょう同時に

、そのメソッドを呼び出すことができることを意味し、スレッドセーフですパフォーマンス上の理由から)。

単一のIndexWriterのみを開くことができます(同じインデックスで他のユーザーが開くことを防ぐために書き込みロックが作成されます)。 を使用すると、文書を削除することができますが、IndexWriterにはこのロックが保持されます。IndexReaderは、索引が開かれたときと同じように常に索引を表示しますが、ライターによって行われた変更は、ライターがコミットした後にのみ表示され、リーダーは再オープンされます。

IndexSearcherの任意の番号を開くことができますが、もう一度共有することをお勧めします。インデックスが変更されている間も使用できます。 IndexReaderと同じ働きをします(検索者が再び開くまで変更内容は表示されません)。

+0

スピーディー&よく書かれた返信のおかげで! – levtatarov

関連する問題