微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