テスト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