赞
踩
补充:
对响应速度更有追求的,可以使用after进行滚动查询,当然就是处理起来麻烦一点,每次请求都要带上上一页的最后一条数据,且只能向后滚动。我的解决方案是:前端每次点击下一页时,有一个数组下标,会存储这个下一页的最后一条数据,当然第一页为空,如果搜索条件或者每页数量变了,都会清空这个数组,从第一页重新查询。
ES语句如下:
{ "query": { "bool": { "must": [ { "match": { "supplierNo": "C2217" } }, { "match": { "companyCode": "10101" } } ] } }, //设置为0代表只需要聚合的结果 "size": 0, "track_total_hits": false, "aggs": { "my_buckets": { "composite": { //存上一个位置游标,查找下一页,如果往前翻页,前端给after,每次翻页,前端存一个after数组,下标对应页数 // "after": { // "erpGoodsId": "P100009", // "batchNum": "2201055103" // }, "size": 2, "sources": [ { "erpGoodsId": { "terms": { "field": "erpGoodsId", "order": "asc" } } }, { "batchNum": { "terms": { "field": "batchNum", "order": "asc" } } }, { "wmsProductCode": { "terms": { "field": "wmsProductCode", //为空以null展示 "missing": "null", "order": "asc" } } } ] }, "aggs": { "filter_empty_dest": { "bucket_selector": { "buckets_path": { "count": "_count" }, "script": "params.count != null" } } } } } }
java代码语句如下:
里只是完成分组查询,没有进行手动分页
@Override public List<PageSupplierSaleFlowVo> pageSupplierSaleFlowIndex(PageSupplierSaleFlowRequest request) { List<PageSupplierSaleFlowVo> result = new ArrayList<>(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //销售客户 if(StringUtils.isNotBlank(request.getSupplierNo())){ boolQueryBuilder.must(QueryBuilders.matchQuery(SupplierNewFlowIndex.SUPPLIER_NO,request.getSupplierNo())); } //站点 if(StringUtils.isNotBlank(request.getCompanyCode())){ boolQueryBuilder.must(QueryBuilders.matchQuery(SupplierNewFlowIndex.COMPANY_CODE,request.getCompanyCode())); } //商品名称 if(StringUtils.isNotBlank(request.getProductNm())){ boolQueryBuilder.must(QueryBuilders.wildcardQuery(SupplierNewFlowIndex.PRODUCT_NM,"*"+request.getProductNm()+"*")); } //生产厂家 if(StringUtils.isNotBlank(request.getFactory())){ boolQueryBuilder.must(QueryBuilders.matchQuery(SupplierNewFlowIndex.FACTORY,request.getFactory())); } //商品批号 if(StringUtils.isNotBlank(request.getBatchNum())){ boolQueryBuilder.must(QueryBuilders.wildcardQuery(SupplierNewFlowIndex.BATCH_NUM,"*"+request.getBatchNum()+"*")); } //路单ID if(StringUtils.isNotBlank(request.getWmsWayBillId())){ boolQueryBuilder.must(QueryBuilders.matchQuery(SupplierNewFlowIndex.WMS_WAYBILL_ID,request.getWmsWayBillId())); } //记账时间 if(Objects.nonNull(request.getFlowStartDate())){ boolQueryBuilder.must(QueryBuilders.rangeQuery(SupplierNewFlowIndex.FLOW_DATE).gte(request.getFlowStartDate().getTime())); } if(Objects.nonNull(request.getFlowEndDate())){ boolQueryBuilder.must(QueryBuilders.rangeQuery(SupplierNewFlowIndex.FLOW_DATE).lte(request.getFlowEndDate().getTime())); } //销售类型,只看销售 boolQueryBuilder.must(QueryBuilders.matchQuery(SupplierNewFlowIndex.FLOW_TYPE, SupplierFlowTypeEnum.SALE.toValue())); TermsValuesSourceBuilder erpAgg = new TermsValuesSourceBuilder(SupplierNewFlowIndex.ERP_GOODS_ID).field(SupplierNewFlowIndex.ERP_GOODS_ID).order(SortOrder.ASC); TermsValuesSourceBuilder batchAgg = new TermsValuesSourceBuilder(SupplierNewFlowIndex.BATCH_NUM).field(SupplierNewFlowIndex.BATCH_NUM).order(SortOrder.ASC); TermsValuesSourceBuilder wmsAgg = new TermsValuesSourceBuilder(SupplierNewFlowIndex.WMS_PRODUCT_CODE).field(SupplierNewFlowIndex.WMS_PRODUCT_CODE).missing("null").order(SortOrder.ASC);; List<CompositeValuesSourceBuilder<?>> sources = new ArrayList<>(); sources.add(erpAgg); sources.add(batchAgg); sources.add(wmsAgg); //每次分组最大1000条 CompositeAggregationBuilder compositeAgg = new CompositeAggregationBuilder("my_buckets", sources).size(1000); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(boolQueryBuilder); searchSourceBuilder.size(0); searchSourceBuilder.aggregation(compositeAgg); SearchRequestBuilder searchRequestBuilder = elasticsearchTemplate.getClient().prepareSearch(); searchRequestBuilder.setIndices("supplier_flow_index_new"); searchRequestBuilder.setQuery(boolQueryBuilder); searchRequestBuilder.setSize(0); searchRequestBuilder.setSource(searchSourceBuilder); //发起请求 SearchResponse response = searchRequestBuilder.execute().actionGet(); CompositeAggregation compositeAggResult = response.getAggregations().get("my_buckets"); for (CompositeAggregation.Bucket bucket : compositeAggResult.getBuckets()) { String erpGoodsId = bucket.getKey().get(SupplierNewFlowIndex.ERP_GOODS_ID).toString(); String batchNum = bucket.getKey().get(SupplierNewFlowIndex.BATCH_NUM).toString(); String wmsProductCode = bucket.getKey().get(SupplierNewFlowIndex.WMS_PRODUCT_CODE).toString(); result.add(new PageSupplierSaleFlowVo(erpGoodsId,batchNum,wmsProductCode)); } return result; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。