Elasticsearch实战(十三)---聚合搜索Aggs聚合及Count,Avg操作

2023-11-07

Elasticsearch实战- 聚合搜索Aggs聚合及Count,Avg操作

1.聚合搜索 bucket 桶及metric分析计算
  • bucket 就是聚合搜索时候的分组,类似Mysql的GroupBy, 比如统计销售部 有张三,李四, 技术部有 王五,赵六 ,group by 部门 部门就是分组 桶 bucket
  • metric 就是对桶内的数据进行统计分析,比如 销售部 有2个员工, 技术部有2个员工, 对桶内数据进行统计分析 如 求和,最大值,最小值,平均值 等分析就是 metric
1.1 准备数据
POST /testcopy/_bulk
{"index":{"_id": 1}}
{"empId" : "111","name" : "员工1","age" : 20,"sex" : "男","mobile" : "19000001111","salary":1333,"deptName" : "技术部","provice" : "湖北省","city":"武汉","area":"光谷大道","address":"湖北省武汉市洪山区光谷大厦","content" : "i like to write best elasticsearch article"}
{"index":{"_id": 2}}
{"empId" : "222","name" : "员工2","age" : 25,"sex" : "男","mobile" : "19000002222","salary":15963,"deptName" : "销售部","provice" : "湖北省","city":"武汉","area":"江汉区","address" : "湖北省武汉市江汉路","content" : "i think java is the best programming language"}
{"index":{"_id": 3}}
{ "empId" : "333","name" : "员工3","age" : 30,"sex" : "男","mobile" : "19000003333","salary":20000,"deptName" : "技术部","provice" : "湖北省","city":"武汉","area":"经济技术开发区","address" : "湖北省武汉市经济开发区","content" : "i am only an elasticsearch beginner"}
{"index":{"_id": 4}}
{"empId" : "444","name" : "员工4","age" : 20,"sex" : "女","mobile" : "19000004444","salary":5600,"deptName" : "销售部","provice" : "湖北省","city":"武汉","area":"沌口开发区","address" : "湖北省武汉市沌口开发区","content" : "elasticsearch and hadoop are all very good solution, i am a beginner"}
{"index":{"_id": 5}}
{ "empId" : "555","name" : "员工5","age" : 20,"sex" : "男","mobile" : "19000005555","salary":9665,"deptName" : "测试部","provice" : "湖北省","city":"高新开发区","area":"武汉","address" : "湖北省武汉市东湖隧道","content" : "spark is best big data solution based on scala ,an programming language similar to java"}
{"index":{"_id": 6}}
{"empId" : "666","name" : "员工6","age" : 30,"sex" : "女","mobile" : "19000006666","salary":30000,"deptName" : "技术部","provice" : "武汉市","city":"湖北省","area":"江汉区","address" : "湖北省武汉市江汉路","content" : "i like java developer"}
{"index":{"_id": 7}}
{"empId" : "777","name" : "员工7","age" : 60,"sex" : "女","mobile" : "19000007777","salary":52130,"deptName" : "测试部","provice" : "湖北省","city":"黄冈市","area":"边城区","address" : "湖北省黄冈市边城区","content" : "i like elasticsearch developer"}
{"index":{"_id": 8}}
{"empId" : "888","name" : "员工8","age" : 19,"sex" : "女","mobile" : "19000008888","salary":60000,"deptName" : "技术部","provice" : "湖北省","city":"武汉","area":"汉阳区","address" : "湖北省武汉市江汉大学","content" : "i like spark language"}
{"index":{"_id": 9}}
{"empId" : "999","name" : "员工9","age" : 40,"sex" : "男","mobile" : "19000009999","salary":23000,"deptName" : "销售部","provice" : "河南省","city":"郑州市","area":"二七区","address" : "河南省郑州市郑州大学","content" : "i like java developer"}
{"index":{"_id": 10}}
{"empId" : "101010","name" : "张湖北","age" : 35,"sex" : "男","mobile" : "19000001010","salary":18000,"deptName" : "测试部","provice" : "湖北省","city":"武汉","area":"高新开发区","address" : "湖北省武汉市东湖高新","content" : "i like java developer i also like  elasticsearch"}
{"index":{"_id": 11}}
{"empId" : "111111","name" : "王河南","age" : 61,"sex" : "男","mobile" : "19000001011","salary":10000,"deptName" : "销售部",,"provice" : "河南省","city":"开封市","area":"金明区","address" : "河南省开封市河南大学","content" : "i am not like  java "}
{"index":{"_id": 12}}
{"empId" : "121212","name" : "张大学","age" : 26,"sex" : "女","mobile" : "19000001012","salary":1321,"deptName" : "测试部",,"provice" : "河南省","city":"开封市","area":"金明区","address" : "河南省开封市河南大学","content" : "i am java developer  thing java is good"}
{"index":{"_id": 13}}
{"empId" : "131313","name" : "李江汉","age" : 36,"sex" : "男","mobile" : "19000001013","salary":1125,"deptName" : "销售部","provice" : "河南省","city":"郑州市","area":"二七区","address" : "河南省郑州市二七区","content" : "i like java and java is very best i like it do you like java "}
{"index":{"_id": 14}}
{"empId" : "141414","name" : "王技术","age" : 45,"sex" : "女","mobile" : "19000001014","salary":6222,"deptName" : "测试部",,"provice" : "河南省","city":"郑州市","area":"金水区","address" : "河南省郑州市金水区","content" : "i like c++"}
{"index":{"_id": 15}}
{"empId" : "151515","name" : "张测试","age" : 18,"sex" : "男","mobile" : "19000001015","salary":20000,"deptName" : "技术部",,"provice" : "河南省","city":"郑州市","area":"高新开发区","address" : "河南省郑州高新开发区","content" : "i think spark is good"}
2.count 统计计数
2.1统计 每个部门有多少人
#统计每个部门多少人
get /testcopy/_search
{
  "size":0,
  "aggs":{
    "count_by_deptname":{
      "terms": {
        "field": "deptName",
        "order": {
          "_key": "desc"
        }, 
        "size": 10
      }
    }
  }
}

