私は現在luceneを調べており、org.apache.lucene.search.IndexSearcher
で行われた検索をキャンセルする最良の方法は何か疑問に思っていますか?Lucene:検索をキャンセルする正しい方法は何ですか?
私は検索用に作成したスレッドで割り込みを呼び出すと想像することはできますが、lucene内の関連するコンポーネントが割り込みで反応するかどうかはわかりません(ソースコードの深さから検索せずに)。
「正式な」方法/最良の方法は何ですか?
よろしく
私は現在luceneを調べており、org.apache.lucene.search.IndexSearcher
で行われた検索をキャンセルする最良の方法は何か疑問に思っていますか?Lucene:検索をキャンセルする正しい方法は何ですか?
私は検索用に作成したスレッドで割り込みを呼び出すと想像することはできますが、lucene内の関連するコンポーネントが割り込みで反応するかどうかはわかりません(ソースコードの深さから検索せずに)。
「正式な」方法/最良の方法は何ですか?
よろしく
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
の使用は、結果として中断されたスレッドに問題はないようです。
1。最も簡単な方法は、既存の コレクタをラップし、代理人を呼び出す前にブール値をチェックして メソッドを収集するCollectorDelegate
です。
this linkをご覧ください。これはあなたを助けるかもしれません。
2。各ヒットでフラグをチェックした独自のHitCollectorを作成し、 が設定されていると例外をスローすることができます。 別のスレッドでは、フラグを設定して検索をキャンセルすることができます。
おかげで多くのことを話題! したがって、私がjavaのドキュメントとチケットを正しく理解していれば、デフォルトのチャネルベースの 'FSDirectory'実装が使用されているときに' shutdownNow() 'を呼び出さないことが重要です。 '(より遅い)' RAFDirectory'の使用は、中断されたスレッドには何の問題もないようです。 –
それも私の理解です。 –
音符は 'FSDirectory'ではなく、' NIOFSDirectory'だけをとります。 –