0
点赞
收藏
分享

微信扫一扫

运维简单面试题

AbrahamW 2023-05-07 阅读 54

聚合的种类

聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类:

桶(Bucket)聚合:用来对文档做分组

      TermAggregation:按照文档字段值分组

       Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等

        Avg:求平均值

        Max:求最大值

        Min:求最小值

        Stats:同时求max、min、avg、sum等

管道(pipeline)聚合:其它聚合的结果为基础做聚合

参与聚合的字段类型必须是:

        keyword

        数值

        日期

        布尔

DSL实现聚合

Bucket聚合

简单聚合

现在,我们要统计所有数据中的酒店品牌有几种,此时可以根据酒店品牌的名称做聚合。 类型为term类型,DSL示例:

结果排序

默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序。 我们可以修改结果排序方式:

限定聚合范围

默认情况下,Bucket聚合是对索引库的所有文档做聚合,我们可以限定要聚合的文档范围,只要添加query条件即可:

aggs代表聚合,与query同级,此时query的作用是?

限定聚合的的文档范围

聚合必须的三要素:

聚合名称 聚合类型 聚合字段

聚合可配置属性有:

size:指定聚合结果数量

order:指定聚合结果排序方式

field:指定聚合字段

Metrics 聚合

例如,我们要求获取每个品牌的用户评分的min、max、avg等值. 我们可以利用stats聚合:

RestAPI实现聚合

    @Test
    void testAggTerm() throws IOException {
        String name="brandAgg";
        SearchRequest request = new SearchRequest("hotel");
        request.source().size(0);
        request.source().aggregation(
                AggregationBuilders
                .terms(name)
                .field("brand")
                .size(20)
        );
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        Aggregations aggregations = response.getAggregations();
        Terms brandTerms = aggregations.get(name);
        List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
        for (Terms.Bucket bucket:buckets){
            String key = bucket.getKeyAsString();
            System.out.println(key);
        }
    }

其中包括组装API和结果解析两部分

举报

相关推荐

0 条评论