统计出错
“reason” : “Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [deptName] in order to load field data by uninverting the inverted index. Note that this can use significant memory.”

 "root_cause" : [
      {
        "type" : "illegal_argument_exception",
        "reason" : "Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [deptName] in order to load field data by uninverting the inverted index. Note that this can use significant memory."
      }

然后 排查发现是 因为 我要统计的部门 deptName字段 是text类习惯, text类型 没有设置 fielddata=true, 且被用于 aggs聚合排序中,所以要给 需要统计的字段进行 设置 fielddata
解决办法

#执行 设置 fielddata
PUT testcopy/_mapping
{
  "properties": {
    "deptName": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

查询结果, 可以查处结果,但是不是自己想要的,因为 销售部 被拆分成了 “销”,“售”,"部"单独做了统计,而现在我是要 整个销售部的 统计
在这里插入图片描述

修改查询语句, 把整个 deptName 当作keyword 不分词处理查询

get /testcopy/_search
{
  "size":0,
  "aggs":{
    "count_by_deptname":{
      "terms": {
        "field": "deptName.keyword",
        "order": {
          "_key": "desc"
        }, 
        "size": 10
      }
    }
  }
}

查看结果
是我们想要的, 销售部 4人, 测试部 3人, 技术部 4人
在这里插入图片描述

3.Avg求平均,先分组count,然后在求平均数avg
3.1 统计每个部门的人数及平均年龄

求每个部门的 人数及 大家平均的年龄, 就是我先要对部门进行分组, 形成一个桶, 然后对桶内的数据 进行求平均数, 然后按照 年龄的升序排列返回结果

#group_dept组内 再次进行 aggs
get /testcopy/_search
{
  "size":0,
  "aggs":{
    "group_dept":{
      "terms": {
        "field": "deptName.keyword",
        "size": 10,
        "order": {
          "aggs_by_age": "asc"
        }
      },
      //group桶内 进行avg操作
      "aggs": {
        "aggs_by_age": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}

查看结果,结果是按照 平均年龄升序 进行排列

  1. 技术部 4人,平均年龄 24.75
  2. 销售部 4人,平均年龄 30.25
  3. 测试部 3 人,平均年龄 38.33
    在这里插入图片描述
    我们查一下 测试部 ,看看统计是否准确, avg平均年龄计算是否准确
#查看 销售部的人 
get /testcopy/_search
{
  "query":{
    "match": {
      "deptName.keyword": "测试部"
    }
  }
}

查看结果 测试部 3人, 年龄 20+60+35 = 115 , 平均年龄 115 / 3 = 38.33 计算正确
在这里插入图片描述

3.2 嵌套分组 先分组,然后组内在分组 如何实现

比如 现在 我想 统计 销售部 下面 有哪些 省份,每个省份有多少人 即 第一次分组 以 销售部分组, 然后再销售部分组内部, 然后再以 provice 省份做分组, 我们先把 provice 要进行 aggs 的字段 加上 fielddata设置

#给 provice 要聚合的字段 加上 fielddata 配置
PUT testcopy/_mapping
{
  "properties": {
    "provice": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

双重分组, 组内再次进行分组如何实现

#部门分组后, 再桶内 再对省份 分组

get /testcopy/_search
{
  "size":0,
  "aggs":{
    "group_by_dept":{
      "terms": {
        "field": "deptName.keyword",
        "size": 10
      },
      "aggs": {
        "provice_count": {
          "terms": {
            "field": "provice.keyword",
            "size": 10
          }
        }
      }
    }
  }
}

查看结果, 满足我们的需求

  1. 技术部 4人下面 分了 湖北省 和 武汉市(省份), 然后湖北省 3个人, 武汉市 1个人
  2. 销售部 4人下面分了 湖北省 和 河南省, 然后 湖北省2人, 河南省 2人
  3. 测试部 3人,全部都是 湖北省 的
    在这里插入图片描述
3.3 嵌套分组内 再进行 avg计算

上面我们进行了嵌套分组, 先以部门 分组, 然后以 省份 分组, 现在我想再加一个统计分许, 统计 每个部门,每个省份的人的 平均年龄
等于是 3步操作, 比上一个更加复杂了

  1. 先分组 部门 deptName
  2. 在分组 省份 provice
  3. 然后再aggs 统计avg年龄
#嵌套多层 进行 avg 求平均数
get /testcopy/_search
{
  "size":0,
  "aggs":{
    "group_by_dept":{
      "terms": {
        "field": "deptName.keyword",
        "size": 10
      },
      //deptname 分组内 进行 aggs
      "aggs": {
        "group_by_provice": {
          "terms": {
            "field": "provice.keyword",
            "size": 10
          },
          //provice 分组内 进行 aggs 求avg
          "aggs": {
            "avg_by_age": {
              "avg": {
                "field": "age"
              }
            }
          }
        }
      }
    }
  }
}

我们查看下结果
技术部 下面 湖北省 3人, 平均年龄 23, 武汉市 1人,平均年龄 30
在这里插入图片描述

我们现在搜一下 技术部的 人, 看下年龄分布 是不是上面聚合的结果

#查 技术部, 湖北省的人 的年龄
get /testcopy/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "match": {
            "deptName.keyword": "技术部"
          }
        },
        {
          "match": {
            "provice": "湖北省"
          }
        }
      ] 
    }
  },
  "_source":["deptName","provice","age"]
}

查询结果 ( 20+30+19 )= 69 / 3 = 23 ,平均年龄就是23 ,上面的聚合结果是准确的
在这里插入图片描述


至此 我们已经学习了 聚合搜索 aggs 的基本用法, count , avg等 聚合操作, 下一篇,我们介绍下 更加复杂的聚合操作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch实战(十三)---聚合搜索Aggs聚合及Count,Avg操作 的相关文章

随机推荐

  • Office project 2021安装

    哈喽 大家好 今天一起学习的是project 2021的安装 Microsoft Office project项目管理工具软件 凝集了许多成熟的项目管理现代理论和方法 可以帮助项目管理者实现时间 资源 成本计划 控制 有兴趣的小伙伴也可以来
  • VALSE 文档图像智能报告整理

    目录 引言 端到端检测识别 探索检测和识别的协同作用 减少对标注的依赖 去除一些不必要的组件 文字擦除和编辑 文字辅助场景理解 视频文字擦除和文档矫正 文字识别 自监督预训练 对比学习 更高效的语言模型 手写数学公式识别 文档图像理解 视频
  • java创建数据库连接和对数据库操作的主要步骤

    Java创建数据库连接和对数据库操作的主要五个步骤如下 1 加载数据库驱动 使用 Class forName 方法加载指定的数据库驱动类 例如加载MySQL的驱动类 Class forName com mysql jdbc Driver 2
  • 基于LINUX策略路由的实现

    一 网络结构eth0 10 43 128 10 gw 10 43 0 254 gt interneleth1 61 144 64 106 gw 61 144 64 1 gt interneleth2 192 168 0 2 gw 192 1
  • python判断网络是否通

    提供两种方法 netstats py coding gbk import myarp import os class netStatus def internet on self ip 192 168 150 1 os system arp
  • 软件架构设计(四) 基于服务的架构(SOA)

    前面我们了解到了层次架构中表示层的架构分层 分为了MVC MVP MVVM等架构风格 下面我们了解一下SOA架构与微服务架构 什么是服务 服务是一种为了满足某项业务需求的操作 规则等的逻辑组合 它包含了一系列有序活动的交互 为实现用户目标提
  • Xshell 提示 “找不到匹配的host key算法”

    记录 Xshell 6 使用中遇到的 找不到匹配的host key算法 问题 问题现象 ssh远程服务器直接弹窗提示 找不到匹配的host key算法 检查点 首先查看下 sshd 的配置文件 etc ssh sshd config 确认下
  • 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目链接 53 I 在排序数组中查找数字 I 思路分析 利用二分查找即可 class Solution public int search vector
  • QT5.15.2在线安装教程(详细图文)

    一 在线安装的原因 QT对5 15以及以上版本已经停止提供离线安装包 但是 5 15以及以上版本都支持在线安装 Qt5 15以下版本可直接在Index of archive qt中下载离线安装包 二 QT账号的注册 1 打开百度 搜索QT
  • 小学科技创新项目的查新报告

    我们也经常看到这些 别人家的孩子 11岁杨荷馨 南京市六合区玉带镇中心小学伸缩式车厢卡车第六届国际发明博览会的银牌 已经申请国家专利 11岁小学生发明节能燃气灶 11岁女 发明家 造智能温控电风扇获金奖 那么现在当你家小朋友也要参加小学科技
  • 四个收敛的关系:一致收敛,点态收敛,绝对收敛,条件收敛

    一致收敛和点态收敛 先看两者定义 一致收敛 任意正数 epsilon 存在 N gt 0 N gt 0 N gt 0 当
  • VUE-CLI测试环境和打包正式环境的配置切换

    config文件夹pro d env js文件 use strict module exports NODE ENV production API ROOT http 120 79 94 143 配置开发端口 config文件夹dev en
  • 化繁为简,使用Hibernate Validator实现参数校验(一)

    目录 前言 环境配置 导入依赖 基础校验 校验注解 参数绑定 PathVariable RequestParam RequestBody Validated Valid 单参校验 对象校验 分组校验 顺序校验 前言 在之前的悦享校园的开发中
  • docker 离线安装

    目录 服务介绍 软件下载 服务配置 二进制安装docker与docker compose 服务管理命令 服务介绍 docker 是一个供开发和运维人员开发 测试 部署和运行应用的容器平台 docker compose 是一个用于运行和管理多
  • 缓存案例-架构真题(二十二)

    试题一 某大型电商平台建立一个B2B商店系统 并在全国建设了仓储中心 但是在运营过程中 发现很多跨仓储中心调货 延误运送 为此建立全国仓储系统 通过对订单的分析和挖掘 并通过大数据分析预测各类配置 降低成本 当用户通过B2B商店下单 会通过
  • Notepad++ - 缓存目录

    C Users 你的用户名 AppData Roaming Notepad backup 被360清理了 或者程序崩溃了 死机了 都可以在这里找到
  • 华为OD机试经验(A 卷 2022Q4)

    文章目录 1 汇率 2 箱子之字形摆放 3 Excel单元格数值统计 先打个小广告 在我的Hr的指导帮助下 顺利通过了机试 两轮技术面 由于今年顺利研究生上岸 所以没有进行主管面试了 向各位想去华为OD的小伙伴们推荐我的对接Hr微信 蒋虎
  • 【亲测有用】腾讯会议共享PPT,并开启演讲者模式

    出发点 腾讯会议共享PPT 开启演讲者模型 并且观看屏幕的人根本看不到你的演讲者模型 我这边Win10亲测有用 我单笔记本屏幕测试 原理解释 通过播放PPT 产生了一个全屏 可以把它理解为是扩展屏 然后切回演讲者模式的那个屏幕 可以理解为电
  • Redis7--基础篇1(概述,安装、卸载及配置)

    1 Redis概述 1 1 什么是Redis Redis REmote Dictionary Server 远程字典服务器 Remote Dictionary Server 远程字典服务 是完全开源的 使用ANSIC语言编写遵守BSD协议
  • Elasticsearch实战(十三)---聚合搜索Aggs聚合及Count,Avg操作

    Elasticsearch实战 聚合搜索Aggs聚合及Count Avg操作 文章目录 Elasticsearch实战 聚合搜索Aggs聚合及Count Avg操作 1 聚合搜索 bucket 桶及metric分析计算 1 1 准备数据 2