彻底解决ES 数据查询 from + size must be less than or equal to:xxx 问题

这篇具有很好参考价值的文章主要介绍了彻底解决ES 数据查询 from + size must be less than or equal to:xxx 问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ES分页查询时出现超过一万页就爆出这个错误:Result window is too large, from + size must be less than or equal to: [10000] but…
该错误是由于es默认设置最大页数为一万的原因导致的,这样设置也是为了防止OOM。
第一种解决方式:
防止这个错误出现是设置 index.max_result_window的值。但是这种设置对CPU和内存的消耗会非常巨大,不太建议。


PUT { 索引名 }/_settings
{
  "index":{
      "max_result_window":{ 你想要的from+size最大值 }
  }
}

第二种解决方式:
是使用es查询的深分页,使用的是scroll ,但是官方已经不再推荐采用Scroll API进行深度分页,下面说第三种
第三种解决方式:
这种方式适用查询分页超过10000页的数据查询,就是使用search_after 。
这种方式有一个缺点就是,因为点击查询下一页数的时候需要前一页的最后一条数据的唯一排序值。但是别怕,下面代码就已解决。
下面直接展示代码示例(很全,很简单):

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
SearchRequest request = new SearchRequest(EsIndex.ceshi);   //这里就是请求你的es索引
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
Integer pageNum = Integer.valueOf(param.get("pageNum").toString());
//下面需要判断前端传过来的页数是否是第一页
//如果不是第一个,那我们需要先将当前页的前一页的数据查出来,并且拿到前一页数据的最后一条数据的唯一排序值。这里我们拿ceshi索引库中的ID作为唯一排序进行查询。
if(pageNum!=1){
            SearchSourceBuilder sourceBuilder1 = new SearchSourceBuilder();
            sourceBuilder1.query(boolQueryBuilder).sort("ID.keyword",SortOrder.DESC);
			//此处减2就是获取当前页的前一页,减1就是当前页,因为from的值需要从0开始            
			sourceBuilder1.from((Integer.valueOf(param.get("pageNum").toString()) - 2) * Integer.valueOf(param.get("pageSize").toString())).size(Integer.valueOf(param.get("pageSize").toString()));
            sourceBuilder1.trackTotalHits(true);
            SearchRequest request1 = new SearchRequest(EsIndex.ceshi);
            request1.source(sourceBuilder1);
            //去查询
            SearchResponse searchResponse1 = restHighLevelClient.search(request1, RequestOptions.DEFAULT); 
            //拿到前一页最后一个数据的ID值   
            SearchHit[] hits1 = searchResponse1.getHits().getHits();
            Object[] sortValues1 = hits1[hits1.length - 1].getSortValues();
            //再拿这个ID值进行searchAfter,查询下一页数据
            sourceBuilder.query(boolQueryBuilder).sort("ID.keyword",SortOrder.DESC).searchAfter(sortValues1);
        }
        sourceBuilder.from(0).size(15);
        sourceBuilder.trackTotalHits(true);  //设置返回数据条数可以大于10000条
        request.source(sourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        SearchHit[] hits = searchResponse.getHits().getHits();

2023-05-06更新
其实这种方式也是有问题,还是需要设置max_result_window,因为使用searchAfter就必须有上一页排序后的最后一条数据的唯一值,目前暂时没有想到解决方法,欢迎评论~文章来源地址https://www.toymoban.com/news/detail-628853.html

到了这里,关于彻底解决ES 数据查询 from + size must be less than or equal to:xxx 问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • elasticSearch大量数据查询导出报错解决es

    elasticsearch的client包下的HeapBufferedAsyncResponseConsumer类中传入了bufferLimit,该值 org.apache.http.nio.protocol.HttpAsyncResponseConsumer 的默认实现。在堆内存中缓冲整个响应内容,这意味着缓冲区的大小等于响应的内容长度。根据可配置的参数限制可以读取的响应的大小。如果实体长于配置

    2023年04月16日
    浏览(33)
  • 精通ES+ES大数据查询常见的疑难杂症的解决与实现

    目录  什么是BoolQueryBuilder? 简单的复合查询 RestHighLevelClient中的matchQuery与matchPhraseQuery与termQuery的在实际使用中的不同 ES是否能在类型为text的字段的内部使用keyword,如果能这样做的含义是什么? 什么是ES多字段? ES怎么实现聚合查询? RestHighLevelClient的subAggregation是什么?干什

    2024年02月07日
    浏览(27)
  • Java操作es插入数据后,立即查询没结果解决办法

    原因:ES默认不执行刷新操作,需要手动设置参数才能在更新文档后立即刷新。 从以下源码中可以看出刷新策略有三种: NONE(“false”)、IMMEDIATE(“true”)、WAIT_UNTIL(“wait_for”) 添加位置如下: 官网地址:es批量操作官方文档 注:默认是不进行刷新的,因此需要手动添加进行刷

    2024年02月12日
    浏览(36)
  • ElasticSearch第六讲 ES 三种分页查询from+size / Scroll /search_after

    我的Git地址:https://gitee.com/ITLULU 欢迎访问 ES的分页查询和关系数据库的分页查询的区别: ES分页查询有以下几种: 1:简单的 from size (有默认的最大Size,不可无限大小查询,因为数据过多查询性能会降低,且也要考虑内存问题,以及OS缓存数据的能力) 2: scroll基于查询窗口

    2024年02月01日
    浏览(41)
  • 项目实战:ES的增加数据和查询数据

    最近需要做一个有关查询聊天记录的功能,通过资料了解到使用ES可以方便我们快速查询内容。自己进行ES框架的搭建,感兴趣的可以看博客进行学习:https://blog.csdn.net/weixin_45309155/article/details/132686375?spm=1001.2014.3001.5501 ES搭建好之后就是应用了,下面就先总结一下关于最近在项

    2024年02月07日
    浏览(27)
  • ES根据日期查询数据

    1 实体类写入ES 在写入ES库的时候,日期格式需要转换成ES可以识别的日期格式: 然后写入ES库即可 一般是根据时间区间查询,所以如果有空字段可以设置一个默认值方便查询  2 查询ES数据的时候 ES的一些搜索规则: 参考: JAVA代码实现ElasticSearch搜索(入门-进阶)(一):搜索方

    2024年02月11日
    浏览(37)
  • ES分词字典更新查询不到数据

    存储于es的文档数据将会被分词存储 例如: 当我们通过ik远程扩展词库增加自定义字典 : “ 词的 ”; 已经存在的数据将不会重新分词,例如上面案例中, 已经存在的数据,就不能通过新增的字典 “词的” 查询到 “分词的句子” 这条数据 利用如下命令刷新索引即可 Java

    2024年02月14日
    浏览(24)
  • 迭代器模式 实现ES大量数据查询

    目录 项目需求  要求 普通策略 升级策略:使用迭代器模式 迭代器模式组成 代码实现 查询实体 返回实体 实现类 代码测试 mock的ES返回结果json数据 第一次返回结果 第二次返回结果 第三次返回结果 postMan请求, 控制台打印结果 数据从Mysql 迁移到 Es,  Es查询数据默认fetch Size最

    2024年01月20日
    浏览(29)
  • 使用python在es中基本操作详解(添加索引、查询索引、删除索引、判断索引是否存在、添加数据、更新数据、查询数据)

    示例代码1: 运行结果: 示例代码2: 运行结果: 示例代码3: 运行结果: 注意: 对比上面几种建立索引的方法,是有一定区别的。根据响应结果可以看出: es. indices.create() 方法是标准的创建索引的方法,其它几种方法在创建索引的同时也会生成一条数据,并且生成mappin

    2024年02月11日
    浏览(45)
  • 商城项目-es的海量查询/聚合/数据同步

    1.sql表 用户数据库: tb_user:用户表,其中包含用户的详细信息 tb_address:用户地址表 商品数据库 tb_item:商品表 订单数据库 tb_order:用户订单表 tb_order_detail:订单详情表,主要是订单中包含的商品信息 tb_order_logistics:订单物流表,订单的收货人信息 2.模块搭建 feign-api:是

    2024年01月21日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包