Elasticsearch 深度分页 search_after
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
标签:
Elasticsearch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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