当前位置: 首页 > article >正文

【Elasticsearch系列十一】聚合 DSL API

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

      • 1.all-分组-计数
      • 2.分组-计数
      • 3.搜索-分组
      • 4.分组-平均
      • 5.分组-平均-排序
      • 6.分组-分组-组内平均

1.all-分组-计数

计算每个 studymodel 下的商品数量

sql 语句: select studymodel,count(*) from book group by studymodel

GET /book/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "group_by_model": {
      "terms": { "field": "studymodel" }
    }
  }
}

2.分组-计数

计算每个 tags 下的商品数量

设置字段"fielddata": true,这个步骤很重要,不然会报错

在 es 中,text 类型的字段使用一种叫做 fielddata 的查询时内存数据结构。当字段被排序,聚合或者通过脚本访问时这种数据结构会被创建。它是通过从磁盘读取每个段的整个反向索引来构建的,然后存存储在 java 的堆内存中。

fileddata 默认是不开启的。Fielddata 可能会消耗大量的堆空间,尤其是在加载高基数文本字段时。一旦 fielddata 已加载到堆中,它将在该段的生命周期内保留。此外,加载 fielddata 是一个昂贵的过程,可能会导致用户遇到延迟命中。这就是默认情况下禁用 fielddata 的原因。如果尝试对文本字段进行排序,聚合或脚本访问,将看到以下异常:

“Fielddata is disabled on text fields by default. Set fielddata=true on [your_field_name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.”

在启用 fielddata 之前,请考虑使用文本字段进行聚合,排序或脚本的原因。这样做通常没有意义。text 字段在索引例如 New York 这样的词会被分词,会被拆成 new,york。在此字段上面来一个 terms 的聚合会返回一个 new 的 bucket 和一个 york 的 bucket,当你想只返回一个 New York 的 bucket 的时候就会出现问题。

PUT /book/_mapping/
{
  "properties": {
    "tags": {
      "type": "text",
      "fielddata": true
    }
  }
}

查询

GET /book/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "group_by_tags": {
      "terms": { "field": "tags" }
    }
  }
}

3.搜索-分组

加上搜索条件,计算每个 tags 下的商品数量

GET /book/_search
{
  "size": 0,
  "query": {
    "match": {
      "description": "java程序员"
    }
  },
  "aggs": {
    "group_by_tags": {
      "terms": { "field": "tags" }
    }
  }
}

4.分组-平均

先分组,再算每组的平均值,计算每个 tag 下的商品的平均价格

GET /book/_search
{
    "size": 0,
    "aggs" : {
        "group_by_tags" : {
            "terms" : {
              "field" : "tags"
            },
            "aggs" : {
                "avg_price" : {
                    "avg" : { "field" : "price" }
                }
            }
        }
    }
}

5.分组-平均-排序

计算每个 tag 下的商品的平均价格,并且按照平均价格降序排序

GET /book/_search
{
    "size": 0,
    "aggs" : {
        "group_by_tags" : {
            "terms" : {
              "field" : "tags",
              "order": {
                "avg_price": "desc"
              }
            },
            "aggs" : {
                "avg_price" : {
                    "avg" : { "field" : "price" }
                }
            }
        }
    }
}

6.分组-分组-组内平均

按照指定的价格范围区间进行分组,然后在每组内再按照 tag 进行分组,最后再计算每组的平均价格

GET /book/_search
{
  "size": 0,
  "aggs": {
    "group_by_price": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 40
          },
          {
            "from": 40,
            "to": 60
          },
          {
            "from": 60,
            "to": 80
          }
        ]
      },
      "aggs": {
        "group_by_tags": {
          "terms": {
            "field": "tags"
          },
          "aggs": {
            "average_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img


http://www.kler.cn/news/309314.html

相关文章:

  • 地平线秋招2025
  • 大数据处理技术:企业岗位需求决策
  • 【机器学习】--- 深度学习中的注意力机制
  • bootstrap application nacos环境配置失效
  • C++——stack和queue的模拟实现
  • 重学SpringBoot3-SpringApplicationRunListener
  • GORM查询指南:高效检索数据
  • 认识数学建模,什么是数学建模
  • 小红书热门系列,风口副业项目AI宠物壁纸号,玩法分享
  • AI教你学Python 第10天 :参数与返回值
  • TAPD卓越版的全面评测:超强的功能与用户体验优势
  • linux下日志系统setvbuf接口及结构体 handle_file_t成员介绍
  • 学习之git的团队协作
  • Qt问题笔记
  • Selenium之下拉框操作详解
  • MySQL5.7-虚拟列
  • Rust 所有权 借用与引用
  • Android 车联网——汽车模块介绍(附1)
  • 【SpringCloud】Spring Cloud 开发环境搭建与基础工程构建
  • TaskingAI实践(一)快速上手
  • 【Java】基础语法介绍
  • 【自动驾驶】决策规划算法 | 数学基础(三)直角坐标与自然坐标转换Ⅱ
  • 论文速递 | 基于MIC-ICEEMD-RIME-DHKELM的碳排放预测模型研究
  • Linux系统上搭建Vulhub靶场
  • OpenCV通过鼠标提前ROI(C++实现)
  • 电机纹波电流与PWM控制周期关系
  • Java并发常见面试题(上)
  • Rust GUI框架Tauri V1 入门
  • 【算法】滑动窗口—字符串的排列
  • 绕过CDN查找真实IP方法