ESAggregation的使用

发布时间:2023-05-18

一、聚合分析的基本概念

聚合(aggregation)是指将多个数据元素或对象汇总成一个单一的集合, 并且对该集合进行分析和操作的过程。 ESAggregation就是Elasticsearch提供的一种聚合分析的功能, 可以让用户在大量数据中轻松实现多种复杂计算和分析。

二、ESAggregation的基本用法

ESAggregation的基本用法可以分为三个步骤:

1、设置聚合条件

{
  "aggs": {
    "genre": {
      "terms": {
        "field": "genre"
      }
    }
  }
}

以上代码表示按照genre字段进行聚合。

2、执行聚合操作

GET /movies/_search
{
  "size": 0,
  "aggs": {
    "genre": {
      "terms": {
        "field": "genre"
      }
    }
  }
}

以上代码表示在movies索引中执行聚合操作,并按照genre字段进行聚合操作。"size": 0表示不返回文档内容。

3、获取聚合结果

{
  "took": 145,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4156,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "genre": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 441,
      "buckets": [
        {
          "key": "Drama",
          "doc_count": 703
        },
        {
          "key": "Comedy",
          "doc_count": 582
        },
        {
          "key": "Action",
          "doc_count": 356
        },
        {
          "key": "Horror",
          "doc_count": 307
        },
        {
          "key": "Science Fiction",
          "doc_count": 290
        }
      ]
    }
  }
}

以上代码表示查询到聚合结果,并显示在返回结果中。buckets对象中存储了各个聚合的结果。

三、ESAggregation的进阶用法

ESAggregation支持多种聚合操作,包括桶聚合(Bucket Aggregations)、度量聚合(Metric Aggregations)、管道聚合(Pipeline Aggregations)等。

1、桶聚合(Bucket Aggregations)

桶聚合是ESAggregation中最基本的聚合方式,常用于分组聚合、嵌套聚合等操作。 下面的示例展示了如何用桶聚合找到每个电影类别中评分最高的10部电影:

{
  "size": 0,
  "aggs": {
    "genres": {
      "terms": {
        "field": "genre",
        "size": 10
      },
      "aggs": {
        "top_movies": {
          "top_hits": {
            "size": 10,
            "_source": {
              "includes": [
                "title",
                "year",
                "rating"
              ]
            },
            "sort": [
              {
                "rating": {
                  "order": "desc"
                }
              }
            ]
          }
        }
      }
    }
  }
}

以上代码表示对movies索引中的数据进行分组聚合,按照genre字段进行分类,并返回每个分类下评分最高的10部电影。结果中包含title、year和rating字段。

2、度量聚合(Metric Aggregations)

度量聚合是对某个字段的值进行统计计算,例如平均值、总和、最大值、最小值、百分比、标准差、方差等。 下面的示例展示了如何用度量聚合计算每个电影类别下的电影平均评分:

{
  "size": 0,
  "aggs": {
    "genres": {
      "terms": {
        "field": "genre"
      },
      "aggs": {
        "avg_rating": {
          "avg": {
            "field": "rating"
          }
        }
      }
    }
  }
}

以上代码表示对movies索引中的数据进行分类,按照genre字段进行聚合,并计算每个分类下的电影评分平均值。结果中包含每个分类的名称和对应的平均值。

3、管道聚合(Pipeline Aggregations)

管道聚合将多个聚合操作串联起来,进行复杂的计算和统计。ESAggregation支持多种类型的管道聚合,如bucket_selector、bucket_script、stats_bucket、derivative、cumulative_sum等。 下面的示例展示了如何使用管道聚合,计算电影类别中评论最多的前五个电影:

{
  "size": 0,
  "aggs": {
    "genres": {
      "terms": {
        "field": "genre"
      },
      "aggs": {
        "top_movies": {
          "top_hits": {
            "size": 5,
            "_source": {
              "includes": [
                "title",
                "year",
                "rating"
              ]
            },
            "sort": [
              {
                "comments": {
                  "order": "desc"
                }
              }
            ]
          }
        }
      }
    },
    "max_comments": {
      "max_bucket": {
        "buckets_path": "genres>top_movies>comments"
      }
    },
    "top_genres": {
      "bucket_selector": {
        "buckets_path": {
          "maxComments": "max_comments",
          "count": "genres>doc_count"
        },
        "script": "params.maxComments > 50 && params.count > 20"
      }
    }
  }
}

以上代码表示对movies索引中的数据进行过滤、分类、排序等多种操作,并使用管道聚合进行计算和统计。结果中返回每个分类下评论最多的前五个电影,并且限制只返回评论数大于50条、同时该分类下有超过20个电影的分类。