適用於不斷下一頁這樣的查詢
我這里用的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不適合跳躍式的分頁