分页

请求JSON:

GET oms_sku_shortage_order_index/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "oos": true
                    }
                }
            ]
        }
    },
    "aggs": {
        "by_wog": {
            "terms": {
                "field": "wog.keyword",
                "size": 100000000
            },
            "aggs": {
                "sum_num": {
                    "sum": {
                        "field": "num"
                    }
                },
                "bucket_field": {
                    "bucket_sort": {
                        "sort": [
                            {
                                "sum_num": {
                                    "order": "desc"
                                }
                            }
                        ],
                        "from": 0,
                        "size": 10
                    }
                }
            }
        }
    }
}

Java代码:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
boolBuilder.must(QueryBuilders.matchQuery("oos", true));
if (CollectionUtils.isNotEmpty(pageQueryShortageBO.getWarehouseCodeList())) {
    boolBuilder.must(QueryBuilders.termsQuery("w.keyword", w));
}
if (CollectionUtils.isNotEmpty(pageQueryShortageBO.getOwnerCodeList())) {
    boolBuilder.must(QueryBuilders.termsQuery("o.keyword", o));
}
if (CollectionUtils.isNotEmpty(pageQueryShortageBO.getGoodsCodeList())) {
    boolBuilder.must(QueryBuilders.termsQuery("g.keyword", g));
}
sourceBuilder.query(boolBuilder);

TermsAggregationBuilder aggregation = AggregationBuilders.terms("by_wog").field("wog.keyword").size(100000);
aggregation.subAggregation(AggregationBuilders.sum("sum_num").field("num"));

List<FieldSortBuilder> fieldSorts = new ArrayList<>();
fieldSorts.add(new FieldSortBuilder("sum_num"));
aggregation.subAggregation(new BucketSortPipelineAggregationBuilder("bucket_field", fieldSorts).from((pageQueryShortageBO.getPageNum() - 1) * pageQueryShortageBO.getPageSize()).size(pageQueryShortageBO.getPageSize()));
sourceBuilder.aggregation(aggregation);

SearchRequest searchRequest = new SearchRequest("shortage_index");
searchRequest.types(ESConstants.TYPE);
searchRequest.source(sourceBuilder);
SearchResponse response = null;
try {
    response = client.search(searchRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
    log.error("queryShortageFromES error: {}", e.getMessage(), e);
}

if (response != null) {
    Aggregations aggregations = response.getAggregations();
    Terms byCompanyAggregation = aggregations.get("by_wog");
    List<? extends Terms.Bucket> buckets = byCompanyAggregation.getBuckets();
    for (Terms.Bucket bucket : buckets) {
        Sum sum = bucket.getAggregations().get("sum_num");
        String wog = bucket.getKeyAsString();
        String[] wogArray = wog.split(ESConstants.WOG_SPLIT_FLAG);
        
    }
}

       说明:因为bucket_sort是对聚合之后的桶进行分页排序,所以terms里面的size设置要大于bucket_sort里面分页大小,不然会取不到数据

计算count

请求JSON:

GET oms_sku_shortage_order_index/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "oos": true
        }}
      ]
    }
  },
  "aggs": {
    "by_wog": {
      "cardinality": {
        "field": "wog.keyword"
      }
    }
  }
}

Java代码:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
boolBuilder.must(QueryBuilders.matchQuery("oos", true));
if (CollectionUtils.isNotEmpty(pageQueryShortageBO.getWarehouseCodeList())) {
    boolBuilder.must(QueryBuilders.termsQuery("w.keyword", w));
}
if (CollectionUtils.isNotEmpty(pageQueryShortageBO.getOwnerCodeList())) {
    boolBuilder.must(QueryBuilders.termsQuery("o.keyword", o));
}
if (CollectionUtils.isNotEmpty(pageQueryShortageBO.getGoodsCodeList())) {
    boolBuilder.must(QueryBuilders.termsQuery("g.keyword", g));
}
sourceBuilder.query(boolBuilder);

CardinalityAggregationBuilder aggregation = AggregationBuilders.cardinality("by_wog").field("wog.keyword");
sourceBuilder.aggregation(aggregation);
SearchRequest searchRequest = new SearchRequest("shortage_index");
searchRequest.types(ESConstants.TYPE);
searchRequest.source(sourceBuilder);
SearchResponse response = null;
try {
    response = client.search(searchRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
    log.error("getShortageTotalPage error: {}", e.getMessage(), e);
}

if (response != null) {
    Aggregations aggregations = response.getAggregations();
    Cardinality byCompanyAggregation = aggregations.get("by_wog");
    return Integer.parseInt(String.valueOf(byCompanyAggregation.getValue()));
}