在 Elasticsearch 中,分组查询通常是通过聚合(Aggregation)来实现的。聚合是一种用于分析和组织数据的机制,它允许你对数据进行分组、统计和计算,从而生成有关数据的有用信息。下面我将介绍一些常见的分组查询语句,并附上相应的示例代码。
假设我们有一个索引,包含了一些关于产品的信息,字段包括: product_name
(产品名称)、 category
(产品类别)、 price
(价格)等。
这是最简单的聚合类型,用于按照某个字段的值进行分组。
GET /products/_search
{
"size": 0,
"aggs": {
"group_by_category": {
"terms": {
"field": "category.keyword",
"size": 10
}
}
}
}
这个示例中,我们使用了一个词项聚合来按照产品类别对数据进行分组。field
参数指定了要进行分组的字段,size
参数指定了返回的分组数量。响应中会返回每个类别及其对应的文档数量。
范围聚合用于将数据分组到不同的范围中,例如价格范围。
GET /products/_search
{
"size": 0,
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "from": 0, "to": 50 },
{ "from": 50, "to": 100 },
{ "from": 100 }
]
}
}
}
}
这个示例中,我们使用了范围聚合来将产品按照价格范围进行分组。ranges
数组中定义了多个范围,每个范围都有一个起始值和一个终止值。
用于按照时间字段(比如日期)对数据进行分组,并在时间轴上创建柱状图。
GET /products/_search
{
"size": 0,
"aggs": {
"sales_over_time": {
"date_histogram": {
"field": "date_sold",
"calendar_interval": "month"
}
}
}
}
这个示例中,我们使用了日期柱状图聚合来按月份对销售数据进行分组。calendar_interval
参数指定了时间间隔。
嵌套聚合允许在一个聚合内部嵌套另一个聚合,用于更复杂的分组和分析。
GET /products/_search
{
"size": 0,
"aggs": {
"group_by_category": {
"terms": {
"field": "category.keyword",
"size": 5
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
这个示例中,我们首先按照产品类别分组,然后在每个类别内部计算平均价格。
这些只是一些分组查询的示例,Elasticsearch 的聚合功能非常强大,还有许多其他类型的聚合可供使用。每种聚合都可以根据你的需求进行参数配置,以生成想要的分组结果。在实际使用中,你需要根据你的数据和分析目标来选择合适的聚合方式。