レスポンスライターと cursorMark の組み合わせ | KandaSearch Community Support Forum

レスポンスライターと cursorMark の組み合わせ

トピック作成者:ks-solruserml-bot (2025/10/24 18:06 投稿)
5
OpenOpen

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

大きな結果セットをページングする場合、start/rows によるページネーションよりも cursorMark を使う方が良いことは知っています。なぜなら、cursorMark の方が、ページングの最中にデータが挿入/更新/削除された場合でもうまく動作し、さらにパフォーマンスも良くなる可能性があるからです。
https://solr.apache.org/guide/solr/latest/query-guide/pagination-of-results.html

また、レスポンスライターについても知っています。つまり、もし結果を CSV で取得したければ、wt パラメータを変更するだけで可能です。
https://solr.apache.org/guide/solr/latest/query-guide/response-writers.html

そこで質問です。これらを組み合わせたい場合はどうすればよいでしょうか? つまり、cursorMark を使って、きれいにページ分割された CSV を取得することはできるのでしょうか?

そのようなオプションは見当たりません ― 実際に存在するのでしょうか?

何か良い回避策はありますか?

start/row を使ったページングにして、その問題を受け入れるという方法もあります。しかし、その場合、自分の現在の位置より上で行が挿入/削除/移動されると、データが 1 行分ずれてしまい、それは好ましくありません。

別の方法として、1 ページあたり 2 回のクエリで cursorMark を使うこともできます。例えば:

  • cursorMark を、最後に取得したもの、または開始時なら "*" に設定する。
  • API を 1 回呼び出し、JSON レスポンスライターで結果を取得。nextCursorMark の値を記録する。
  • API を 2 回目呼び出し、CSV レスポンスライターで結果を取得。それを保存する。
  • レート制限を避けるため、1 秒ほど待機することもある。
  • もし nextCursorMark が前回のものと異なれば、さらに結果があるのでループを続ける。

この方法であれば、現在の位置より上で行が挿入/削除/移動されてもデータがずれることはありません ― 素晴らしいことです。しかし、2 回のクエリの間に、ちょうど自分のページ内で行が挿入/削除/移動されてしまった場合、行を取り逃したり、二重にカウントしてしまう可能性があります。

他にもっと良い方法はあるでしょうか?

よろしくお願いします。
James

返信投稿者:ks-solruserml-bot (2025/10/24 18:07 投稿)

なぜ2回呼び出す必要があるのか説明していただけますか?
最初から wt=csvcursorMark=* を指定して、結果を取得することはできないのでしょうか?

Rahul

返信投稿者:ks-solruserml-bot (2025/10/24 18:07 投稿)

こんにちは Rahul、

それをやると、返ってくるのは CSV だけなんです。
「nextCursorMark」データは含まれていません。
「nextCursorMark」データを得たい場合、JSON 出力を使う必要があるように見えます。
つまり、この 2 つの機能を組み合わせて、1 ページ以上の情報を取得することは不可能なんです。

(投稿した直後に、少しはマシな回避策を思いつきましたが、それでも私が見落としているだけで、この 2 つの機能を組み合わせる方法があるのか気になっています。)

ありがとうございます。
James

返信投稿者:ks-solruserml-bot (2025/10/24 18:07 投稿)

cursorMark は CSV 形式ではサポートされていないようで、特定のフォーマットについて議論したうえで開発される可能性があります。
もう一つの方法としては、結果トランスフォーマーを開発して、各 CSV 行にフィールド値として cursorMark を出力する、というものがありますが、確実に動作するかは 100% 自信がありません。

ところで、単にドキュメントを JSON Lines 形式でエクスポートして
https://solr.apache.org/guide/solr/latest/deployment-guide/solr-control-script-reference.html#exporting-documents-to-a-file
それを CSV に変換する、という方法ではダメでしょうか。
それなら簡単なはずですよね?

--
よろしくお願いします
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2025/10/24 18:08 投稿)

もしこの機能を実現するために新しい仕組みを追加するという話であれば、
nextCursorMark のデータを HTTP レスポンスヘッダーとして追加することは可能でしょうか?
これは CSV の内容自体を変更しないので、後方互換性が保たれるという利点があります。

それなら簡単なはずですよね?

たぶん可能だと思いますが、もし Solr にすでに十分にテスト済みの CSV 出力機能があるなら、それを使いたいです。

ありがとう、
James

返信投稿者:ks-solruserml-bot (2025/10/24 18:08 投稿)

もしこの機能を実現するために新しい仕組みを追加するという話であれば、nextCursorMark のデータを HTTP レスポンスヘッダーとして追加することは可能でしょうか?

レスポンスライターは HTTP レスポンスへの参照を持っていないので、可能ではなさそうです。
https://github.com/apache/solr/blob/7279b808628a9286def7aea8b3b00f626df23dec/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java#L1012

--
よろしくお願いします
Mikhail Khludnev

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

KandaSearch

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

投稿の削除

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