ESページングクエリ

6030 ワード

from+sizeページング
一般的なクエリー・プロセスでは、最初の10のデータをクエリーしたい場合は、次のようになります.
  • クライアントは、あるノード
  • への送信を要求する.
  • ノードは各スライスに転送され、各スライス上の最初の10個の
  • を問い合わせる.
  • 結果はノードに戻り、データを統合し、上位10本の
  • を抽出する.
  • は、要求クライアント
  • に戻る.
    このページング方式はfrom+size方式で実現できる.fromはターゲットデータのオフセット値を定義し、sizeは現在返されるイベントの数を定義します.
    このページング方式は、fromが大きくなるにつれてクエリーの時間が大きくなり、データ量が大きくなるほどクエリーの効率指数が低下するため、少量のデータにのみ適しています.
    利点:from+sizeデータ量が少ない場合、効率が高いという欠点:データ量が非常に大きい場合、from+sizeページングはすべての記録をメモリにロードし、実行速達が特に遅いだけでなく、esにメモリ不足が発生しやすく、削除しやすい
    例えば、5001ページ目のデータを取得するには、ページング時にelasticsearchは、まず各ノードから50020のデータを取り出し、その後、各ノードのすべてのデータと並べ替え、並べ替え後の50010から50020のデータを取り出し、戻ってくる必要があります.これにより、データ量が増加するにつれて、ページごとにソートするコストが増加します.
    2つの方法、1.スクロールAPIを使用する.2.[index.max_result_window]パラメータを直接設定します.
    curl -XPUT http://127.0.0.1:9200/my_index/_settings -d '{ "index" : { "max_result_window" : 500000}}'

    my_indexはデフォルトパラメータ値を変更するインデックスに変更され、データ量が2万以上で大きな数の変化が起こらないなど、後の数値も自分で設定できます.値を30000に設定できます.Kibanaコントロールパネルであれば、次のセクションを実行します.
    PUT my_index/_settings
    {
      "index":{
        "max_result_window":500000
      }
    }

    ElasticSearchは実際には検索エンジンとして適しており、このようなページングクエリーはクエリーを遍歴しているが、実際には適切ではない.また、数値設定が大きすぎると、機器に圧力がかかり、メモリオーバーフローなどのエラーが発生する可能性があります.
    scroll深さページング
    ES深さのページングを避けるために、ページング(from&size)を使用して10000以降のデータをクエリーすることはできません.したがって、10000以降のデータをクエリーする場合は、ESが提供するscroll(カーソル)を使用してクエリーします.
    scrollはリレーショナル・データベースのcursorとして理解できます.そのため、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を指定する必要はありません(キャッシュ時間を長く設定せず、メモリを消費しないでください).
    カーソルがパフォーマンスを上げる理由は、深いページを作ると検索のたびに並べ替え直さなければならないため、無駄です.scrollを使うと、使用するデータを一度に並べてバッチで取り出すので、from+sizeを使うよりもいいです.
     
    具体例
    1、初期化
    リクエスト
    注意URLのsearchにscroll=1 mを付けるにはrequest bodyに書くことはできません.1 mはこのカーソルが1分間開いていることを示しています
    sizeサイズを指定できます.つまり、数回のデータが返されるたびに、データがないまで返されると、200が成功します.hitsのhitsは空のlistになります.
    初期化時に返信を除くscroll_idは、上位100件(size=100と仮定)のデータも返信されます
    request bodyは一般検索と同様であるため,初期化の過程でscroll設定カーソルオン時間を加える以外は一般検索と変わらないといえる(クエリー条件を設定するには,前sizeペンのデータも返信する).
    POST 127.0.0.1:9200/my_index/_search?scroll=1m
    {
        "query":{
            "range":{
                "createTime": {
                    "gte": 1522229999999
                }
            }
        },
        "size": 1000
    }

    結果を返す
     
    {
        "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAfv5-FjNOamF0Mk1aUUhpUnU5ZWNMaHJocWcAAAAAAH7-gBYzTmphdDJNWlFIaVJ1OWVjTGhyaHFnAAAAAAB-_n8WM05qYXQyTVpRSGlSdTllY0xocmhxZwAAAAAAdsJxFmVkZTBJalJWUmp5UmI3V0FYc2lQbVEAAAAAAHbCcBZlZGUwSWpSVlJqeVJiN1dBWHNpUG1R",
        "took": 2,
        "timed_out": false,
        "_shards": {
            "total": 5,
            "successful": 5,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": 84,
            "max_score": 1,
            "hits": [
                {
                    "_index": "video1522821719",
                    "_type": "doc",
                    "_id": "84056",
                    "_score": 1,
                    "_source": {
                        "title": "    ",
                        "createTime": 1522239744000
                    }
                }
                ....99 data
            ]
        }
    }

     
    2、遍歴データ
    リクエスト
    初期化を使用して返された_scroll_idはリクエストを行い、リクエストごとに初期化中の未読データを返し続け、1つの_を返します.scroll_id,これ_scroll_idは変更される可能性があるので、リクエストごとに前回のリクエストを持って帰るべきです.scroll_id
    戻ってくるのは_scroll_id、でもリクエストに入れたのはscroll_id、両者のスペルが違います
    また、scrollリクエストを送信するたびに、このscrollのオープン時間を再リフレッシュし、うっかりタイムアウトしてデータが不完全になることを防止します.
    POST 127.0.0.1:9200/_search/scroll?scroll=1m
    {
        "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAdsMqFmVkZTBJalJWUmp5UmI3V0FYc2lQbVEAAAAAAHbDKRZlZGUwSWpSVlJqeVJiN1dBWHNpUG1RAAAAAABpX2sWclBEekhiRVpSRktHWXFudnVaQ3dIQQAAAAAAaV9qFnJQRHpIYkVaUkZLR1lxbnZ1WkN3SEEAAAAAAGlfaRZyUER6SGJFWlJGS0dZcW52dVpDd0hB"
    }

    結果を返す
    データがないと空のhitsが返ってきて、これでデータが遍歴したかどうかを判断できます
    {
        "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAdsMqFmVkZTBJalJWUmp5UmI3V0FYc2lQbVEAAAAAAHbDKRZlZGUwSWpSVlJqeVJiN1dBWHNpUG1RAAAAAABpX2sWclBEekhiRVpSRktHWXFudnVaQ3dIQQAAAAAAaV9qFnJQRHpIYkVaUkZLR1lxbnZ1WkN3SEEAAAAAAGlfaRZyUER6SGJFWlJGS0dZcW52dVpDd0hB",
        "took": 2,
        "timed_out": false,
        "_shards": {
            "total": 5,
            "successful": 5,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": 84,
            "max_score": null,
            "hits": []
        }
    }

    scrollクエリーの最適化
    一般的なシーンでは、scrollは通常、ソートが必要な大きなデータを取得するために使用されますが、データ間のソート性は私たちにとって関係なく、すべてのデータが取り出せば良い場合があります.この場合、scrollを最適化することができます.
    初期化
    使用_docがsortに行って得た結果、この実行の効率は最も速いが、データはソートされず、すべてのデータを取得したいシーンに適している.
    POST 127.0.0.1:9200/my_index/_search?scroll=1m
    {
        "query": {
            "match_all" : {}
        },
        "sort": [
            "_doc"
            ]
        }
    }

    scrollのクリア
    scrollをオンに設定すると、1つのscrollの生存時間を設定しますが、使い終わったら手で閉じることができれば、リソースを早めに解放し、ESの負担を減らすことができます.
    DELETE 127.0.0.1:9200/_search/scroll
    {
        "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAdsMqFmVkZTBJalJWUmp5UmI3V0FYc2lQbVEAAAAAAHbDKRZlZGUwSWpSVlJqeVJiN1dBWHNpUG1RAAAAAABpX2sWclBEekhiRVpSRktHWXFudnVaQ3dIQQAAAAAAaV9qFnJQRHpIYkVaUkZLR1lxbnZ1WkN3SEEAAAAAAGlfaRZyUER6SGJFWlJGS0dZcW52dVpDd0hB"
    }