Elasticsearch - Scroll


Scroll
Version:6.1
英文原文住所:Scroll
1つの検索要求が1ページの結果を返す場合、scroll APIを使用して、従来のデータベースでカーソルを使用する方法と非常に似たようなボリューム(またはすべて)の結果を取得できます.scrollをリアルタイムリクエストに使用しないでください.主にビッグデータ量のシーンに使用されます.たとえば、あるインデックスの内容を別の異なる構成の新しいインデックスにインデックスします.
Client support for scrolling and reindexing
一部の公式サポートクライアントは、検索とインデックス間のドキュメントの再インデックスをスクロールするのに役立つ補助クラスを提供しています.
Perl
Search::Elasticsearch::Client::5_を参照0::BulkとSearch::Elasticsearch::Client::5_0::Scroll
Python
elasticsearchを参照.helpers.*
NOTE:scrollリクエストから返された結果は,時間スナップショットのように初期検索リクエスト生成時のインデックス状態を反映する.ドキュメントへの変更(インデックス、更新、または削除)は、以降の検索要求にのみ影響します.
scrollを使用するには、最初の検索要求はクエリー文字列にscrollパラメータを指定する必要があります.このパラメータは、Elasticsearchが「search context」をどのくらい保存するかを示します.例:?scroll=1m
POST /twitter/tweet/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

上記のリクエストが返された結果には_scroll_idが含まれています.この値をscroll APIに渡して、次の結果を取り戻す必要があります.
POST (1)  /_search/scroll (2) 
{
    "scroll" : "1m", (3)
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" (4)
}

(1)GETまたはPOSTのいずれでもよい
(2)URLにはindexおよびtypeの名称を含めることはできません.
(3)scrollパラメータはElasticsearchに検索コンテキストをあと1分保持するように伝える
(4)scroll_idの値は、前の要求で返された_scroll_idの値であるsizeパラメータを使用すると、バッチ結果が返されない最大ヒット数を構成できます.scroll APIを呼び出すたびに、返される結果がなくなるまで、次の結果が返されます.つまり、配列が空になります.
IMPORTANT:初期の検索要求とscroll要求ごとに新しい_scroll_idが返されます.最近の_scroll_idのみが使用可能です.
NOTE:要求がフィルタリングを指定した場合、初期検索の応答にのみ集約結果が含まれます.
NOTE:Scrollリクエストは_docのソートを最適化しました.すべてのドキュメントを巡回し、順序を考慮しない場合は、_docが最も効率的なオプションです.
GET /_search?scroll=1m
{
  "sort": [
    "_doc"
  ]
}

Keeping the search context alive scrollパラメータは、Elasticsearchが検索コンテキストをどのくらい維持すべきかを示す.その値は、すべてのデータを処理できるほど長くする必要はありません.前の結果を処理するのに十分であればいいです.各scrollリクエストには、新しい有効期限が設定されます.
通常、インデックスを最適化するために、バックグラウンドマージプロセスでは、小さなセグメントが結合されて新しいより大きなセグメントが作成され、小さなセグメントが削除されます.このプロシージャはscrolling中に続行されますが、オープン状態のインデックスコンテキストは、古いセグメントがまだ使用する必要がある場合に削除されることを防止します.これは、Elasticsearchがドキュメントの後続の変更を考慮せずに、初期検索要求の結果を返す理由を説明します.
TIP:古いセグメントをアクティブにすることは、より多くのファイルハンドルが必要であることを意味します.ノードが十分なファイルハンドルを持つように構成されていることを確認してください.詳細はFile Descriptorsを参照
nodes stats APIを使用して、検索コンテキストがオンになっているかどうかを確認できます.
GET /_nodes/stats/indices/search

Clear scroll API scroll timeoutを超えると、検索コンテキストは自動的に削除されます.ただし、scrollsのオープンを維持するのはコストがかかり、scrollを使用しない場合はclear-scroll APIを使用して明示的にクリアする必要があります.
DELETE /_search/scroll
{
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

配列を使用して複数のscroll IDを渡すことができます
DELETE /_search/scroll
{
    "scroll_id" : [
      "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
      "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB"
    ]
}
_allパラメータを使用してすべての検索コンテキストをクリア
DELETE /_search/scroll/_all

query stringパラメータを使用してscroll_idを渡し、複数の値を英語のカンマで分割することもできます.
DELETE /_search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==,DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB

Sliced Scroll
scrollクエリで返されるドキュメントの数が多すぎる場合は、独立して使用するために複数のスライスに分割できます.
GET /twitter/tweet/_search?scroll=1m
{
    "slice": {
        "id": 0, (1)
        "max": 2 (2)
    },
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}
GET /twitter/tweet/_search?scroll=1m
{
    "slice": {
        "id": 1,
        "max": 2
    },
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

(1)スライスのid
(2)最大スライス数
上の栗は、最初のリクエストが最初のスライス(id:0)のドキュメントを返し、2番目のリクエストが2番目のスライスのドキュメントを返します.最大スライス数を2に設定したので、2つのリクエストの結果は、スライスしないscrollクエリの結果と等価です.デフォルトでは、最初のスライス(shard)で分割してから、slice(doc)=floorMod(hashCode(doc._uid)、max)を使用して、shardごとに分割を実行します.例えば、shardの数が2であり、ユーザが4 slicesを要求する場合、idが0および2のsliceは1番目のshardに割り当てられ、idが1および3のsliceは2番目のshardに割り当てられる.
各scrollは独立しており、任意のscrollリクエストのように並列処理できます.
NOTE:shardsよりもslicesの数が多い場合、最初の呼び出しではslice filterの速度が非常に遅くなります.その複雑さはO(n)であり、メモリオーバーヘッドはslice Nビットごとに等しく、N時shardのドキュメントの総数である.数回の呼び出しでフィルタがキャッシュされ、その後の呼び出しが高速になります.ただし、メモリが急増しないように、並列に実行されるslicedクエリの数を制限する必要があります.
このコストを完全に回避するには、別のフィールドのdoc_valuesを使用してスライスできますが、ユーザーは、フィールドに次の属性があることを確認する必要があります.
  • このフィールドは数値タイプ
  • です.
  • このフィールドは、doc_values
  • を有効にします.
  • 各ドキュメントには、単一の値が含まれている必要があります.1つのドキュメントに指定したフィールドの複数の値がある場合は、最初の値
  • を使用します.
  • 各ドキュメントの値は、ドキュメントの作成時に設定された後は更新されず、各スライスが決定する結果
  • を得ることを保証する.
  • フィールドの基数は非常に高くなければならない.これにより、スライスごとに得られるドキュメントの数がほぼ同じ
  • であることが保証される.
    GET /twitter/tweet/_search?scroll=1m
    {
        "slice": {
            "field": "date",
            "id": 0,
            "max": 10
        },
        "query": {
            "match" : {
                "title" : "elasticsearch"
            }
        }
    }

    NOTE:デフォルトでは、scrollごとに許容される最大スライス数は1024です.インデックス設定のindex.max_slices_per_scrollを更新して、この制限を回避できます.
    転載先:https://www.cnblogs.com/WessonStar/p/8360659.html