記事のディレクトリ
ページングクエリ
ページングクエリはこれです:
POST /shop/_doc/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 10
}
しかし、クエリがあるとき、それは文句を言うでしょう。
POST /shop/_doc/_search
{
"query": {
"match_all": {}
},
"from": 9999,
"size": 10
}
次のようにエラー結果は以下のとおりです。
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Result window is too large, from + size must be less than or equal to: [10000] but was [10009]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting."
}
],
...
この結果は、ページの深さです。
ページング深さ
深検索ページには、実際には、ページ1、ページ2、ページ10、20ページなど色合い、ある比較的浅いです。。。PP 10000は、P 20,000非常に深いです。
これは実際にESは、クエリ結果のサイズ制限制限され、result window
サイズを。なぜ、このような制約は、まず第一に、私たちのESは断片化されています。
この断片の存在のためには、我々が入手したいsize:10,from:0
データを、それが0,1,2 3スライスが必要であり、データはその後ソート行い、10を撮影しました。
ならばとsize:10,from:9999
始め、各スライスは、一緒に、その後10009のデータを取得し、う、10009 * 3 = 30027個のデータの合計30027個のデータについては、再びソート処理を行う、最終的には最後の10のデータを取得します。そうすることのコストは、パフォーマンスの問題、メモリのコストが発生しますが高すぎるとCPUを占有します。そして、パフォーマンスのためのES、彼はデータクエリのより以上1万ページをサポートしていません。
深ページングソリューション
シナリオ1:制限最大ページ数
実際には、我々は深いページング操作を避けるべきである(ページング上限ページ数)は、例えば、唯一の開始までのページ101からディスプレイ100を提供することができなくなっている、すべての後に、ユーザーは、それほど深くは検出されません我々は通常、淘宝網やBaiduは、一般的には、ほとんどのページでに10が表示されます検索します。
次のように、淘宝網の検索ページの上限最大100のような:
シナリオ2:変更はresult_window
ビジネスニーズのために、時々 、私たちは持っているあなたが変更することができ、万個のデータの後に内容を検索するためにresult_window
達成するために:
GET /shop/_settings
PUT /shop/_settings
{
"index.max_result_window": "20000"
}
オプション3:使用して検索するスクロール
スクロール検索が最初にすぐに問い合わせを下げて、その後、いくつかのデータをチェックアウトすることができます。最初のクエリは、アンカータグに相当ロールIDになります場合は、その後、スクロールアンカータグは再び検索の検索、この行動に基づいて検索要求を必要とします。データ変更場合は、各検索は、データ照会中にデータの履歴スナップショットに基づいており、そして、検索は、コンテンツまたは検索するために関連していないのスナップショットデータ。
スクロール= 1メートル、セッションの相当セッション時間で、時間の検索コンテキストを保持することは1分です。
POST /shop/_search?scroll=1m
{
"query": {
"match_all": {
}
},
"sort" : ["_doc"],
"size": 5
}
次の結果を返します。
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoAwAAAAAAAACgFmkxLWVTcGxRUkY2bmNRUnd4RWVXOEEAAAAAAAAAoRZpMS1lU3BsUVJGNm5jUVJ3eEVlVzhBAAAAAAAAAKIWaTEtZVNwbFFSRjZuY1FSd3hFZVc4QQ==",
"took": 17,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
...
返された結果を使用し、我々は次のクエリを実行しました。
POST /_search/scroll 这里不能带index
{
"scroll": "1m",
"scroll_id" : "DnF1ZXJ5VGhlbkZldGNoAwAAAAAAAACgFmkxLWVTcGxRUkY2bmNRUnd4RWVXOEEAAAAAAAAAoRZpMS1lU3BsUVJGNm5jUVJ3eEVlVzhBAAAAAAAAAKIWaTEtZVNwbFFSRjZuY1FSd3hFZVc4QQ=="
}
その結果:
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoAwAAAAAAAACsFmkxLWVTcGxRUkY2bmNRUnd4RWVXOEEAAAAAAAAArhZpMS1lU3BsUVJGNm5jUVJ3eEVlVzhBAAAAAAAAAK0WaTEtZVNwbFFSRjZuY1FSd3hFZVc4QQ==",
"took": 45,
"timed_out": false,
"terminated_early": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
...