3

現在、Lucene と Hibernate Search を使用して、会社の概念実証検索ソリューションの構築に取り組んでいます。正常に動作する個々のコンポーネントを構築しました。現在、ユーザーがさまざまなソース (ドメイン + データ) から検索結果を取得できる単一の API の作成を検討しています。私が達成したいのは、検索マネージャーがさまざまな検索コンポーネントに非同期で検索要求を発行し、1 つの結果セットが処理されたときに、残りを処理しながらその結果をユーザーに返すようなものです。検索結果が処理されたら、さらに検索結果があることをクライアントに通知します。

個々の検索コンポーネントを検索するために個別のスレッドを作成し、検索結果のリストを保持する検索マネージャーがあるかどうか疑問に思っています。リストに 1 つのセットが入力されると、それがユーザーに返されます。追加の検索結果には、検索マネージャーが結果をユーザーにプッシュすることが含まれます。

コード例を探しているわけではありませんが (あれば幸いです)、この問題に取り組む方法についてのガイダンスを得ることができるかどうか疑問に思っていました。イベント処理テクノロジ (GigaSpaces、Spring、JMS) を使用しますか、それとも標準の Java 並行ライブラリを使用しますか? リストを管理し、更新された結果をプッシュする効果的な方法は何でしょうか。

乾杯

4

3 に答える 3

1

これは、Java 5 以降のExecutor Service抽象化に完全に適合するように思えます。タスクをエグゼキューター スレッドのプールに送信し、完了を非同期的にポーリングできます。

したがって、あなたの場合は、各検索を独自のタスクとして作成し、それらのタスクをポーリングして完了するようにします。完了したら、結果を取得してユーザー向けに集計します。

于 2009-05-28T22:20:59.443 に答える
0

Scatter-Gatherパターンを調べます。JMS (またはその他のメッセージング テクノロジ) を使用してクエリを非同期的にブロードキャストし、タイムアウトに達するか最小数の検索結果が返されるまで応答を収集し、それまでの結果をエンドユーザー。

JMS などを使用する利点は、応答を待っている複数のスレッドを拘束する必要がなく、最初の結果セットがユーザーに返された後に到着する応答を処理するメカニズムがあることです。

Lucene に基づくオープン ソースのエンタープライズ検索サーバーであるSolrと、これらの問題の処理方法を調べてみてください。

于 2009-05-31T15:27:11.793 に答える
0

非同期検索インターフェースを実装する Lucene などの検索マネージャーのタイプごとにクラスを作成すると、「通常の」Java のものだけで処理できるはずです。

私は次の行で考えています:

順序付けが必要か、その中のデータにランダムにアクセスするか、単に反復するかに応じて、適切なプロパティを持つスレッド セーフ コレクション (重複した検索が必要ない場合はセット) を作成します。通常、どのデータ構造を使用するか。

コレクションをパラメーターとして受け取る run search メソッドとのインターフェース - 検索が終了したかどうかを確認するための別のメソッドである可能性があります。または、好きな方法で、他のリスナーベースの手段。

異なる検索方法ごとにそのインターフェースを実装します。各検索メソッド呼び出しは、呼び出し時に検索を実行する独自のスレッドを作成し、そのスレッドは検索結果を提供されたコレクションに配置します。

検索マネージャーは、すべての既知の検索エンジン (どこかに登録されている) を反復処理し、指定されたクエリを使用してそれぞれの検索エンジンを検索します。

それが役立つことを願っています。

于 2009-05-28T19:05:17.887 に答える