2016-04-09 2 views
2

私は現在luceneを調べており、org.apache.lucene.search.IndexSearcherで行われた検索をキャンセルする最良の方法は何か疑問に思っていますか?Lucene:検索をキャンセルする正しい方法は何ですか?

私は検索用に作成したスレッドで割り込みを呼び出すと想像することはできますが、lucene内の関連するコンポーネントが割り込みで反応するかどうかはわかりません(ソースコードの深さから検索せずに)。

「正式な」方法/最良の方法は何ですか?

よろしく

答えて

3

IndexSearcherパラメータとして(例えば、使用のためのコンストラクタ内のリンクをたどる)ExecutorServiceとのコンストラクタを提供します。これは、検索を終了するために使用できます。ただし、NIOFSDirectoryの使用に関する注意に注意してください。これは、デフォルトのチャネルベースのFSDirectoryの実装が使用された場合(スレッドを中断)shutdownNow()を呼び出さないことが重要です :

はのJavaDocと、問題チケットから抽出https://lucene.apache.org/core/6_0_0/core/org/apache/lucene/search/IndexSearcher.html

そして https://issues.apache.org/jira/browse/LUCENE-2239

を参照してください。 (遅い)RAFDirectoryの使用は、結果として中断されたスレッドに問題はないようです。

+0

おかげで多くのことを話題! したがって、私がjavaのドキュメントとチケットを正しく理解していれば、デフォルトのチャネルベースの 'FSDirectory'実装が使用されているときに' shutdownNow() 'を呼び出さないことが重要です。 '(より遅い)' RAFDirectory'の使用は、中断されたスレッドには何の問題もないようです。 –

+0

それも私の理解です。 –

+0

音符は 'FSDirectory'ではなく、' NIOFSDirectory'だけをとります。 –

1

1。最も簡単な方法は、既存の コレクタをラップし、代理人を呼び出す前にブール値をチェックして メソッドを収集するCollectorDelegateです。

this linkをご覧ください。これはあなたを助けるかもしれません。

2。各ヒットでフラグをチェックした独自のHitCollectorを作成し、 が設定されていると例外をスローすることができます。 別のスレッドでは、フラグを設定して検索をキャンセルすることができます。

same issue

関連する問題