注意:
- es版本至少6.1以上
先看一下es存儲的數據情況,我們需要通過pid去重並且實現分頁

先貼出Es的代碼
{
// 這里是對hits的數據進行限制只返回一條數據,因為我不要這里的數據,所以避免數據過多就直接返回最小
"from":0,
"size":1,
"query":{
"match_all":{
"boost":1
}
},
"aggregations":{
"agg":{
"terms":{
"field":"pid",
//這里代表聚合查詢出多少條數據,注意這里的size要比最下面分頁的size要大,因為是對聚合后的數據分頁,如果不寫的話默認是10
"size":10
},
"aggregations":{
"top":{
"top_hits":{
"from":0,
// 這里的size表示重復的返回幾條,這里我們返回1
"size":1,
"version":false,
"seq_no_primary_term":false,
"explain":false,
"_source":{
"includes":[
// 這個是需要返回的字段
"pid"
],
"excludes":[
]
}
}
},
"bucket_field":{
"bucket_sort":{
"sort":[
],
// 這里是聚合分頁從第幾頁開始,每頁多少條(舉個列子第一頁(0,10),第二頁就是(10,20))
"from":0,
"size":10
}
}
}
}
}
}
Java 代碼
//構造查詢器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//查詢條件查詢所有
QueryBuilder queryBuilders = QueryBuilders.matchAllQuery();
// 需要返回字段的集合
String[] param= {"pid"};
// 對需要返回的數據包括哪些,不包括哪些,重復的只返回1條
TopHitsAggregationBuilder top1 = AggregationBuilders.topHits("top").fetchSource(param, Strings.EMPTY_ARRAY).size(1);
// 通過pid聚合並且聚合后返回10條數據,注意這里的size(這里代表聚合查詢出多少條數據,注意這里的size要比最下面分頁的size要大,因為是對聚合后的數據分頁,如果不寫的話默認是10)
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("agg").field("pid").subAggregation(top1).size(10);
// 聚合分頁
termsAggregationBuilder.subAggregation(new BucketSortPipelineAggregationBuilder("bucket_field",null).from(0).size(10));
// 這里的.from(0).size(1) 表示最外層hits返回的數據
searchSourceBuilder.query(queryBuilders).aggregation(termsAggregationBuilder).from(0).size(1);
//解析返回的數據
SearchResponse response = getSearchResponse(searchSourceBuilder);
Terms agg = response.getAggregations().get("agg");
for (Terms.Bucket bucket : agg.getBuckets()) {
TopHits top = bucket.getAggregations().get("top");
for (SearchHit searchHit : top.getHits()) {
System.out.println(searchHit.getSourceAsMap());
}
}
// 執行查詢並且返回response
private SearchResponse getSearchResponse(SearchSourceBuilder searchSourceBuilder) {
// 注入自己的es進行查詢
SearchResponse response = esTemplate.query("distinct_test_es","dgg_doc", searchSourceBuilder);
return response;
}
最后結果為已去重,並且可以分頁

