es聚合入门

目录

聚合的分类

DSL实现Bucket聚合

DSL实现Metric聚合

RestClient实现聚合


聚合的分类

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

es聚合入门_第1张图片

 参与聚合的字段类型必须是:keyword、数值、日期、布尔

DSL实现Bucket聚合

修改排序方式

默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序例:

GET /hotel/_search
{
  "size": 0, //设置size为0,不查看文档,只看聚合结果
  "aggs": { //定义聚合
    "brandAgg": { //给聚合起个名字
      "terms": { //聚合的类型,terms:按照字段值聚合
        "field": "字段名", //参与聚合的字段
        "order": {
          "_count": "asc" //按照_count字段升序排序
        },
        "size": 20 // 获取聚合结果的数量
      }
    }
  }
}

限定聚合范围

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

只对price值在100~200之间的做聚合,例:

GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 200
      }
    }
  },
  "aggs": { //定义聚合
    "brandAgg": { //给聚合起个名字
      "terms": { //聚合的类型,terms:按照字段值聚合
        "field": "字段名", //参与聚合的字段
        "order": {
          "_count": "asc" //按照_count字段升序排序
        },
        "size": 20 // 获取聚合结果的数量
      }
    }
  }
}

DSL实现Metric聚合

GET /hotel/_search
{
  "size": 0, 
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "聚合字段名",
        "order": {
          "scoreAgg.avg": "desc" //按照scoreAgg聚合的avg排序
        }, 
        "size": 20
      },
      "aggs": { //子聚合
        "scoreAgg": { //聚合名称
          "stats": { // 聚合类型stats同时包含min,max,avg,sum等
            "field": "聚合字段名"
          }
        }
      }
    }
  }
}

RestClient实现聚合

java的RestClient与DSL对应关系

es聚合入门_第2张图片

 RestClient聚合结果解析

es聚合入门_第3张图片

 

/**
     * 聚合功能,自定义排序
     */
    @Test
    void aggsOrdertest() throws IOException {
        SearchRequest request  = new SearchRequest("hotel");
        request.source()
                .size(0)//文档数量
                .aggregation(AggregationBuilders
                        .terms("brandAgg")//聚合名称
                        .field("brand")//字段
                        .size(10)//聚合结果数量
                );
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析agg结果
        Aggregations aggregations = response.getAggregations();
        //获取名为brandAgg的聚合结果
        Terms terms = aggregations.get("brandAgg");
        //获取buckets
        List buckets = terms.getBuckets();
        //遍历每一个buckets
        for (Terms.Bucket bucket:buckets) {
            String key = bucket.getKeyAsString();//获取key
            long docCount = bucket.getDocCount();//获取doc_count
            System.out.println(key+"--------"+docCount);
        }
    }

你可能感兴趣的:(elasticsearch,大数据,搜索引擎)