elasticsearch7分组时,按照不同条件计数,类似mysql count(case when)写法
时间: 2023-07-04 09:04:25 浏览: 108
在 Elasticsearch 7 中,可以使用聚合(Aggregation)来实现类似 MySQL 中的 count(case when) 写法。具体来说,你可以使用“条件聚合”(Conditional Aggregation)来达到此目的。
例如,假设你有一个包含以下文档的索引:
```
POST my_index/_doc
{
"category": "fruit",
"price": 3
}
POST my_index/_doc
{
"category": "vegetable",
"price": 5
}
POST my_index/_doc
{
"category": "fruit",
"price": 2
}
POST my_index/_doc
{
"category": "fruit",
"price": 4
}
```
你可以使用以下代码来按照 category 分组,并在每个分组中计算 price 大于 3 的文档数量和 price 小于等于 3 的文档数量:
```
POST my_index/_search
{
"size": 0,
"aggs": {
"group_by_category": {
"terms": {
"field": "category"
},
"aggs": {
"price_greater_than_3": {
"sum": {
"script": {
"source": "if (doc['price'].value > 3) { return 1 } else { return 0 }"
}
}
},
"price_less_than_or_equal_to_3": {
"sum": {
"script": {
"source": "if (doc['price'].value <= 3) { return 1 } else { return 0 }"
}
}
}
}
}
}
}
```
这将返回以下结果:
```
{
"aggregations" : {
"group_by_category" : {
"buckets" : [
{
"key" : "fruit",
"doc_count" : 3,
"price_greater_than_3" : {
"value" : 1.0
},
"price_less_than_or_equal_to_3" : {
"value" : 2.0
}
},
{
"key" : "vegetable",
"doc_count" : 1,
"price_greater_than_3" : {
"value" : 0.0
},
"price_less_than_or_equal_to_3" : {
"value" : 1.0
}
}
]
}
}
}
```
可以看到,在“group_by_category”聚合内部,每个分组都有一个“price_greater_than_3”和一个“price_less_than_or_equal_to_3”子聚合,它们分别计算了 price 大于 3 和小于等于 3 的文档数量,并且使用了条件脚本来判断每个文档是否符合条件。最终,它们的计数结果被汇总到了每个分组中。
阅读全文