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

posted @   景岳  阅读(1941)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2020-10-22 elasticsearch--Invalid receiver type interface org.apache.http.Header
点击右上角即可分享
微信分享提示