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;
    }

 

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