elasticsearch aggs 嵌套查询 多个select 统计/聚合部分查询结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch aggs 嵌套查询 多个select 统计/聚合部分查询结果相关的知识,希望对你有一定的参考价值。

elasticsearch5.5.2,win7系统
查询返回的结果太多,只想对其中的一部分数据进行统计,转化成SQL,大概是:
select distinct(A.col_num) from (select * from table_name limit 100) A group by col_num;
简单来说,就是限制查询返回的结果,再进行统计。
求答复

参考技术A SearchRequestBuilder srb = client.prepareSearch(indexName)
.setTypes(typeName)
.setSearchType(SearchType.QUERY_THEN_FETCH);
...
TermsBuilder field1Terms = AggregationBuilders.terms("group_by_field1").field("field1").size(0);
SumBuilder field2Sum = AggregationBuilders.sum("sum_field2").field("field2");
SumBuilder field3Sum = AggregationBuilders.sum("sum_field3").field("field3");
field1Terms.subAggregation(field2Sum ).subAggregation(field3Sum );
...
srb.addAggregation(pIdTerms);
...
SearchResponse sr = srb.execute().actionGet();
...本回答被提问者采纳

elasticsearch 的基本查询语法使用(下)

1.聚合查询


        聚合(aggs)不同于普通查询,是目前学到的第二种大的查询分类,第一种即“query”,因此在代码中的第一层嵌套由“query”变为了“aggs”。用于进行聚合的字段必须是exact value,分词字段不可进行聚合,对于text字段如果需要使用聚合,需要开启fielddata,但是通常不建议,因为fielddata是将聚合使用的数据结构由磁盘(doc_values)变为了堆内存(field_data),大数据的聚合操作很容易导致OOM,详细原理有时间再写。

       1.2聚合分类

        1.2.1 分桶聚合(Bucket agregations):类比SQL中的group by的作用,主要用于统计不同类型数据的数量.

        1.2.2 指标聚合(Metrics agregations):主要用于最大值、最小值、平均值、字段之和等指标的统计

        1.2.3 管道聚合(Pipeline agregations):用于对聚合的结果进行二次聚合,如要统计绑定数量最多的标签bucket,就是要先按照标签进行分桶,再在分桶的结果上计算最大值。

        语法展示

#当前版本为7.15,输入aggs后可能有不同的提示
GET /zzl/_search

  "aggs": 
    "NAME":  #这个是你随便起的,就和mysql的Aliases 那个一样
      "AGG_TYPE":  # 聚合查询的类型
    
  

        分桶聚合展示

#聚合查询 桶查询
GET /zzl/_search

  "_source": false, 
  "aggs": 
    "price_aggs": 
      "terms": 
        "field": "price",
        "size": 10
      
    
  

        查询结果展示

  "aggregations" : 
    "price_aggs" : 
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        
          "key" : 9999,
          "doc_count" : 7
        ,
        
          "key" : 3999,
          "doc_count" : 1
        ,
        
          "key" : 4999,
          "doc_count" : 1
        ,
        
          "key" : 6999,
          "doc_count" : 1
        
      ]
    
  

可以看出来 ,一共被装进四个桶里面,就和mysql的group by 差不多

        使用场景

        场景:用于统计不同种类的文档的数量,可进行嵌套统计。

        函数:terms

        注意:聚合字段必须是exact value,如keyword 如果是text类型会报错 这里展示一下错误信息 

 "error" : 
    "root_cause" : [
      
        "type" : "illegal_argument_exception",
        "reason" : "Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [name] in order to load field data by uninverting the inverted index. Note that this can use significant memory."

        指标聚合展示

GET /zzl/_search

  "_source": false, 
  "aggs": 
    "price_aggs": 
      "avg": 
        "field": "price"
      
    
  

        结果展示

  "aggregations" : 
    "price_aggs" : 
      "value" : 8599.0
    
  

        使用场景

        场景:用于统计某个指标,如最大值、最小值、平均值,可以结合桶聚合一起使用,如按照商品类型分桶,统计每个桶的平均价格。

        函数:平均值:Avg、最大值:Max、最小值:Min、求和:Sum、详细信息:Stats、数量:Value count

        管道聚合

        场景:用于对聚合查询的二次聚合,如统计平均价格最低的商品分类,即先按照商品分类进行桶聚合,并计算其平均价格,然后对其平均价格计算最小值聚合

        函数:Min bucket:最小桶、Max bucket:最大桶、Avg bucket:桶平均值、Sum bucket:桶求和、Stats bucket:桶信息

        注意:buckets_path为管道聚合的关键字,其值从当前聚合统计的聚合函数开始计算为第一级

        // todo 等整理了批量查询的笔记再把这边添加上,当前索引下的类型几乎是text,不太方便

      嵌套聚合

        

以上是关于elasticsearch aggs 嵌套查询 多个select 统计/聚合部分查询结果的主要内容,如果未能解决你的问题,请参考以下文章

elasticsearch 的基本查询语法使用(下)

Elasticsearch聚合的嵌套桶如何排序

Elasticsearch - 计算嵌套聚合相对于父存储桶的百分比

从 NEST C# 嵌套聚合中获取 Elasticsearch 结果

ElasticSearch聚合aggs入门

嵌套聚合Elasticsearch中的条件路径