Elasticsearch 深度分頁 search_after


Version: 7.11

默認情況下 from 與size 的參數組合無法獲取超過 10,000 的數據. 此限制是由 index.max_result_window 設置的保護措施。
搜索請求通常是覆蓋多個分片, 使用 from 與 size 進行分頁, 每個分片需要加載符合條件的頁以及之前所有頁的數據到內存中,
這樣會明顯的增加內存以及 CPU 的使用. 所以應避免使用 from 和 size 去深度分頁或者一次請求大量的數據.

深度分頁可以使用 search_after 參數來實現, search_after 是使用上一頁中的一組 sort 值來檢索下一頁的.

官方文檔 Paginate search results

FieldSortBuilder timeOrder = new FieldSortBuilder(CRATE_TIME).order(SortOrder.DESC);
// 使用 es 內置的 _id 作為二級排序字段, _id 具有唯一性.
FieldSortBuilder idOrder = new FieldSortBuilder("_id").order(SortOrder.DESC);
List<SortBuilder<FieldSortBuilder>> sorts = Arrays.asList(timeOrder, idOrder);

Object[] searchAfter = null;
boolean isLastPage = false;
List<SearchHit> hitList = new ArrayList<>();
do {
    SearchResponse searchResponse = template.opsForQuery()
        .search(INDEX_NAME, boolQueryBuilder, null, null, sorts, searchAfter, 1000);
    SearchHit[] hits = searchResponse.getHits().getHits();
    int length = hits.length;
    if (length > 0) {
        hitList.addAll(Arrays.asList(hits));
        SearchHit hit = hits[length - 1]; // 獲取最后一條記錄, 並把 sort 的值賦值給 searchAfter
        searchAfter = hit.getSortValues();
    } else {
        isLastPage = true;
    }
} while (!isLastPage);

 

點擊鏈接加入群聊【互聯網技術交流群】:282575808


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM