ESAggregation的使用

一、聚合分析的基本概念

聚合(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個電影的分類。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/291707.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-25 14:06
下一篇 2024-12-25 14:06

發表回復

登錄後才能評論