Elasticsearch(三)聚合基本使用

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

基础概念

bucket

数据分组,一些数据按照某个字段进行bucket划分,这个字段值相同的数据放到一个bucket中。可以理解成Java中的Map<String, List>结构,类似于Mysql中的group by后的查询结果。

metric:

对一个数据分组执行的统计,比如计算最大值,最小值,平均值等 类似于Mysql中的max(),min(),avg()函数的值,都是在group by后使用的。

案例

以如下文档结构为例:

{
  "_index" : "zb_notice",
  "_type" : "_doc",
  "_id" : "4451224572914342308301065",
  "_score" : 1.0,
  "_source" : {
    "_class" : "NoticeEntity",
    "id" : "111",
    "url" : "https://xxxxxx/purchaseNotice/view/111?",
    "owner" : "河管养所",
    "procurementName" : "工程建筑",
    "procurementNameText" : "应急抢险配套工程建筑",
    "intermediaryServiceMatters" : "无(属于非行政管理的中介服务项目采购)",
    "investmentApprovalProject" : "是",
    "code" : "789456",
    "scale" : 3.167183E8,
    "scaleText" : "投资额(¥316,718,300.00元)",
    "area" : "",
    "requiredServices" : "工程建筑",
    "typeCodes" : [
      "021"
    ],
    "context" : "是一座具有灌溉 、供水 、排洪 、交通和挡潮蓄淡等多功能的大(2)型水闸工程,承担黄冈河下游 8.65 万亩农田的灌溉任务并",
    "timeLimit" : "具体时限以合同条款约定为准。",
    "amount" : 0.0,
    "amountText" : "暂不做评估与测算",
    "amountDescription" : "",
    "selectIntermediaryType" : "直接选取",
    "isChooseIntermediary" : "否",
    "isAvoidance" : "否",
    "endTime" : "2023-09-04 09:30:00",
    "startTime" : "2023-08-31",
    "files" : [
      {
        "fileName" : "东溪水闸初设批复(1).pdf",
        "url" : "/aa/bb/file/downloadfile/PjAttachment/123456"
      }
    ]
  }
}

统计服务类型最多公告
GET zb_notice/_search
{
  "size": 0,
  "aggs": {
    "song_qty_by_language": {
      "terms": {
        "field": "requiredServices"
      }
    }
  }
}

语法解释:

  • size:0 表示只要统计后的结果,原始数据不展现
  • aggs:固定语法 ,聚合分析都要声明aggs
  • song_qty_by_language:聚合的名称,可以随便写,建议规范命名
  • terms:按什么字段进行分组
  • field:具体的字段名称

响应结果如下:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 5,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "song_qty_by_language": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "doc_count": 5
        }
      ]
    }
  }
}

语法解释:

  • hits: 由于请求时设置了size:0,hits就是空的
  • aggregations:聚合查询的结果
  • song_qty_by_language:请求时声明的名称
  • buckets:根据指定字段查询后得到的数据分组集合,[]内的是每一个数据分组,其中key为每个bucket的对应指定字段的值,doc_count为统计的数量。

默认按doc_count降序排序。

按服务分类的平均服务价格
GET zb_notice/_search
{
  "size": 0,
  "aggs": {
    "lang": {
      "terms": {
        "field": "requiredServices"
      },
      "aggs": {
        "length_avg": {
          "avg": {
            "field": "amount"
          }
        }
      }
    }
  }
}

这里为两层aggs聚合查询,先按服务类型统计,得到数据分组,再在数据分组里算平均价格。

多个aggs嵌套语法也是如此,aggs代码块的位置即可。

统计最多服务费、最少服务费等的公告

最常用的统计:count,avg,max,min,sum,语法含义与mysql相同。

GET zb_notice/_search
{
  "size": 0,
  "aggs": {
    "color": {
      "terms": {
        "field": "requiredServices"
      },
      "aggs": {
        "length_avg": {
          "avg": {
            "field": "amount"
          }
        },
        "length_max": {
          "max": {
            "field": "amount"
          }
        },
        "length_min": {
          "min": {
            "field": "amount"
          }
        },
        "length_sum": {
          "sum": {
            "field": "amount"
          }
        }
      }
    }
  }
}
按上架日期分段统计服务类型数量

按月统计

date histogram与histogram语法类似,搭配date interval指定区间间隔 extended_bounds表示最大的时间范围。

复制代码GET zb_notice/_search
{
  "size": 0,
  "aggs": {
    "sales": {
      "date_histogram": {
        "field": "publishTime",
        "interval": "month",
        "format": "yyyy-MM-dd",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "2023-01-01",
          "max": "2023-12-31"
        }
      }
    }
  }
}

interval的值可以天、周、月、季度、年等。可以延伸一下

