三种分页方式
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;
}