Elasticsearch 基本使用(四)聚合查询

这篇具有很好参考价值的文章主要介绍了Elasticsearch 基本使用(四)聚合查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

说到聚合查询,马上会想到 SQL 中的 group by,ES中也有类似的功能,名叫 Aggregation。

单字段聚合查询

统计分组后的数量

按年龄分组,然后统计每个年龄人数 count(*) ,age xxx group by age

非文档字段分组
GET bank/_search
{
  "aggs": {
    "by_age": {
      "terms": {
      # age 为数值,可以直接分组
        "field": "age"
      }
    }
  }
}
文档字段分组
GET bank/_search
{
  "aggs": {
    "by_age": {
      "terms": {
        "field": "city"
      }
    }
  }
}

直接使用文档字段分组会报错。
Elasticsearch 基本使用(四)聚合查询,Elasticsearch,elasticsearch,搜索引擎,大数据
ES没有对文本字段聚合,排序等操作优化;如果对文本字段进行分组,推荐使用 关键字字段
改为关键字分组

GET bank/_search
{
  "aggs": {
    "by_age": {
      "terms": {
        "field": "city.keyword"
      }
    }
  }
}

Elasticsearch 基本使用(四)聚合查询,Elasticsearch,elasticsearch,搜索引擎,大数据
但是,ES默认只返回10条分组数据;如果要返回更多分组数据,需要在聚合里面使用 size 字段

GET bank/_search
{
  "aggs": {
    "by_age": {
      "terms": {
        "field": "city.keyword",
        "size": 1000
      }
    }
  }
}

可以看到,返回了更多的分组数据
Elasticsearch 基本使用(四)聚合查询,Elasticsearch,elasticsearch,搜索引擎,大数据

其他聚合运算

在使用 terms时,ES会根据指定字段进行分组;此时得到的结果集是

"buckets" : [
        {
          "key" : 分组字段的值,
          "doc_count" : 当前分组数量
        }
]        
统计平均值

如果,我们要基于当前分组,进行其他聚合运算呢。
比如,我按照年龄分组,统计数量;
然后我要统计每个分组内,账户余额的平均值呢。

