IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Elasticsearch(四) -- 聚合查询(Bucket) -> 正文阅读

[大数据]Elasticsearch(四) -- 聚合查询(Bucket)

说明:该博客对应的Elasticsearch 的版本为7.8.0;测试工具为postman

概念:Bucket可以理解为一个桶,符合要求的放入一个桶中,相当于mysql中的groupBy

本篇博客主要针对于terms aggs, filter aggs,histogram aggs,range aggs,date aggs五个关键字展开.

一,创建索引数据,参考Elasticsearch(三)--Metric(指标)

?二,Terms Aggregation (术语聚合)

terms聚合应该是一个类型的字段keyword或适合桶聚合的任何其他数据类型。为了使用它,text您需要启用?fielddata

默认情况下,terms聚合将返回按 排序的前十个术语的桶doc_count。可以通过设置size参数来更改此默认行为。

{
    "aggs":{
        "term_goodType":{
            "terms":{
                "field":"goodType",
                "size":3,          //返回排序后的前三个桶(默认情况下,桶
                                   //按doc_count降序排列)
                "order":{      
                    "_count":"asc"     //按照每个桶内文档的个数进行升序排列
                }

            }
        }
    }
}

运行结果

注意:关于排序的介绍

?1,内置排序

_count:按文档数排序

_key:按词项的字符串值的字母顺序排序

2,按单值指标子聚合(由聚合名称标识)对存储桶进行排序

3,按多值指标子聚合(由聚合名称标识)对存储桶进行排序

按单值指标子聚合(由聚合名称标识)对存储桶进行排序

POST? ?http://localhost:9200/goods/_search?size=0

{
    "aggs":{
        "term_goodType":{
            "terms":{
                "field":"goodType",
                //"size":3,
                "order":{
                    "in_bucket_max_goodPrice":"desc"  //对该聚合名称进行降序排序
                }
            },
        "aggs":{
            "in_bucket_max_goodPrice":{    //聚合名称的具体实现
                "max":{
                    "field":"goodPrice"
                }
            }
        }
        }
    }
}

?运行结果

?

按多值指标子聚合(由聚合名称标识)对存储桶进行排序

POST? ?http://localhost:9200/goods/_search?size=0

{
    "aggs":{
        "term_goodType":{
            "terms":{
                "field":"goodType",
                //"size":3,
                "order":{
                    "in_bucket_max_goodPrice":"desc",  //先按照每个桶内该字段的最大值降序排列
                    "top_hit":"desc" //最大值相同的再按照相关度得分降序排列
                }
            },
        "aggs":{
            "in_bucket_max_goodPrice":{
                "max":{
                    "field":"goodPrice"
                }
            },
            "top_hit":{
               "max": {
                     "script": {"source": "_score"}
                     }
            }
        }
        }
    }
}

?运行结果

?

?三,Filter Aggregation(过滤聚合)

Filter Aggregation??Filters Aggregation:桶聚合,其中每个桶包含与查询匹配的文档

Filter Aggreagtion 只能指定一个过滤条件,响应也只是单个桶。如果想要只对多个特定值进行聚合,需要使用 Filter Aggreagtion 只能进行多次请求。而使用 Filters Aggreagation 就可以解决上述的问题,它可以指定多个过滤条件,也是说可以对多个特定值进行聚合。

3.1过滤获取goodType为手机数码的桶,并求该桶平均值

POST? ?http://localhost:9200/goods/_search?size=0

{
    "aggs" : {
        "goodType_select_one" : {
            "filter" : { "term": { "goodType": "手机数码" } },
            "aggs" : {
                "avg_price" : { "avg" : { "field" : "goodPrice" } 
                }
            }
        }
    }
}

?运行结果

?3.2过滤获取goodType为手机数码或者goodName为男士外套的桶

POST? ?http://localhost:9200/goods/_search?size=0

{
    "aggs":{
        "buckets":{
            "filters":{
                "filters":{
                    "goodNameBucket":{
                        "match":{
                            "goodName":"男士外套"
                        }
                    },
                    "goodTypeBucket":{
                        "match":{
                            "goodType":"手机数码"
                        }
                    }
                }
            }
        }
    }
}

?运行结果

?

?四,Histogram Aggregation(直方图聚合)

? ? ? 概念:基于多桶值源的聚合,可应用于从文档中提取的数值或数值范围值。它动态地在值上构建固定大小(又名间隔)的桶。例如,如果文档有一个包含价格(数字)的字段,我们可以配置此聚合以动态构建具有间隔的存储桶5(在价格的情况下,它可能代表 5 美元)。当聚合执行时,每个文档的 price 字段将被评估,并将向下舍入到最接近的存储桶 - 例如,如果价格是32,存储桶大小是,5则舍入将产生30,因此文档将“落入”与 key 关联的存储桶30

