【ES实战】简单的聚合-复合查询

演示一个使用复合查询的场景案例

背景:

一个索引,存放了短信发送纪录。

需求:

根据chlAccount、suppliersId字段分组。统计一下数据:

  1. 根据serialNum字段统计出总记录数,
  2. 根据smsStatus短信发送状态字段统计出发送短信成功数,
  3. 根据receiveStatus短信接收状态统计出短信接收成功数和接收失败数,
  4. 根据succTotal短信成功数字段统计出计费短信总数,
  5. 根据短信时间smsTime短信耗时统计出平均耗时,
  6. 根据receiveStatus短信发送状态统计出短信接收成功,接收失败,接收未知状态的总数。

主要使用的聚合:

  1. Value Count Aggregation :值计数聚合
  2. Terms Aggregation:分词桶聚合
  3. Filter Aggregation:过滤器桶聚合
  4. Filters Aggregation: 过滤器组桶聚合
  5. Avg Aggregation:平均值聚合
  6. Sum Aggregation:值汇总聚合

参与排序和聚合的字段,需要开启doc_valuesdoc_values默认开启。不开启的会聚合语句执行时会,直接报错。
使用的的是5版本的ES,所以标注脚本语言用的是inline字段,高版本已变更。需要重新查阅。

Index的结构

PUT sms-20240423

{
    "mappings": {
        "sms": {
            "dynamic": "strict",
            "_all": {
                "enabled": false
            },
            "properties": {
                "serialNum": {
                    "type": "keyword"
                },
                "sendStatus": {
                    "type": "integer"
                },
                "receiveStatus": {
                    "type": "integer"
                },
                "succTotal": {
                    "type": "integer"
                },
                "smsTime": {
                    "type": "long"
                },
                "chlAccount": {
                    "type": "keyword"
                },
                "suppliersId": {
                    "type": "keyword"
                },
                "chlName": {
                    "type": "keyword",
                    "doc_values": false
                },
            }
        }
    },
    "settings": {
        "number_of_shards": "3",
        "number_of_replicas": "1"
    }
}

查询语句,执行时,需要去掉注释部分。

GET sms-20240423/_search
{
    "size": 0, //默认不展示hit数据记录
    "query": { // bool must查询,选择数据的sendTime时间范围
        "bool": {
            "must": [
                {
                    "range": {
                        "sendTime": {
                            "from": 1713283200000
                        }
                    }
                }
            ]
        }
    },
    "aggregations": {
        "sendDataByChannel": {
            // 分词桶聚合-使用脚本进行分组
            "terms": {
                "script": {
                    "inline": "doc['chlAccount']+'#'+doc['suppliersId']",
                    "lang": "painless"
                },
                "size": 1000,
                "min_doc_count": 1,
                "shard_min_doc_count": 0,
                "show_term_doc_count_error": false,
                "order": [
                    {
                        "_count": "desc"
                    },
                    {
                        "_term": "asc"
                    }
                ]
            },
            "aggregations": {
                "sendTotal": {
                    // 值计数聚合,聚合使用字段serialNum
                    "value_count": {
                        "field": "serialNum"
                    }
                },
                "sendSuccSum": {
                    // 过滤器聚合
                    "filter": {
                        "match": {
                            "sendStatus": {
                                "query": 1,
                                "operator": "OR",
                                "prefix_length": 0,
                                "max_expansions": 50,
                                "fuzzy_transpositions": true,
                                "lenient": false,
                                "zero_terms_query": "NONE",
                                "boost": 1.0
                            }
                        }
                    }
                },
                "receiveSuccSum": {
                     // 过滤器聚合
                    "filter": {
                        "match": {
                            "receiveStatus": {
                                "query": 1,
                                "operator": "OR",
                                "prefix_length": 0,
                                "max_expansions": 50,
                                "fuzzy_transpositions": true,
                                "lenient": false,
                                "zero_terms_query": "NONE",
                                "boost": 1.0
                            }
                        }
                    }
                },
                "receiveFailSum": {
                    // 过滤器桶聚合
                    "filter": {
                        "match": {
                            "receiveStatus": {
                                "query": -2,
                                "operator": "OR",
                                "prefix_length": 0,
                                "max_expansions": 50,
                                "fuzzy_transpositions": true,
                                "lenient": false,
                                "zero_terms_query": "NONE",
                                "boost": 1.0
                            }
                        }
                    }
                },
                "costTotalSum": {
                   // 求和值聚合
                    "sum": {
                        "field": "succTotal"
                    }
                },
                "avgReceiveTime": {// 平均值聚合
                    "avg": {
                        "field": "smsTime"
                    }
                },
                "callbackSuccSum": {
                     // 多过滤器桶聚合
                    "filters": {
                        "filters": [
                            {
                                "match": {
                                    "receiveStatus": {
                                        "query": 1,
                                        "operator": "OR",
                                        "prefix_length": 0,
                                        "max_expansions": 50,
                                        "fuzzy_transpositions": true,
                                        "lenient": false,
                                        "zero_terms_query": "NONE",
                                        "boost": 1.0
                                    }
                                }
                            },
                            {
                                "match": {
                                    "receiveStatus": {
                                        "query": -2,
                                        "operator": "OR",
                                        "prefix_length": 0,
                                        "max_expansions": 50,
                                        "fuzzy_transpositions": true,
                                        "lenient": false,
                                        "zero_terms_query": "NONE",
                                        "boost": 1.0
                                    }
                                }
                            },
                            {
                                "match": {
                                    "receiveStatus": {
                                        "query": -3,
                                        "operator": "OR",
                                        "prefix_length": 0,
                                        "max_expansions": 50,
                                        "fuzzy_transpositions": true,
                                        "lenient": false,
                                        "zero_terms_query": "NONE",
                                        "boost": 1.0
                                    }
                                }
                            }
                        ],
                        "other_bucket": false,
                        "other_bucket_key": "_other_"
                    }
                }
            }
        }
    }
}

