Elasticsearch 聚合使用

Elasticsearch 聚合使用,第1张

Elasticsearch 聚合使用

文章目录
  • Elasticsearch 聚合使用
    • 前言
    • 聚合使用
            • 指标聚合
            • 统计字段有值的数据总数
            • cardinality 去重计数
            • stats 统计
            • Extended stats 统计
            • percentile_ranks
            • 桶 聚合
            • having 过滤

Elasticsearch 聚合使用

es入门使用
es索引使用
es分词使用

前言

通常在业务开发中我们需要统计报表或对一些数据进行统计,在关系型数据库中我们通常使用sql 如max min sum count group by 等配合使用进行数据统计,也可能在业务代码中进行一些数据计算,那么在es中是如何使用的呢?

聚合使用

聚合分析是es中比较重要的功能特性,完成对一个查询数据集中数据的聚合计算,如:需要找出某个字段的最大值,最小值,平均值,计算综合,平均值等。同样的es作为搜索引擎兼数据库,也提供了强大的聚合分析功能。

对于一个数据集求平均值,求和,最大,最小等指标聚合,在es中被称为指标聚合metric,在关系db中还可以使用group by进行分组计算,同样es中group by被称为桶聚合 Bucketing

聚合语法

指标聚合

如min max avg sum

# 聚合查询
POST /elasticsearch_test/_search
{
  "size": 0, 
  "aggs": {
    "max_price": {
      "max": {
        "field": "price"
      }
    },
    "min_pice":{
       "avg": {
        "field": "price"
      }
    },
    "sum_price":{
      "sum": {
        "field": "price"
      }
    },
        "avg_price":{
      "avg": {
        "field": "price"
      }
    }
  }
}

结果如下

统计行数


# 统计行数  统计price 大于等于6的数据
POST /elasticsearch_test/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 6
      }
    }
  }
}

如下图 符合条件的3条数据

统计字段有值的数据总数
# 统计字段有值的数据总数
POST /elasticsearch_test/_search
{
  "aggs": {
    "price_count": {
      "value_count": {
        "field": "price"
      }
    }
  }
}

这里有7条数据


实际上price价格相同的数据存在好几条,sql中我们使用 disctinct 和 group by 可以去重,es中我们可以使用cardinality 去重计数

cardinality 去重计数
# cardinality 去重计数
POST /elasticsearch_test/_search
{
  "aggs": {
    "id_count": {
      "cardinality": {
        "field": "_id"
      }
    },
     "price_count": {
      "cardinality": {
        "field": "price"
      }
    }
  }
}

去重后的数据

stats 统计

统计 avg max min sum count 这五个统计

# stats 统计 avg max min sum count 这五个统计

POST /elasticsearch_test/_search
{
  "aggs": {
    "price_stats": {
      "stats": {
        "field": "price"
      }
    }
  }
}

可以看到不需要额外的每个max min sum count avg 都写一遍 ,直接全部统计出来

Extended stats 统计

Extended stats 统计 比 stats多 平方和 方差 标准差 平均值加/减两个标准差的区间

# Extended stats 统计 比 stats多 平方和 方差 标准差 平均值加/减两个标准差的区间
POST /elasticsearch_test/_search
{
  "aggs": {
    "price_stats": {
      "extended_stats": {
        "field": "price"
      }
    }
  }
}


可以看到这个统计更详细,不过我们最常用上面五个就可以了

percents 指定分位值

# 占比百分比对应的统计值  percents 指定分位值  占比百分位对应值的统计
POST /elasticsearch_test/_search
{
  "aggs": {
    "price_stats": {
      "percentiles": {
        "field": "price",
      
        "percents": [
          0,
          5,
          90,
          100
        ]
      }
    }
  }
}

percentile_ranks

统计值小于等于指定值的文档占比

# percentile_ranks 统计值小于等于指定值的文档占比
POST /elasticsearch_test/_search
{
  "aggs": {
    "price_aggs": {
      "percentile_ranks": {
        "field": "price",
        "values": [
          0,
          5,
          5.6,
          10,
          15,
          900,
          990
        ]
      }
    }
  }
}


桶 聚合

桶 聚合 相当于sql中的group by 统计

# 桶 聚合 相当于sql中的group by 统计

POST /elasticsearch_test/_search 
{
  "aggs": {
    "group_by_price": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 10
          },
           {
            "from": 10,
            "to": 90
          }
          ,
           {
            "from": 90,
            "to": 100
          },
           {
            "from": 100,
            "to": 1000
          }
        ]
      },
      "aggs": {
        "price_aggs": {
          "max": {
            "field": "price"
          }
        },
        "avg_price": {
          "avg": {
            "field": "price"
          }
        },
        "count_price":{
          "value_count": {
            "field": "price"
          }
        }
      }
    }
    
  }
}

这里可以看到不同价格区间里的数据统计

"aggregations" : {
    "group_by_price" : {
      "buckets" : [
        {
          "key" : "0.0-10.0",
          "from" : 0.0,
          "to" : 10.0,
          "doc_count" : 4,
          "count_price" : {
            "value" : 4
          },
          "price_aggs" : {
            "value" : 5.599999904632568
          },
          "avg_price" : {
            "value" : 5.599999904632568
          }
        },
        {
          "key" : "10.0-90.0",
          "from" : 10.0,
          "to" : 90.0,
          "doc_count" : 0,
          "count_price" : {
            "value" : 0
          },
          "price_aggs" : {
            "value" : null
          },
          "avg_price" : {
            "value" : null
          }
        },
        {
          "key" : "90.0-100.0",
          "from" : 90.0,
          "to" : 100.0,
          "doc_count" : 0,
          "count_price" : {
            "value" : 0
          },
          "price_aggs" : {
            "value" : null
          },
          "avg_price" : {
            "value" : null
          }
        },
        {
          "key" : "100.0-1000.0",
          "from" : 100.0,
          "to" : 1000.0,
          "doc_count" : 3,
          "count_price" : {
            "value" : 3
          },
          "price_aggs" : {
            "value" : 990.0
          },
          "avg_price" : {
            "value" : 396.6666666666667
          }
        }
      ]
    }
  }
}

having 过滤
# having 过滤 
# bucket_selector: 过滤条件字段 script:写过滤逻辑 
POST /elasticsearch_test/_search 
{
  "aggs": {
    "group_by_price": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 10
          },
           {
            "from": 10,
            "to": 90
          }
          ,
           {
            "from": 90,
            "to": 100
          },
           {
            "from": 100,
            "to": 1000
          }
        ]
      },
      "aggs": {
        "price_aggs": {
          "max": {
            "field": "price"
          }
        },
        "avg_price": {
          "avg": {
            "field": "price"
          }
        },
        "count_price":{
          "value_count": {
            "field": "price"
          }
        },
      
        "having":{
          "bucket_selector": {
            "buckets_path": {
              "avg_price": "avg_price"
            },
            "script": "params.avg_price > 6"
            
          }
        }
      }
    }
    
  }
}



这里我们分组统计后 最后使用having过滤平均价格大于6的数据

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5696229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存