分页
请求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()));
}