search_after 分頁的方式和 from - size 分頁 相似;search_after 能夠實時性更好,能根據文檔更新獲取最新的數據
在from-size 的基礎上 添加 “sort” 將from 去掉
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"sort": [
{"_id": "desc"}
]
}
然後再第二次查詢的時候 添加 search_after 值爲上一次查詢出來最後一條數據的doc_id
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"search_after": [ "654323"],
"sort": [
{"_id": "desc"}
]
}
轉換爲Java 代碼(第一次查詢)
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.searchSource();
BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
BoolQueryBuilder keyQueryBuilder = new BoolQueryBuilder();
keyQueryBuilder.should(QueryBuilders.termQuery("name", "123"));
searchSourceBuilder.query(queryBuilder);
searchSourceBuilder.size(10);
searchSourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.ASC));
SearchRequest request = new SearchRequest();
request.indices("index").types("type").source(searchSourceBuilder);
SearchResponse sr = client.search(request);
SearchHits hits = sr.getHits();
後面查詢,searchSourceBuilder.searchAfter(sortValues) 這個裏面的值是上一次查詢出來的數據最後面一條的getSortValues()值
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.searchSource();
BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
BoolQueryBuilder keyQueryBuilder= new BoolQueryBuilder();
keyQueryBuilder.should(QueryBuilders.termQuery("name", "123"));
searchSourceBuilder.query(queryBuilder);
searchSourceBuilder.size(10);
searchSourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.ASC));
if(hits != null && hits.getHits().length == 10){
Object[] sortValues= hits.getHits()[hits.getHits().length-1].getSortValues();
searchSourceBuilder.searchAfter(sortValues);
}
SearchRequest request = new SearchRequest();
request.indices("index").types("type").source(searchSourceBuilder);
SearchResponse sr = client.search(request);
SearchHits hits = sr.getHits();
發現一篇寫的好的文章https://blog.csdn.net/qq_40337206/article/details/94601978