Elasticsearch でつまづいた話 (5)

Elasticsearch でつまづいた話 (3) - take a keen edge のページング取得では、1回 scroll して、戻り値から次の scroll id を取得して、もう一度クエリを投げて... だったが、せっかくスナップショットをとっているのであれば並列で取得しにいきたいのが当然の心理。

そんなときに使うのが Sliced Scroll だ。 max で最大ページ数を決め、id で取得するページの index を指定する。

max を適当に決め打ちして、取得件数が都度変わる、でもいいのだが、リクエストする側のスループットを考えても、レスポンスのサイズはある程度固定されているほうが望ましい。なので作法としては

  1. _count を叩いて全件数 (N とする) を取得 (当然、フィルターするのであれば同じ条件で叩く)。
  2. 1回の取得件数 (M とする) を、リクエストする側の都合で適当に決め、N / M を切り上げて max とする。
  3. max まで各ページを並列 (各言語でお好きに) で取得するクエリを投げる 。
  4. レスポンスをマージ。

がよいだろう。もちろんスレッド数の制限とかネットワーク環境とか色々変数があるのでこれがベストではない。