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 を維持する必要があります。 | 大量のデータをエクスポートするには、大量の結果セットからデータをクエリする必要があります |
検索後 | 高い | 最高のパフォーマンスは、深いページングの問題がなく、データのリアルタイムの変更を反映できることです。 | 実装は複雑で、グローバルに一意のフィールドが必要です。連続ページングの実装は、各クエリが前のクエリの結果を必要とするため、さらに複雑になります。大規模なページ ジャンプ クエリには適していません。 |