GET zb_notice/_search
{
  "size": 0,
  "aggs": {
    "sales": {
      "date_histogram": {
        "field": "publishTime",
        "interval": "quarter",
        "format": "yyyy-MM-dd",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "2019-01-01",
          "max": "2019-12-31"
        }
      },
      "aggs": {
        "lang_qty": {
          "terms": {
            "field": "requiredServices"
          },
          "aggs": {
            "like_sum": {
              "sum": {
                "field": "amount"
              }
            }
          }
        },
        "total" :{
          "sum": {
            "field": "amount"
          }
        }
      }
    }
  }
}
带上过滤条件

聚合查询可以和query搭配使用,相当于mysql中where与group by联合使用文章来源地址https://www.toymoban.com/news/detail-709500.html

查询条件
GET zb_notice/_search
{
  "size": 0,
  "query": {
    "match": {
      "requiredServices": "工程咨询"
    }
  },
  "aggs": {
    "sales": {
      "terms": {
        "field": "requiredServices"
      }
    }
  }
}
过滤条件
GET zb_notice/_search
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "requiredServices": "工程咨询"
        }
      }
    }
  },
  "aggs": {
    "sales": {
      "terms": {
        "field": "requiredServices"
      }
    }
  }
}

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

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

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

相关文章

  • 使用Elasticsearch进行分组聚合统计

    要使用Elasticsearch进行分组聚合统计,可以使用聚合(aggregation)功能。聚合操作允许您根据指定的条件对文档进行分组,并计算每个分组的聚合结果。 针对普通类型的字段,DSL构建语法: aggs: aggregations的别名,代表着分组 agg_name: 这个是自定义的名字,可以针对你自己

    2024年02月15日
    浏览(31)
  • 聚合在Elasticsearch中的使用及示例验证

    系统中使用的ES环境不一定每篇文章都有,但是可以在合集中找到,关注《醉鱼Java》一起进步 elasticsearch 8.1 什么是聚合? 在Elasticsearch中,聚合是一种功能强大的数据处理技术,它允许我们对索引中的数据进行多种计算和分析操作。聚合可以理解为对数据集进行分组,并在每

    2024年02月13日
    浏览(24)
  • Elasticsearch使用篇 - 直方图聚合、日期直方图聚合、自动日期直方图聚合

    [ˈhɪstəˌɡræm] ,直方图聚合。属于分桶聚合。 基于数值类型的字段或者数值范围类型的字段进行聚合。按照固定间隔动态构建分桶。 field:用于聚合的字段。 interval:指定每个桶之间的间隔。该值必须是一个大于 0 的双精度浮点数。 keyed:默认 false,则使用数组格式返回数

    2024年01月20日
    浏览(33)
  • Elasticsearch使用msearch提高聚合效率(与search检索对比)

    数据量共约3000万+,在使用es进行term聚合的时候,发现执行耗费时间巨大,因此采用了msearch的检索方式 多搜索接口编辑 多搜索 API 从单个 API 请求执行多个搜索。 请求的格式类似于批量 API 格式,并使用 换行符分隔的 JSON (NDJSON) 格式。 结构类型于下 使用kibana进行msearch操

    2024年02月12日
    浏览(30)
  • Elasticsearch之聚合查询介绍与使用(附RestAPI代码案例)

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

    2023年04月13日
    浏览(28)
  • ElasticSearch(7.8版本)聚合查询使用javaHighLevelRestClient实现(从MySQL聚合查询概念->ES聚合概念及实操)

    申明:本文是在实现ES聚合功能中,将过程中查找的多篇博客文献拼接在一起,参考到的博文全部在标题中附上了原文的超链接,分享出来仅是为了提做一个笔记以防忘记,并给大家提供一个参考。 聚合操作指的是在数据查找基础上对于数据进一步整理筛选行为,聚合操作也

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

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

    2024年02月05日
    浏览(56)
  • Elasticsearch的子聚合查询和使用SpringDataElasticSearch如何实现三级的子查询

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

    2024年02月16日
    浏览(27)
  • 【Elasticsearch】Elasticsearch基本使用

    1.1 安装ES Elasticsearch下载地址 要求:JDK1.8+ Elasticsearch 与 Tomcat 类似,下载安装包后解压即可使用。我这里下载的是最新的 7.6.2 版本 解压后,首先设置跨域支持,后面可能用得上(连接es相关工具)。在 ./config/elasticsearch.yml 中添加跨域支持 在 bin 目录上方地址栏输入 cmd 打开终端输入

    2024年02月08日
    浏览(23)
  • ElasticSearch基本使用--ElasticSearch文章一

    https://www.elastic.co/cn/ 1、在当前软件行业中,搜索是一个软件系统或平台的基本功能, 学习ElasticSearch就可以为相应的软件打造出良好的搜索体验。 2、其次,ElasticSearch具备非常强的大数据分析能力。虽然Hadoop也可以做大数据分析,但是ElasticSearch的分析能力非常高,具备Hadoo

    2024年02月14日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包