Elasticsearch(三)--Metric(指标)
说明:该博客对应的Elasticsearch 的版本为7.8.0;测试工具为postman
1,概念
理解四个关键字:Metric(指标),Bucketing(桶),Matrix(矩阵),Pipeline(管道).其中Metric(指标),Bucketing(桶)应用最为广泛.文档也就是json对象
Bucket(桶): 满足特定条件的文档的集合,类似SQL中的GROUP BY语法(按照性别进行分组)
Metric(指标): 指标分析类型对桶内的文档进行聚合分析的操作),如计算最大值、最小值、平均值等等(类似于分组后计算组内的最大值与最小值)
ES聚合分析查询的一般写法
"aggs" : { "<aggregation_name>" : { <!--聚合的名字 --> "<aggregation_type>" : { <!--聚合的类型 --><aggregation_body> <!--聚合体:对哪些字段进行聚合 --> }[,"meta" : { [<meta_data_body>] } ]? <!--元 --> [,"aggregations" : { [<sub_aggregation>]+ } ]? <!--在聚合里面在定义子聚合 --> } [,"<aggregation_name_2>" : { ... } ]* <!--聚合的名字 --> }-------#Aggregations== aggs
2,Metric(指标)详解:
前期数据的准备
POST http://localhost:9200/goods
{"mappings":{ //映射"properties":{ //文档的属性"goodName":{ "type":"keyword" //类型是keyword},"goodCount":{"type":"long"},"goodType":{"type":"keyword" },"goodPrice":{"type":"long"}}}
}
注意:分组操作,排序操作...对应的字段应该设为keyword
批量插入数据:
PUT http://localhost:9200/goods/_bulk
{"index":{"_index":"goods","_id":"1001"}}
{ "goodName": "手机","goodCount": 500,"goodType": "手机数码","goodPrice": 6999}
{"index":{"_index":"goods","_id":"1002"}}
{ "goodName": "电脑","goodCount": 60,"goodType": "手机数码","goodPrice": 8999}
{"index":{"_index":"goods","_id":"1003"}}
{"goodName": "耳机","goodCount": 1000,"goodType": "手机数码","goodPrice": 39}
{"index":{"_index":"goods","_id":"1004"}}
{"goodName": "男士外套","goodCount": 400,"goodType": "衣服服饰","goodPrice": 89}
{"index":{"_index":"goods","_id":"1005"}}
{"goodName": "女士内衣","goodCount": 600,"goodType": "衣服服饰","goodPrice": 139}
{"index":{"_index":"goods","_id":"1006"}}
{ "goodName": "洗洁精","goodCount": 4000,"goodType": "厨房用品","goodPrice": 9.9}
{"index":{"_index":"goods","_id":"1007"}}
{"goodName": "洗衣液","goodCount": 4500,"goodType": "厨房用品","goodPrice": 19.9}
{"index":{"_index":"goods","_id":"1008"}}
{"goodName": "炒菜锅","goodCount": 5000,"goodType": "厨房用品","goodPrice": 59.9}
{"index":{"_index":"goods","_id":"1009"}}
{"goodName": "床单","goodCount": 5000,"goodType": "床上用品","goodPrice": 70}
{"index":{"_index":"goods","_id":"1010"}}
{"goodName": "劳斯莱斯","goodCount": 30,"goodType": "汽车用品","goodPrice": 6000000}
注意:最后一行, 敲回车出来一个空行
查看是否成功:
GET /_cat/count/goods?v
2.1、单值分析,只输出一个分析结果
Min:计算从聚合文档内提取的数组的平均值
Max:计算从聚合文档内提取的数组的最大值
avg,计算从聚合文档内提取的数组的平均值
sum,计算从聚合文档内提取的数组的总和
Cardinality:唯一值(不重复的字段有多少相当于sql中的distinct)
value_count用于统计从字段中取值的总数,类似于SQL中的count
top hits:分桶后获取该桶内匹配前n的文档列表(可以先排序再匹配)
2.1.1.avg
POST http://localhost:9200/goods/_search?size=0[1]
{"size":0,[2] "aggs":{"avg_price":{ //聚合的名字(自定义)"avg":{ //聚合类型"field":"goodPrice" //聚合的字段}}}
}
运行结果
注意:[1],[2]任意一种方式都可以目的是为了去掉聚合的原文档.
2.1.2.min
POST http://localhost:9200/goods/_search?size=0
{"aggs":{ "min_price":{ //聚合的名字"min":{ //聚合的类型"field":"goodPrice" //聚合的字段}}}
}
运行结果
2.1.3.max
POST http://localhost:9200/goods/_search?size=0
{"aggs":{"max_price":{ //聚合的名字(自定义)"max":{ //聚合的类型"field":"goodPrice" //聚合的字段}}}
}
运行结果
2.1.4.sum
POST http://localhost:9200/goods/_search?size=0
{"aggs":{"sum_price":{ //聚合的名字"sum":{ //聚合的类型"field":"goodPrice" //聚合的字段}}}
}
2.1.5.cardinality
- cardinality聚集的算法使用极小内存实现统计结果的基本准确。所以cardinality在数据量极大的情况下是不能保证完全准确的
POST http://localhost:9200/goods/_search?size=0
{"aggs":{"cardinality_price":{"cardinality":{"field":"goodType"}}}
}
运行结果
cardinality,count(distinct),5%的错误率,性能在100ms左右
1、precision_threshold优化准确率和内存开销
GET /tvs/sales/_search
{
"size" : 0,
"aggs" : {
"distinct_brand" : {
"cardinality" : {
"field" : "brand",
"precision_threshold" : 100
}
}
}
}如果brand的unique value,在100个以内,小米,长虹,三星,TCL,HTL。。。
cardinality几乎保证100%准确,但是cardinality算法,会占用precision_threshold * 8 byte 内存消耗,100 * 8 = 800个字节,占用内存很小。。。而且unique value如果的确在值以内,那么可以确保100%准确
设置的是100但是有数百万的unique value,错误率在5%以内
precision_threshold,值设置的越大,占用内存越大,1000 * 8 = 8000 / 1000 = 8KB,可以确保更多unique value的场景下,100%的准确
unique value,10000,precision_threshold=10000,10000 * 8 = 80000个byte,80KB
2、HyperLogLog++ (HLL)算法性能优化
cardinality底层算法:HLL算法,HLL算法会对所有的uqniue value取hash值,通过hash值近似去求distcint count
默认情况下,发送一个cardinality请求的时候,会动态地对所有的field value,取hash值;
优化:将取hash值的操作,前移到建立索引的时候
PUT /tvs/
{
"mappings": {
"sales": {
"properties": {
"brand": {
"type": "text",
"fields": {增加一个子字段,类型是murmur3,在建立索引的时候就会将hash值算出来
"hash": {
"type": "murmur3"
}
}
}
}
}
}
}GET /tvs/sales/_search
{
"size" : 0,
"aggs" : {
"distinct_brand" : {
"cardinality" : {//通过hash子字段计算cardinality
"field" : "brand.hash",
"precision_threshold" : 100
}
}
}
}
2.1.6 value_count
- 统计从字段中取值的总数,类似于SQL中的count
POST /kibana_sample_data_flights/_search?filter_path=aggregations
{
"aggs": {
"total_country": {
"value_count": {
"field": "DestCountry"
}
}
}
}
//返回结果
{
"aggregations" : {
"total_country" : {
"value" : 13059
}
}
}
2.2,多值分析,输出多个结果
Stats:统计,请求后会直接显示多种聚合的结果
extended_stats:同上
percentiles:默认按照[1,5,25,50,75,95,99]的顺序从小到大累计并返回对应的值其中的[1,5,25,50,75,95,99]都为百分比,查出来对应的为文档值(goodPrice值)w1-w7;占比1%的文档的goodPrice值<=w1(如果w1是12,个索在整引中的文档有1%的文档的goodPrice值<=12)
Percentile_ranks:通过文档值求百分比,"percents" : [95, 99, 99.9],其中的[95, 99, 99.9]为文档对应的goodPrice值,查出来的是w1-w3百分比:goodPrice值小于95的文档占比为W1;小于99的文档占比为W3
2.2.1,stats
POST http://localhost:9200/goods/_search?size=0
{"aggs":{"stats_price":{"stats":{"field":"goodPrice"}}}
}
运行结果
2.2.2,percentiles
POST http://localhost:9200/goods/_search?size=0
2.2.2.1 (不指定分位值)
{"aggs": {"goodPrice_outlier": {"percentiles": {"field": "goodPrice", 对该字段进行聚合"keyed":false //默认情况下,keyed标志设置为true,它将唯一//的字符串键与每个存储桶相关联,并将范围作为哈希而不是数组返回。}}}
}
运行结果
2.2.2.1 (指定分位值)
{"size": 0,"aggs": {"goodPrice_outlier": {"percentiles": {"field": "goodPrice","percents" : [50, 99], //占比为50%的文档的goodPrice<=查出来的数;
//占比为99%的文档的goodPrice<=查出来的数;"keyed": false}}}
}
运行结果
2.2.3,percentile_ranks
POST http://localhost:9200/goods/_search?size=0
{"aggs":{"percentiles_ranks_price":{"percentile_ranks":{"field":"goodPrice","values" : [500, 600] //小于500的文档占比为xx%,
//小于600的文档占比为xx%}}}
}
运行结果
SLA:就是你提供的服务的标准
我们的网站的提供的访问延时的SLA,确保所有的请求100%,都必须在200ms以内,大公司内,一般都是要求100%在200ms以内
如果超过1s,则需要升级到A级故障,代表网站的访问性能和用户体验急剧下降
需求:在200ms以内的,有百分之多少,在1000毫秒以内的有百分之多少,percentile ranks metric
percentile ranks,其实比pencentile还要常用
//percentile的优化
GET /website/logs/_search
{
"size": 0,
"aggs": {
......
},
"aggs": {
"latency_percentile_ranks": {
"percentile_ranks": {
"field": "latency",
"values": [
200,
1000
],
"compression": 100
}
}
}
}
}
}使用的是TDigest算法,用很多节点来执行百分比的计算,近似估计,有误差,节点越多,越精准
通过compression控制
限制节点数量最多 compression(默认100) * 20 = 2000个node去计算
越大,占用内存越多,越精准,性能越差
一个节点占用32字节,100 * 20 * 32 = 64KB
如果你想要percentile算法越精准,compression可以设置的越大
2.2.4,top_hits
POST http://localhost:9200/goods/_search?size=0
{"aggs": {"top_tags": { //聚合的名字"terms": { //聚合的类型(分组)"field": "goodType", //对"goodType"字段进行分组"size": 3 //分桶后只显示文档数量前3的桶},"aggs": {"top_sales_hits": { //聚合的名字"top_hits": { //聚合的类型"sort": [ //对每个桶内的goodPrice降序排列{"goodPrice": { "order": "asc" //降序}}],"size" : 1 //取桶内的匹配的一个}}}}}
}
运行结果
Elasticsearch(三)--Metric(指标)相关推荐
- 三个指标怎么做分层图_分层性能指标以及在哪里找到它们
三个指标怎么做分层图 Hierarchical machine learning models are one top-notch trick. As discussed in previous po ...
- 分布式CAP理论:为什么CAP理论中的三个指标不能同时满足呢?
文章目录 前言 分布式系统的特点 分布式系统技术是用来解决什么问题的呢? CAP代表什么含义 一致性(Consistency) 可用性(Availability) 分区容错性(Partition To ...
- 压力测试衡量CPU的三个指标
压力测试衡量CPU的三个指标:CPU Utilization.Load Average和ContextSwitch Rate 上篇讲如何用LoadRunner监控Linux的性能指标,但是关于CPU的 ...
- MTBF、MTTR、MTTF三个指标的区别在哪儿
MTBF.MTTR.MTTF三个指标的区别 1.MTBF,全称是Mean Time Between Failure,即平均无故障工作时间.就是从新的产品在规定的工作环境条件下开始工作到出现第一个故障的 ...
- 压力测试衡量CPU的三个指标:CPU Utilization、Load Average和Context Switch Rate
上篇讲如何用LoadRunner监控Linux的性能指标 ,但是关于CPU的几个指标没有搞清楚,下面就详细说说. CPU Utilization 好理解,就是CPU的利用率,75%以上就比较高了(也有 ...
- 衡量CPU的三个指标:CPU Utilization、Load Average和Context Switch Rate
CPU Utilization 好理解,就是CPU的利用率,75%以上就比较高了(也有说法是80%或者更高).除了这个指标外,还要结合Load Average和Context Switch Rate来 ...
- 压力测试衡量CPU的三个指标CPU Utilization、Load Average和ContextSwitch Rate
压力测试衡量CPU的三个指标:CPU Utilization.Load Average和ContextSwitch Rate 上篇讲如何用LoadRunner监控Linux的性能指标,但是关于CPU的 ...
- ElasticSearch三master节点集群状态查看方法
ES集群的状态实际上也是使用RESTful的接口,一般用的是GET方法 http://[主机IP]:[ES端口] 通常我们启动服务器之后,就可以通过这个简单的方式来验证服务器是否启动成功. 从下面返加 ...
- 监控三个指标 并不代表你能监控Tuxedo
什么是Tuxedo? Tuxedo是一个中间件产品,它使用给予消息的通信系统在各种不同的操作系统平台和数据库之间分配应用程序.Tuxedo就像一个操作系统的外延,用来创建和管理电子商务在线事务处理系统 ...
最新文章
- python运维开发之socket网络编程01
- ux和ui_首先要做的— UX / UI案例研究
- VBA操作word生成sql语句
- project下查看那些文件夹是空的
- TTU智能配电终端_智能配电终端规模化建设及应用
- Linux下使用源码安装出现的坑
- html 去掉右键菜单,右键菜单管理清除多余项目的方法教程
- 博士申请 | 美国北卡州立大学胥栋宽老师招收深度学习方向全奖博士/硕士/博后...
- Spring Framework灰度发布
- java 下载暂停实现_在文件下载中实现暂停/恢复
- Mysql数据处理函数/单行处理函数
- wordpress入门主题_WordPress儿童主题入门
- 【Excel】如何冻结任意行列
- 句法分析(PCFG,Transition-based parsing)
- 论文笔记 Stochastic Gradient Hamiltonian Monte Carlo (SGHMC)
- python听歌识曲爬虫_Python爬取网易云音乐热门评论的搜索结果-阿里云开发者社区...
- dingding for Ubuntu: Ubuntu中钉钉安装包资源及安装
- 夜神模拟 配置 热加载
- 关于禁用微软拼音输入法的解决方法
- 复制带中文的公式贴到通达信公式中显示乱码解决方案