使用 search_after 進行分頁


適用於不斷下一頁這樣的查詢
我這里用的releaseTimestamp倒序。

{
  "query": {
    "range": {
      "releaseTime": {
        "gte": "2019-09-20 00:00:00",
        "lte": "2019-09-21 00:00:00"
      }
    }
  },
  "search_after":[ 1568995200000],
  "_source": ["title","releaseTime"],
  "sort": [
    {
      "releaseTimestamp": {
        "order": "desc"
      }
    }
  ],
  "size": 5
}

得到3條結果:

 "hits": {
    "total": 3,
    "max_score": null,
    "hits": [
      {
        "_index": "test_news",
        "_type": "_doc",
        "_id": "45a88261c9975aa6e0eb996c369c32de",
        "_score": null,
        "_source": {
          "releaseTime": "2019-09-20 23:59:48",
          "title": "嶺南大學與五邑大學將開展居家養老聯合研究-新華網"
        },
        "sort": [
          1568995190935
        ]
      },
      {
        "_index": "test_news",
        "_type": "_doc",
        "_id": "3ba4cc4d5ea82ff6da48109c070cb265",
        "_score": null,
        "_source": {
          "releaseTime": "2019-09-20 23:59:48",
          "title": "嶺南大學與五邑大學將開展居家養老聯合研究"
        },
        "sort": [
          1568995188633
        ]
      },
      {
        "_index": "test_news",
        "_type": "_doc",
        "_id": "45a88261c9975aa6e0eb996c369c32de",
        "_score": null,
        "_source": {
          "releaseTime": "2019-09-20 23:59:48",
          "title": "嶺南大學與五邑大學將開展居家養老聯合研究-新華網"
        },
        "sort": [
          1568995185201
        ]
      }
    ]
  }

接下來用第二條數據的sort值 放到search_after中再次查詢:

{
  "query": {
    "range": {
      "releaseTime": {
        "gte": "2019-09-20 00:00:00",
        "lte": "2019-09-21 00:00:00"
      }
    }
  },
  "search_after":[ 1568995188633],
  "_source": ["title","releaseTime"],
  "sort": [
    {
      "releaseTimestamp": {
        "order": "desc"
      }
    }
  ],
  "size": 5
}

結果會得到上次查詢的第二條之后的數據:

 "hits": {
    "total": 3,
    "max_score": null,
    "hits": [
      {
        "_index": "test_news",
        "_type": "_doc",
        "_id": "45a88261c9975aa6e0eb996c369c32de",
        "_score": null,
        "_source": {
          "releaseTime": "2019-09-20 23:59:48",
          "title": "嶺南大學與五邑大學將開展居家養老聯合研究-新華網"
        },
        "sort": [
          1568995185201
        ]
      }
    ]
  }

如果是多個字段排序的話,search_after值的順序要與我們排序條件的順序一致
還有使用search_after時 from設置為0,-1或者直接不加from
使用search_after 進行分頁 相比from&size的方式要更加高效,而且在不斷有新數據入庫的時候僅僅使用from和size分頁會有重復的情況
相比使用scroll分頁,search_after可以進行實時的查詢
不過search_after不適合跳躍式的分頁


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM