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 聚合查询!🚀😊
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号