Esページングソリューション:(from+size)ページングと深さページング

1954 ワード

from+sizeページング
一般的なクエリー・プロセスでは、最初の10のデータをクエリーしたい場合は、次のようになります.
  • クライアントは、あるノード
  • に要求する.
  • 2ノードは各スライスに転送され、各スライス上の最初の10個の
  • を問い合わせる.
  • 3結果はノードに戻り、データを統合し、上位10本の
  • を抽出する.
  • 4は、要求クライアント
  • に戻る.
    このページング方式はfrom+size方式で実現できる.fromはターゲットデータのオフセット値を定義し、sizeは現在返されるイベントの数を定義します.
    GET /fs/_search?pretty
    {
      "from" : 0 , "size" : 10
    }
    
    GET /fs/_search?pretty
    {
      "from" : 10 , "size" : 10
    }
    

    このページング方式は、fromが大きくなるにつれてクエリーの時間が大きくなり、データ量が大きくなるほどクエリーの効率指数が低下するため、少量のデータにのみ適しています.
    利点:from+sizeデータ量が少ない場合、効率が高いという欠点:データ量が非常に大きい場合、from+sizeページングはすべての記録をメモリにロードし、実行速達が特に遅いだけでなく、esにメモリ不足が発生しやすく、削除しやすい
    例えば、5001ページ目のデータを取得するには、ページング時にelasticsearchは、まず各ノードから50020のデータを取り出し、その後、各ノードのすべてのデータと並べ替え、並べ替え後の50010から50020のデータを取り出し、戻ってくる必要があります.これにより、データ量が増加するにつれて、ページごとにソートするコストが増加します.
    scroll深さページング
    上記の問題を解決するためにelasticsearchはscrollスクロール方式を提案し、このスクロール方式の原理はクエリーのたびにscroll_を返すことである.id.このscroll_によるとidは次ページのクエリーを行います.これをscroll_idは、通常のリレーショナル・データベース内のカーソルとして理解されます.
    scrollとは、現在のインデックス・セグメントのスナップショット情報を維持するキャッシュです(このスナップショット情報は、このscrollクエリーを実行するときのスナップショットです).
    scrollを初期化と遍歴の2つのステップに分けることができます.
    1、初期化時に検索条件に合致するすべての検索結果をキャッシュし、スナップショットとして想像することができる.
    GET fs/_search?scroll=3m
    {
      "query": {"match_all": {}},
       "size": 3
    }
    

    初期化時は通常のsearchのようにscroll=3 mが現在のクエリを表すデータキャッシュ3分Size:3が現在のクエリを表す3つのデータ
    2、遍歴して、このスナップショットからデータを取ります.遍歴中に前回遍歴中のscroll_idは、scrollパラメータを使用して、前回のループステップを繰り返し、返されたデータが空になるまでループが完了したことを示します.毎回パラメータscrollを転送し、検索結果のキャッシュ時間をリフレッシュし、indexとtypeを指定する必要はありません(キャッシュ時間を長く設定せず、メモリを消費しないでください).
    コントラスト
    from+sizeページングでは、クエリーのたびにインデックスライブラリ(ローカルフォルダ)でpageNum*pageバーのデータをクエリーし、前のデータを切り取り、最後のデータを残します.このような操作は各スライスで実行され、最後に複数のスライスのデータが統合され、再びソートされ、必要なものが切り取られます.一般的に冷たい言葉はこのようにページを分けます.
    クエリー条件を満たすすべてのデータを一度にメモリに格納できる深さのページ.ページング時に、メモリでクエリーします.比較的浅いページングでは、ディスクの複数回の読み取りを回避できます.一般的なホットワードはscrollで深くページを分けます.