?4.1根据价格区间为10000分桶,同时如果桶中没有文档就不显示桶

最小文件数(指定匹配的桶中至少含有的文档数目):min_doc_count

{
    "aggs":{
        "histogram_goodPrice_10000":{
            "histogram":{                      //聚合的类型
                "field":"goodPrice",         //对该字段进行分组
                "interval":"10000",          //间隔为10000
                "min_doc_count":1              //返回的桶里面至少有1个文档
            }
        }
    }
}

?运行结果

?

?五,Range Aggregation (范围聚合)

?用户自定义一组范围,每个范围代表一个桶.在聚合过程中,将从每个文档中提取的值根据每个存储区范围进行检查,并将相关/匹配文档“存储”到每个桶内.此聚合包括每个范围的from值并排除该to值

POST? ??http://localhost:9200/goods/_search?size=0

{
    "aggs":{                     
        "goodPrice_range":{     //聚合名字(自定义)
            "range":{              //聚合类型
                "field":"goodPrice",      //该字段进行分组
                "ranges":[                 //自定义分组范围
                    {
                        "to":"89"          //[*-89.0) 排除89
                    },
                    {
                        "from":"89",          //[89-4000000)  排除4000000
                        "to":"4000000"
                    },
                    {
                        "from":"4000000"          //[4000000-*)
                    }
                ]
            }
        }
    }
}

运行结果

??

可以为每个范围自定义键

?POST? ??http://localhost:9200/goods/_search?size=0

{
    "aggs":{
        "goodPrice_range":{
            "range":{
                "field":"goodPrice",
                "ranges":[
                    {
                        "key":"group1",
                        "to":"89"
                    },
                    {
                        "key":"group2",
                        "from":"89",
                        "to":"4000000"
                    },
                    {
                        "key":"group3",
                        "from":"4000000"
                    }
                ]
            }
        }
    }
}

?运行结果

将文档“存储”到不同的存储桶中,并且计算每个价格范围内的价格统计信息?

?POST? ??http://localhost:9200/goods/_search?size=0

{
    "aggs":{
        "groupby_goodPrice":{     
            "range":{               //进行分组
                "field":"goodPrice",   //字段为goodPrice
                "ranges":[
                    {
                        "key":"group1",
                        "to":"100"
                    },
                    {
                        "key":"group2",
                        "from":"100",
                        "to":"4000000"
                    },
                    {
                        "key":"group3",
                        "from":"4000000"
                    }
                ]
            },
            "aggs":{                    //对分桶后的每个桶执行聚合操作
                "goodPrice_stats":{
                    "stats":{                     
                        "field":"goodPrice" 
                    }
                }
            }
        }
    }
}

运行结果

?六,Date Aggregation(日期聚合)

Date Histogram Aggregation(日期直方图聚合):?类似于普通的?histogram,但它只能与日期或日期范围值一起使用;像直方图,数值四舍五入下来到最接近的水桶。例如,如果间隔是一个日历日,2020-01-03T07:00:01Z则四舍五入为?2020-01-03T00:00:00Z

日历间隔:
使用calendar_interval参数配置(不支持多个数量2d)

minute,?1m?--hour,?1h--day,?1d--week,?1w--month,?1M--quarter,?1q--year,?1y

固定间隔

通过fixed_interval参数配置。

固定间隔的可接受单位是:毫秒 (?ms)--秒 (?s)--分钟 (?m)--小时 (?h)--天 (?d)

{
    "aggs" : {
        "sales_time" : {
            "date_histogram" : {
                "field" : "sellTime",
                "interval" : "1M",
                "format" : "yyyy-MM-dd" 
            }
        }
    }
}

?Date Range Aggregation(日期范围聚合):专用于日期值的范围聚合。此聚合与正常范围?聚合之间的主要区别在于?,from和to值可以用?日期数学表达式表示,并且还可以指定返回from和to响应字段的日期格式。请注意,此聚合包括每个范围的from值并排除该to值。

{
    "aggs": {
        "range": {
            "date_range": {
                "field": "sellTime",
                "format": "MM-yyyy",
                "ranges": [
                    { "to": "now-10M/M" }, 
                    { "from": "now-10M/M" } 
                ]
            }
        }
    }
}

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 10:53:03  更:2021-08-02 10:53:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 9:48:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码