查询结果示例:

{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "failed": 0
    },
    "hits": {
        "total": 301,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "sendDataByChannel": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": "[chlAccount]#[surereid]",
                    "doc_count": 101,
                    "sendSuccSum": {
                        "doc_count": 101
                    },
                    "receiveFailSum": {
                        "doc_count": 0
                    },
                    "sendTotal": {
                        "value": 101
                    },
                    "receiveSuccSum": {
                        "doc_count": 100
                    },
                    "costTotalSum": {
                        "value": 202
                    },
                    "callbackSuccSum": {
                        "buckets": [
                            {
                                "doc_count": 100
                            },
                            {
                                "doc_count": 0
                            },
                            {
                                "doc_count": 0
                            }
                        ]
                    },
                    "avgReceiveTime": {
                        "value": 550.6237623762377
                    }
                },
                {
                    "key": "[chlAccount2]#[surereid]",
                    "doc_count": 100,
                    "sendSuccSum": {
                        "doc_count": 100
                    },
                    "receiveFailSum": {
                        "doc_count": 0
                    },
                    "sendTotal": {
                        "value": 100
                    },
                    "receiveSuccSum": {
                        "doc_count": 0
                    },
                    "costTotalSum": {
                        "value": 200
                    },
                    "callbackSuccSum": {
                        "buckets": [
                            {
                                "doc_count": 0
                            },
                            {
                                "doc_count": 0
                            },
                            {
                                "doc_count": 0
                            }
                        ]
                    },
                    "avgReceiveTime": {
                        "value": 549.87
                    }
                },
                {
                    "key": "[chlAccount3]#[surereid]",
                    "doc_count": 100,
                    "sendSuccSum": {
                        "doc_count": 100
                    },
                    "receiveFailSum": {
                        "doc_count": 0
                    },
                    "sendTotal": {
                        "value": 100
                    },
                    "receiveSuccSum": {
                        "doc_count": 0
                    },
                    "costTotalSum": {
                        "value": 200
                    },
                    "callbackSuccSum": {
                        "buckets": [
                            {
                                "doc_count": 0
                            },
                            {
                                "doc_count": 0
                            },
                            {
                                "doc_count": 0
                            }
                        ]
                    },
                    "avgReceiveTime": {
                        "value": 607.38
                    }
                }
            ]
        }
    }
}
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Elasticsearch中,聚合(aggregation)是一种强大的数据分析工具,可以对文档进行统计分析并返回计算结果。其中,Metric聚合是一种聚合类型,它会对文档中的某些数值型字段进行统计计算,例如:平均值、最大值、最小值、总和等。 下面我们来看一下如何在Elasticsearch中使用Metric聚合进行数据分析。 假设我们有一个存储了销售数据的索引,其中每个文档都包含了产品的名称、价格、销售量等信息。我们想要统计该索引中所有产品的平均价格、最高价格、最低价格以及销售总量,可以使用以下的聚合查询DSL: ``` GET /sales/_search { "size": 0, "aggs": { "avg_price": { "avg": { "field": "price" } }, "max_price": { "max": { "field": "price" } }, "min_price": { "min": { "field": "price" } }, "total_sales": { "sum": { "field": "sales" } } } } ``` 在上述查询中,我们使用了四个不同的Metric聚合:avg(平均值)、max(最大值)、min(最小值)和sum(总和)。每个聚合都针对文档中的price和sales字段进行了计算,最终返回了平均价格、最高价格、最低价格以及销售总量的计算结果。 在聚合查询中,我们还可以使用多个Metric聚合组合起来进行更加复杂的数据分析。例如,我们可以计算不同销售区域的平均价格和销售总量,可以使用以下的聚合查询DSL: ``` GET /sales/_search { "size": 0, "aggs": { "by_region": { "terms": { "field": "region" }, "aggs": { "avg_price": { "avg": { "field": "price" } }, "total_sales": { "sum": { "field": "sales" } } } } } } ``` 在上述查询中,我们首先使用了terms聚合将文档按照region字段进行了分组,然后在每个分组中使用了两个不同的Metric聚合:avg(平均值)和sum(总和)。最终返回了不同销售区域的平均价格和销售总量的计算结果。 总之,Metric聚合Elasticsearch中非常有用的数据分析工具,可以帮助我们对文档中的数值型字段进行统计分析并返回计算结果。在实际应用中,我们可以根据具体的业务需求来选择不同的Metric聚合进行数据分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顧棟

若对你有帮助,望对作者鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值