テストes from size error,from+size must be less than or equal to:[1000]異常問題

3682 ワード

テストケース


1,クエリ3ページ目3334
{     "page":3,     "size":3334 }
2、第1ページを問合せ、1ページ当たり100001
{     "page":1,     "size":100001 }
3、第26ページを照会して、1ページごとに200条
{     "page":26,     "size":200 }
以上のクエリは例外を報告します.

せいぎょスキーマ


異常の発生を制御する方法
1ページあたりの数を10000以下に制御しますが、状況1、3で異常が発生します.
1、esのデフォルトの最大クエリー量は10000で、1ページ当たり10000未満でしょう.ただしesページングでは、まずすべてのデータを取得し、ページングします.
総量は3*3334と26*200で、総量はいずれも10000より大きいので異常です.
2,実際には1ページあたり3334ほど大きくはありませんが、3つ目のように1ページあたり200を検索し、フロントエンドで20個のデータを再びページ分けし、ページめくりの総量が200より大きいと、バックグラウンドesは次のページを検索します.実際の操作でもこんなに多くのページをめくることはありません(フロントエンドページング200/size*26).しかし、異常な可能性がある.以上の2つは制御のみです
1ページあたりのデータ量は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

コードは次のとおりです。

 @Override
  public Rpage selectList(ReqShopProductExtensionInfoSearchVO req) {
    try {
      SearchRequest searchRequest = new SearchRequest(EsOperateTables.SHOP_PRODUCT_EXTENSION_INFO.getAlias());
      SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
      List fields = Arrays.stream(ResShopProductExtensionInfoVO.class.getDeclaredFields())
          /* es */
          .map(field -> BizStringUtils.humpToLine(field.getName()))
          .collect(Collectors.toList());
      sourceBuilder.fetchSource(fields.toArray(new String[fields.size()]), null);
      BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
      ShopProductExtensionInfoConverter.setSomeCondition(req, sourceBuilder, boolQueryBuilder);
      sourceBuilder.size(req.getSize() > 10000 ? 10000 : req.getSize());
      sourceBuilder.from((req.getPage() - 1) * req.getSize());
      searchRequest.source(sourceBuilder);
      log.info("terms DSL :" + searchRequest.toString());
      SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
      long totalHits = 0L;
      if (searchResponse != null) {
        totalHits = searchResponse.getHits().getTotalHits();
      }
      long maxCount = new Long(ConstantsUtils.QueryPartams.MAX_RESULT_COUNT).intValue();//100000
      long totalCount = totalHits;
      totalHits = totalHits <= maxCount ? totalHits : maxCount;
      List> mapList = Lists.newArrayListWithCapacity(searchResponse.getHits().getHits().length);// 200 
      Arrays.stream(searchResponse.getHits().getHits()).forEach(hit -> mapList.add(hit.getSourceAsMap()));
      YhPageBase page = new YhPageBase(mapList, totalHits, req.getSize().longValue(), req.getPage().longValue());
      List resList = new ArrayList<>();
      if (CollectionUtils.isNotEmpty(page.getList())) {
        resList = JSONObject.parseArray(JSONObject.toJSONString(page.getList()), ResShopProductExtensionInfoVO.class);
      }
      Page rpage = new Page();
      rpage.setTotalNum((int) totalCount);// 
      rpage.setPageSize(req.getSize());
      rpage.setPageNo(req.getPage());
      rpage.setResult(adapter(resList, req));// 
      return Rpage.success(rpage);
    } catch (Exception e) {
      log.error(" es ", e);
    }
    return Rpage.success(new Page<>());
  }