ES 實現聚合分頁


注意:

  • 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;
}


最后結果為已去重,並且可以分頁


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM