三種分頁方式
1,from size
2,scroll分頁
可參考:https://blog.csdn.net/zzh920625/article/details/84593590
對比
使用search_after 進行分頁 相比from&size的方式要更加高效,而且在不斷有新數據入庫的時候僅僅使用from和size分頁會有重複的情況
相比使用scroll分頁,search_after可以進行實時的查詢
不過search_after不適合跳躍式的分頁
注意事項
1,類似mysql limit offset size,進行分頁查詢時,取上一頁最後一條數據的id;
2,如果是多個字段排序的話,search_after值的順序要與我們排序條件的順序一致,此處ID倒序
3,使用search_after時 from設置爲0,-1或者直接不加from
請求參數
{
"purchaseOrgCodes":[
"P001"
],
"page":3,
"size":200,
"scrollId":"W0M3_534206"
}
代碼如下
private SearchRequest buildSearchRequest(EsSchemel esSchemel, QueryBuilder params, int pageSize, String orderBy, String scrollId) {
if (pageSize > 10000) {
//fixed:es error,from + size must be less than or equal to: [10000]
pageSize = 10000;
}
SearchRequest searchRequest = new SearchRequest(esSchemel.getIndex());
searchRequest.types(esSchemel.getType());
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(params);
//sourceBuilder.from(pageNo - 1);
sourceBuilder.size(pageSize);
sourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS));
if (esSchemel.getSelectCols() != null && esSchemel.getSelectCols().length > 0) {
//性能參數,減少io
sourceBuilder.fetchSource(esSchemel.getSelectCols(), EXCLUDEFIELDS);
}
if (!Strings.isNullOrEmpty(orderBy)) {
sourceBuilder.sort(new FieldSortBuilder(orderBy).order(SortOrder.DESC));
if (!Strings.isNullOrEmpty(scrollId)) {
sourceBuilder.searchAfter(new Object[]{scrollId});
}
}
searchRequest.source(sourceBuilder);
return searchRequest;
}