Elasticsearch でつまづいた話 (4)
前回に引き続きページング取得の話。
Aggregations でページング
Terms Aggregations したとき、キーが多すぎる場合に分割して取得したい。そんなときは Partition に区切って取得することになる。
{
"size": 0,
"aggs": {
"aggregation_name": {
"terms": {
"field": "hoge",
"include": {
"partition": 0,
"num_partitions": 10
},
"size" : 1000,
}
}
}
}
この例では 10 分割にしている。 partition に 1〜9 を指定すると余りを取得することになる。注意したいのは、この例では 1000 件 × 10 partition で最後まで取得できる、と想定しているということだ。
推奨される流れとしては以下のとおり。
Cardinality Aggregation でキーの数を測る
キーの数に応じてチャンクの数 (上述の例でいう
10) を決める各チャンクのサイズ (上述の例でいう
1000) を決めるクエリする
更に述べておくと、各 Partition で取得される件数は、 Cardinality / num_partition に必ずしも一致しない。上述の例でいうと、毎回の取得件数は 1000 件より少なくなることがある (ふつうはその方が多い) 。集計結果が Partition をまたぐことがあるためだと思う。なので、 size の値は Cardinality / num_partition にすると取りこぼしが発生するので、それよりも大きい値 (2倍であれば十分、のはず...?) にしておくべきだ。