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