测试es from size error,from + size must be less than or equal to: [10000]异常问题

清疚 2023-02-12 04:28 133阅读 0赞

测试案例

1,查询第三页每页3334

{
“page”:3,
“size”:3334
}

2,查询第一页,每页100001

{
“page”:1,
“size”:100001
}

3,查询第26页,每页200条

{
“page”:26,
“size”:200
}

以上查询都会报异常。

控制方案

如何控制发生异常,常见如

控制每页数量不大于10000,但是如情况1,3还是会发生异常。

1,可能会问,es默认最大查询量10000,每页小于10000啊。但是es分页,会首先取到所有数据,再分页

总量3*3334和26*200,总量都大于10000,所以异常。

2,虽然实际情况每页不会3334这么大,会像第3种,每页会查询200,然后前端对20条数据再次分页,当翻页总量大于200,后台es才会查询下一页。实际的操作也不会翻这么多页(前端分页200/size*26)。但是还是存在异常的可能性。以上两种只是控制

每页数据量10000以内,不能避免发生异常的可能性。

3,控制查询总量,有没有意义,比如我只限制查询总量5000条或者10000条

我觉得没意义,首先比如查询到100万条数据,返回总量肯定100万,你告诉查询5000条或者10000条肯定是错的;其次你也没法保证查询的总量是5000或1万。

推荐:使用search_after进行分页,参考:

https://mp.csdn.net/console/editor/html/106314361

https://blog.csdn.net/zzh920625/article/details/84593590

代码如下

  1. @Override
  2. public Rpage<ResShopProductExtensionInfoDataVO> selectList(ReqShopProductExtensionInfoSearchVO req) {
  3. try {
  4. SearchRequest searchRequest = new SearchRequest(EsOperateTables.SHOP_PRODUCT_EXTENSION_INFO.getAlias());
  5. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  6. List<String> fields = Arrays.stream(ResShopProductExtensionInfoVO.class.getDeclaredFields())
  7. /*将类属性名转为es中带下划线的字段名*/
  8. .map(field -> BizStringUtils.humpToLine(field.getName()))
  9. .collect(Collectors.toList());
  10. sourceBuilder.fetchSource(fields.toArray(new String[fields.size()]), null);
  11. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  12. ShopProductExtensionInfoConverter.setSomeCondition(req, sourceBuilder, boolQueryBuilder);
  13. sourceBuilder.size(req.getSize() > 10000 ? 10000 : req.getSize());
  14. sourceBuilder.from((req.getPage() - 1) * req.getSize());
  15. searchRequest.source(sourceBuilder);
  16. log.info("terms查询DSL语句:" + searchRequest.toString());
  17. SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  18. long totalHits = 0L;
  19. if (searchResponse != null) {
  20. totalHits = searchResponse.getHits().getTotalHits();
  21. }
  22. long maxCount = new Long(ConstantsUtils.QueryPartams.MAX_RESULT_COUNT).intValue();//100000
  23. long totalCount = totalHits;
  24. totalHits = totalHits <= maxCount ? totalHits : maxCount;
  25. List<Map<String, Object>> mapList = Lists.newArrayListWithCapacity(searchResponse.getHits().getHits().length);//每页200实际查询的量
  26. Arrays.stream(searchResponse.getHits().getHits()).forEach(hit -> mapList.add(hit.getSourceAsMap()));
  27. YhPageBase page = new YhPageBase(mapList, totalHits, req.getSize().longValue(), req.getPage().longValue());
  28. List<ResShopProductExtensionInfoVO> resList = new ArrayList<>();
  29. if (CollectionUtils.isNotEmpty(page.getList())) {
  30. resList = JSONObject.parseArray(JSONObject.toJSONString(page.getList()), ResShopProductExtensionInfoVO.class);
  31. }
  32. Page rpage = new Page();
  33. rpage.setTotalNum((int) totalCount);//总量
  34. rpage.setPageSize(req.getSize());
  35. rpage.setPageNo(req.getPage());
  36. rpage.setResult(adapter(resList, req));//每页实际查询量
  37. return Rpage.success(rpage);
  38. } catch (Exception e) {
  39. log.error("查询出单方式配置es信息出错", e);
  40. }
  41. return Rpage.success(new Page<>());
  42. }

发表评论

表情:
评论列表 (有 0 条评论,133人围观)

还没有评论,来说两句吧...

相关阅读