ページングクエリ

1. すべてのデータからクエリとサイズを取得し、不要な部分を削除します。

POST /my_index/my_type/_search
{
    "query": { "match_all": {}},
    "from": 100,
    "size":  10
}

2. スクロールは読み取り位置を記録し、次回もすぐに読み取りを続けることができます。

スクロール

クエリフェーズ: クエリ結果セットと doc_id リストをコンテキストに保存します。

フェッチステージ: サイズに応じて取得

POST /twitter/tweet/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

クエリフェーズ: 各シャードは結果 (doc_id と _score) にヒットして、_score の順にコンテキスト内に優先キューのスナップショットを作成し、scroll_id を通じてそれをポイントし、lastEmittedDoc は最後にアクセスされた場所をポイントし、最後に TOP(size) をポイントします。 doc ID が調整ノードに返されます。

フェッチ段階: 調整ノードは、各シャードから返された結果をマージおよび並べ替え、最後に doc_id を介して返された結果の完全なデータを検索します。次に、各シャードのコンテキストを更新します。
 

3、検索後

前のページの最後のデータに基づいて次のページの位置を決定します。各ページのデータは前のページの最後のデータに依存するため、ページング要求プロセス中に、次のページのジャンプ要求が存在する場合、ページジャンプ要求を完了できません。インデックスデータの追加、削除、変更、クエリ、これらの変更はリアルタイムでカーソルにも反映されます。

中心となるアイデアは、最後に訪れた場所を記録することです

GET twitter/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "es"
        }
    },
    "search_after": [124648691, "624812"],
    "sort": [
        {"date": "asc"},
        {"_id": "desc"}
    ]
}

ESの仕分け方法

クエリの段階でソートが必要ですが、完全なクエリを行わずにソートするにはどうすればよいですか?

  • フィルター クエリは doc_id (その時点で Lucene ファイル構造にインデックスが作成される順序)です。
  • 関連性スコア(_score)で並べ替えます
  • 指定したフィールドでソート(用語インデックス順)

デフォルトのページングクエリメソッド

ページングモード パフォーマンス アドバンテージ 欠点がある シーン
+サイズから 低い 優れた柔軟性とシンプルな実装 ディープページングの問題 データ量は比較的小さいため、ディープ ページングの問題を許容できます。
スクロール 真ん中 深さのページングの問題を修正 データのリアルタイム性 (スナップショット バージョン) を反映できないため、メンテナンス コストが高くつき、scroll_id を維持する必要があります。 大量のデータをエクスポートするには、大量の結果セットからデータをクエリする必要があります
検索後 高い 最高のパフォーマンスは、深いページングの問題がなく、データのリアルタイムの変更を反映できることです。 実装は複雑で、グローバルに一意のフィールドが必要です。連続ページングの実装は、各クエリが前のクエリの結果を必要とするため、さらに複雑になります。大規模なページ ジャンプ クエリには適していません。

JD.com インタビューの質問: ElasticSearch ディープ ページング ソリューション

ES ページング クエリの原則_Hey hey hey_java ブログ-CSDN ブログ

おすすめ

転載: blog.csdn.net/weixin_36416680/article/details/128776533