ES聚合查询

Elasticsearch 聚合分析(Aggregations)

Elasticsearch 聚合(Aggregations) 是一种强大的数据分析功能,类似于 SQL 的 GROUP BY,可以用于 统计、分组、计算平均值、最大值、最小值、直方图分析 等。

🔹 1. 聚合查询的基本结构

GET test_search_index/_search
{
  "size": 0,
  "aggs": {
    "聚合名称": {
      "聚合类型": {
        "字段名": "分析的字段"
      }
    }
  }
}

📌 size: 0 表示 不返回文档,仅返回聚合结果

🔹 2. 统计 job 的不同种类和数量

📌 SQL 等价于:

SELECT job, COUNT(*) FROM test_search_index GROUP BY job;

📌 Elasticsearch 查询:

GET test_search_index/_search
{
  "size": 0,
  "aggs": {
    "job_count": {
      "terms": {
        "field": "job.keyword"
      }
    }
  }
}

📌 注意

​ • terms 表示 按字段分组

​ • job.keyword 是 job 字段的 keyword 类型(ES 对 text 字段不会分组,必须使用 keyword)。

🔹 示例返回结果:

{
  "aggregations": {
    "job_count": {
      "buckets": [
        { "key": "Developer", "doc_count": 3 },
        { "key": "Designer", "doc_count": 2 },
        { "key": "Teacher", "doc_count": 1 }
      ]
    }
  }
}

📌 解释

​ • Developer 共有 3 个。

​ • Designer 共有 2 个。

​ • Teacher 共有 1 个。

🔹 3. 计算 age 的平均值

📌 SQL 等价于:

SELECT AVG(age) FROM test_search_index;

📌 Elasticsearch 查询:

GET test_search_index/_search
{
  "size": 0,
  "aggs": {
    "average_age": {
      "avg": {
        "field": "age"
      }
    }
  }
}

🔹 示例返回结果:

{
  "aggregations": {
    "average_age": {
      "value": 35.6
    }
  }
}

📌 解释:所有用户的 age 平均值是 35.6。

🔹 4. 计算 age 的最大值 & 最小值

📌 SQL 等价于:

SELECT MAX(age), MIN(age) FROM test_search_index;

📌 Elasticsearch 查询:

GET test_search_index/_search
{
  "size": 0,
  "aggs": {
    "max_age": {
      "max": {
        "field": "age"
      }
    },
    "min_age": {
      "min": {
        "field": "age"
      }
    }
  }
}

🔹 示例返回结果:

{
  "aggregations": {
    "max_age": { "value": 59 },
    "min_age": { "value": 22 }
  }
}

📌 解释

​ • 最大年龄:59。

​ • 最小年龄:22。

🔹 5. 计算 age 的分布(直方图分析)

📌 SQL 等价于:

SELECT age DIV 10 AS age_group, COUNT(*) FROM test_search_index GROUP BY age_group;

📌 Elasticsearch 查询(按 10 岁一组):

GET test_search_index/_search
{
  "size": 0,
  "aggs": {
    "age_histogram": {
      "histogram": {
        "field": "age",
        "interval": 10
      }
    }
  }
}

🔹 示例返回结果:

{
  "aggregations": {
    "age_histogram": {
      "buckets": [
        { "key": 20, "doc_count": 2 },
        { "key": 30, "doc_count": 4 },
        { "key": 40, "doc_count": 3 },
        { "key": 50, "doc_count": 1 }
      ]
    }
  }
}

📌 解释

​ • 20-29 岁:2 个人。

​ • 30-39 岁:4 个人。

​ • 40-49 岁:3 个人。

​ • 50-59 岁:1 个人。

🔹 6. 按 isMarried 分组并计算平均 age

📌 SQL 等价于:

SELECT isMarried, AVG(age) FROM test_search_index GROUP BY isMarried;

📌 Elasticsearch 查询:

GET test_search_index/_search
{
  "size": 0,
  "aggs": {
    "married_group": {
      "terms": {
        "field": "isMarried"
      },
      "aggs": {
        "avg_age": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}

🔹 示例返回结果:

{
  "aggregations": {
    "married_group": {
      "buckets": [
        { "key": false, "doc_count": 5, "avg_age": { "value": 31.2 } },
        { "key": true, "doc_count": 5, "avg_age": { "value": 42.8 } }
      ]
    }
  }
}

📌 解释

​ • 未婚(false)人数:5,平均年龄 31.2 岁。

​ • 已婚(true)人数:5,平均年龄 42.8 岁。

🔹 7. 复合聚合(按 job 分组后统计平均 age)

📌 SQL 等价于:

SELECT job, COUNT(*), AVG(age) FROM test_search_index GROUP BY job;

📌 Elasticsearch 查询:

GET test_search_index/_search
{
  "size": 0,
  "aggs": {
    "job_group": {
      "terms": {
        "field": "job.keyword"
      },
      "aggs": {
        "avg_age": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}

📌 结果会返回每种 job 的人数,以及 age 平均值

🔹 8. 统计 Elasticsearch 文档总数

如果你只想获取 test_search_index 索引的文档总数

GET test_search_index/_count

返回示例

{
  "count": 100,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  }
}

📌 解释

​ • 该索引共有 100 条数据。

📌 总结

需求 语法
统计不同 job 的数量 terms 聚合
计算 age 平均值 avg 聚合
计算 age 最大/最小值 max / min 聚合
计算 age 的分布 histogram 直方图
按 isMarried 统计 age 平均值 terms + avg 复合聚合
按 job 统计 age 平均值 terms + avg 复合聚合

如果你有特定的分析需求,欢迎告诉我,我可以帮你写具体的 Elasticsearch 聚合查询!🚀😊

posted on 2025-02-20 22:58  朝朝暮Mu  阅读(105)  评论(0)    收藏  举报