solrj:Solr Cloud における非同期リクエストとバッチ更新 | KandaSearch Community Support Forum

solrj:Solr Cloud における非同期リクエストとバッチ更新

トピック作成者:ks-solruserml-bot (2025/07/17 11:16 投稿)
2
OpenOpen

(The bot translated the original post https://lists.apache.org/thread/4n7z4vkslrjj3wsb5t5fvghvyvvwy71k into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

こんにちは、皆さん。

現在、Apache StormCrawler(インキュベーション中)
https://github.com/apache/incubator-stormcrawler/pull/1488)の機能を開発しており、以下のことを実現したいと考えています:

  1. Solr Cloud クラスターと通信するために
    CloudHttp2SolrClient を使用する
  2. Http2SolrClient#requestAsync でできるように、非同期のクエリリクエストを送信する
  3. ConcurrentUpdateSolrClient のように、バッチでの更新を送信する

私が調べた限りでは、(2) と (3) は標準機能としてはサポートされていないため、代替策として以下のような方法を試してみました:

非同期クエリリクエストについて:

  • CloudHttp2SolrClient がラップしている LBHttp2SolrClient を取得する
  • クラスター状態からアクティブな Solr エンドポイントを取得する
  • エンドポイントをシャッフルして簡易的なロードバランシングを行う
    • LBHttp2SolrClient#requestAsync の仕様によれば:
      複数ホストに対して非同期リクエストを実行するが、指定されたエンドポイントリストの最初のエンドポイントから順に試し、成功するまで繰り返す。このメソッド自体はロードバランスを行わないため、ロードバランスが必要な場合は呼び出し側でリストをシャッフルする必要がある
  • その上で LBHttp2SolrClient#requestAsync を実行する

上記の実装例はこちらにあります:
SolrConnection.java(L66〜L96)

一方、バッチ更新については、唯一考えついた代替策は手動でバッチ処理を実装することですが、これは複雑ですし、CloudSolrClient の設計思想にも反しているように感じられます。

将来的に、CloudHttp2SolrClient に非同期リクエストやバッチ更新機能を追加する予定はあるのでしょうか?

上記の代替策について、ご意見・ご提案があればぜひ教えてください。

どうぞよろしくお願いいたします。

Markos Volikas

返信投稿者:ks-solruserml-bot (2025/07/17 11:17 投稿)

Markosさん、こんにちは。

まずは一番簡単な質問からお答えします。
requestAsync メソッドは SolrJ API に比較的新しく追加された機能です。具体的な計画は私の知る限りありませんが、今後時間をかけてより多くのクライアント実装に追加され、最終的には SolrClient インターフェースにも組み込まれることになると思われます。

一方で、更新のバッチ処理については少し話が違います。
CloudSolrClientConcurrentUpdateSolrClient は、更新リクエストの高速化に対して根本的に異なるアプローチを取っています。

ご存知のとおり、ConcurrentUpdateSolrClient はドキュメントを内部キューに追加し、可能であればバッチでまとめて単一のエンドポイントにストリーム送信します。
一方で CloudSolrClient は、各ドキュメントがどのシャードに属するかを判断し、それぞれのシャードのリーダーに直接ルーティングします。

将来的にこれら2つのアプローチを統合して、Cloud クライアントが両方の最適化を利用するようにすることは可能かもしれませんが、今のところそのような議論はあまりされていないため、近い将来のリリースで実現される可能性は低いと思われます。ただし、これは非常に良い改善になると思うので、もしご自身で貢献する意志があれば、私はぜひレビューして前進できるようにサポートします。ご興味があれば教えてください!

上でご提案いただいたワークアラウンド(代替手段)については、非同期クエリのフローについては特に改善提案はありません。とても理にかなっていると思います。

一方で 「バッチ更新」に関しては、SolrClient.update(SolrInputDocument) のような単一ドキュメントの更新 API の呼び出しを禁止する方法を見つければ、ConcurrentUpdateSolrClient に近いメリットを得られるかもしれません。
最も簡単な方法は、CloudHttp2SolrClient を継承した簡単なサブクラスを作成して、update(SolrInputDocument) メソッドをオーバーライドし、UnsupportedOperationException などの例外を投げるようにすることです。
こうすることで、StormCrawler の他の開発者たちに対して、Concurrent クライアントの内部動作に近い バッチ更新メソッドの使用を促すことができるでしょう。

健闘を祈っています!

Jason

返信投稿者:ks-solruserml-bot (2025/07/17 11:17 投稿)

Jasonさん、こんにちは。

とても丁寧な返信と、「更新のバッチ処理」に関する実装アイデアを共有していただき、本当にありがとうございます!

CloudSolrClient における並列更新についてのご指摘は、確かに興味深いですね。少し時間を見つけて調べてみようと思います。進展があれば、またご連絡します。

改めて、ありがとうございます。

Markos

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2025 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?