es分页方式search_after

三种分页方式

1,from size

2,scroll分页

3,使用 search_after 进行分页

可参考: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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章