# 基于年龄分组的基础上,统计账户余额平均值
GET bank/_search
{
  "size": 0, 
  "aggs": {
    "by_age": {
      "terms": {
        "field": "age",
        "size": 1000
      },
      "aggs": {
        "avg_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}
统计总金额

如果还要基于账户余额平均值的基础上,还要进行其他聚合运算,可以直接在 内部的 aggs 内添加其他聚合函数。比如,我不仅要统计平均值,还要统计每个分组内的账户总金额。

# 基于统计账户余额平均值的基础上,再统计每个分组下,账户总金额
GET bank/_search
{
  "size": 0, 
  "aggs": {
    "by_age": {
      "terms": {
        "field": "age",
        "size": 1000
      },
      "aggs": {
        "avg_balance": {
          "avg": {
            "field": "balance"
          }
        },
        "sum_balance":{
          "sum": {
            "field": "balance"
          }
        }
      }
    }
  }
}
统计最大值

再统计一个,基于年龄的分组下,账户余额的最大值

# 基于统计账户余额平均值和总金额的基础上,再统计每个分组下,账户最大余额
GET bank/_search
{
  "size": 0, 
  "aggs": {
    "by_age": {
      "terms": {
        "field": "age",
        "size": 1000
      },
      "aggs": {
        "avg_balance": {
          "avg": {
            "field": "balance"
          }
        },
        "sum_balance":{
          "sum": {
            "field": "balance"
          }
        },
        "max_balance":{
          "max": {
            "field": "balance"
          }
        }
      }
    }
  }
}
自定义聚合结果排序

默认,ES的聚合以分组内数量倒序排序。
我们基于上面最后的统计结果,自定义聚合结果排序

  • 默认排序方式
    Elasticsearch 基本使用(四)聚合查询,Elasticsearch,elasticsearch,搜索引擎,大数据
  • 按数量升序
    之前说过,默认分组,提供了两个字段的返回;
    key 和 doc_count,如果要自定义这两个基本字段排序方式,需要在前面加上 下划线 _当然还可以按照其他聚合函数的结果排序
GET bank/_search
{
  "size": 0, 
  "aggs": {
    "by_age": {
      "terms": {
        "field": "age",
        "size": 1000,
        "order": {
        # 数量升序/降序
          "_count": "asc/desc"
          # key 升序/降序
          "_key": "asc/desc",
          # 按平均值升序/降序
          "avg_balance":"asc/desc",
          # 按总金额值升序/降序
          "sum_balance":"asc/desc",
          # 按最大值升序/降序
          "max_balance":"asc/desc",
        }
      },
      "aggs": {
        "avg_balance": {
          "avg": {
            "field": "balance"
          }
        },
        "sum_balance":{
          "sum": {
            "field": "balance"
          }
        },
        "max_balance":{
          "max": {
            "field": "balance"
          }
        }
      }
    }
  }
}
简单聚合小结

总之,一句话。
分组逻辑在外面的 aggs,使用的是 terms 指定分组字段;默认,附带每个分组内数量统计。
基于此分组的其他聚合运算,aggs 内再定义一个 aggs,用于定义其他聚合运算。
自定义聚合结果排序,在aggs -> terms 下使用 order 指定排序字段及其排序方式,但是,经过测试,直接写多个字段排序时,只有最后一个生效

多字段聚合查询

上面的聚合查询,我们都是基于一个字段进行查询。
那么如何实现按多个字段进行分组呢?

我们先看看,在上面额外聚合运算上使用 terms 的效果

  • 先对 age分组,再对gender(文档字段,需使用关键字形式)分组,看看效果
GET bank/_search
{
  "size": 0, 
  "aggs": {
    "by_age": {
      "terms": {
        "field": "age",
        "size": 1000,
        "order": {
          "_count": "desc"
        }
      },
      "aggs": {
        "by_gender":{
          "terms": {
            "field": "gender.keyword",
            "size": 1000
          }
        }
        
      }
    }
  }
}

Elasticsearch 基本使用(四)聚合查询,Elasticsearch,elasticsearch,搜索引擎,大数据
可以看到,得到的结果是一个带有层级结构的数据,这在某些场景下可能有用;但常规的多字段分组可不是这样的,我们通常需要一个扁平化的排序结果

  • 使用 script 替代 field ,定义分组字段
    script :使用脚本,运算一个结果来作为分组字段。
    使用以下 脚本替代 field
    "script": {
        "inline": "doc['age'].value +'-'+ doc['gender.keyword'].value "
    }
    

以上脚本的意思是,使用 age-gender 作为分组依据,注意,这里依然要注意文档字段 .keyword 的问题,以下是完整脚本

# 按多个字段分组,这里按照 年龄-性别 分组,不能直接使用 field 分组,要使用 script 构建分组内容;按默认的数量倒序
GET bank/_search
{
  "size": 0, 
  "aggs": {
    "by_state": {
      "terms": {
        "script": {
                    "inline": "doc['age'].value +'-'+ doc['gender.keyword'].value "
                },
        "size": 1000,
        "order": {
          "_count": "desc"
        }
      },
      "aggs": {
        "avg_balance": {
          "avg": {
            "field": "balance"
          }
        },
        "sum_balance":{
          "sum": {
            "field": "balance"
          }
        },
        "max_balance":{
          "max": {
            "field": "balance"
          }
        }
      }
    }
  }
}

可以看到,按照预期进行了分组
Elasticsearch 基本使用(四)聚合查询,Elasticsearch,elasticsearch,搜索引擎,大数据
至于基于分组的其他聚合运算,排序等操作,和单字段分组一样。文章来源地址https://www.toymoban.com/news/detail-520409.html

到了这里,关于Elasticsearch 基本使用(四)聚合查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch之聚合查询介绍与使用(附RestAPI代码案例)

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将介绍Elasticsearch搜索引擎之聚合查询的介绍与使用,这块内容不作为面试中的重点。 如果文章有什么需要改进的地方还请大佬不吝赐教 👏👏。 小威在此先感谢各位大佬啦~~🤞🤞 🏠个人主页:小威

    2023年04月13日
    浏览(28)
  • Elasticsearch的子聚合查询和使用SpringDataElasticSearch如何实现三级的子查询

    文档中存在字段year(年),volume(卷),issue(期)三个字段,现有需求如下:需要先根据year进行聚合并且降序,然后根据volume字段在年聚合后再次聚合,issue字段则在以上两字段的聚合后再次聚合,效果图如下: 检索结果: 实现效果: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/

    2024年02月16日
    浏览(27)
  • 原生语言操作和spring data中RestHighLevelClient操作Elasticsearch,索引,文档的基本操作,es的高级查询.查询结果处理. 数据聚合.相关性系数打分

    ​ Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasti

    2024年02月05日
    浏览(56)
  • elasticsearch(ES)分布式搜索引擎04——(数据聚合,自动补全,数据同步,ES集群)

    **聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近

    2024年02月08日
    浏览(36)
  • Elasticsearch查询以及聚合查询

    must:返回的文档必须满足子句的条件,并且参与计算分值 filter:返回的文档必须满足filter子句的条件,不会参与计算分值 should:返回的文档可能满足should子句的条件。 must_nout:返回的文档必须不满足must_not定义的条件。 注意:如果一个查询既有filter又有should,那么至少包含

    2023年04月13日
    浏览(40)
  • 微服务04 分布式搜索引擎 elasticsearch DSL数据聚合 自动补全 数据同步 集群 Sentinel

    聚合(aggregations)可以让我们极其 方便的实现对数据的统计、分析、运算 。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些 统计功能的比数据库的sql要方便的多,而且查询速度非常快 ,可以实现近

    2024年02月11日
    浏览(36)
  • Elasticsearch 基本使用(二)简单查询 & 嵌套查询

    按id查询单条记录 查询所有数据 默认只查询10条记录 设置分页条件 设置排序 两种设置方式 注意:_id 为字符串,其排序方式为按位比较,并非数值大小 filter 过滤 在 bool 查询内,可以使用 filter 对数据进行过滤。 单从最终数据来看,filter 也是用于过滤数据,用于条件查询。

    2024年02月03日
    浏览(22)
  • Elasticsearch 基本使用(三)条件查询

    term 单词查询 对于不分词的字段( 数组 视同普通字段,查询数组字段时,只要匹配上一项就算匹配) 条件直接匹配字段值 对于分词的字段;在字段 倒排索引表,仅限分词结果 内查找条件值 terms 同样是单词查询;但条件值可以是多个值,效果为 term1 or term2 should : [ {term1…

    2024年02月11日
    浏览(31)
  • elasticsearch聚合查询实践

    概念 聚合分类 聚合语法 聚合作用范围及排序 聚合原理及 terms 精准度 聚合实验 桶聚合 指标聚合 Pipeline 聚合 实践一:多商户数据权限聚合分页 实践二:多维度嵌套聚合 实践三:删除 ES 索引重复数据 附:实验环境 用于聚合的字段必须是 exact value ,即 doc_value=true 。分词字

    2024年02月03日
    浏览(39)
  • elasticsearch的聚合查询

    聚合基本格式 其中NAME表示当前聚合的名字,可以取任意合法的字符串,AGG_TYPE表示聚合的类型,常见的为分为多值聚合和单值聚合 例子 上面的例子表示查询当前库里面的likeCount的和,返回结果: 返回结果中默认会包含命中的document,所以需要把size指定为0,结果中的sum_all为

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包