elasearch 聚合查询

ElasticSearch概述 从搜索结果来源的角度,全文搜索引擎又可细分为两种,一种是拥有自己的检索程序(Indexer),俗称“蜘蛛”(Spider)程序或“机器人”(Robot)程序,并自建网页数据库,搜索结果直接从自身的数据库中调用,如上面提到的7家引擎;尽管我们可以随意的新增或者忽略某个字段,但是,每个字段的类型非常重要,比如一个年龄字段类型,可以是字符串也可以是整形。在前面的学习中,我们已经掌握了 es 是什么,同时也把 es 的服务已经安装启动,那么 es 是如何去存储数据,数据结构是什么,又是如何实现搜索的呢? 阅读详情

1. global:就是global bucket,就是将所有数据纳入聚合的scope,而不管之前的query

GET /tvs/sales/_search 
{
  "size": 0, 
  "query": {
    "term": {
      "brand": {
        "value": "长虹"
      }
    }
  },
  "aggs": {
    "single_brand_avg_price": {
      "avg": {
        "field": "price"
      }
    },
    "all": {
      "global": {},
      "aggs": {
        "all_brand_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}
  • 出来两个结果
  • 一个结果,是基于query搜索结果来聚合的,一个聚合操作,必须在query的搜索结果范围内执行
  • 一个结果,是对所有数据执行聚合的

 

2.histogram

histogram桶是将指定字段值在某个范围内的文档聚合在一个桶中,如下图所示,0-19999是一个桶,11000和15000在一个桶内,23000和31000在一个桶内,这就是histogram桶。

GET /cars/transactions/_search
{
  "size":0,                  ---令返回值的hits对象为空
  "aggs":{                   ---聚合命令
   "price":{                 ---聚合字段名称
     "histogram": {          ---桶类型
       "field": "price",     ---指定price字段的值作为判断条件
       "interval": 20000     ---每个桶负责的区间大小为20000
     }
   } 
  }
}

结果

{
  "took" : 57,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 8,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {             ---聚合结果
    "price" : {                  ---请求参数中指定的名称
      "buckets" : [              ---price桶的数据在此数组中
        {
          "key" : 0.0,           ---第一个桶,区间[0-19999],0.0是起始值
          "doc_count" : 3        ---这个区间有三个文档(price值分别是10000、12000、15000)
        },
        {
          "key" : 20000.0,       ---第二个桶,区间[20000-39999],20000.0是起始值
          "doc_count" : 4        ---这个区间有四个文档
        },
        {
          "key" : 40000.0,       ---第三个桶,区间[40000-59999],40000.0是起始值
          "doc_count" : 0        ---这个区间没有文档
        },
       ......

在上面的返回值中,第三个桶中没有文档,在有的业务场景中,我们不需要没有数据的桶,此时可以用min_doc_count参数来控制,如果min_doc_count等于2,表示桶中最少有两条记录才会出现在返回内容中,如下所示,min_doc_count如果等于1

3.histogram桶加metrics

上面的例子返回结果只有每个桶内的文档数,也可以加入metrics对桶中的数据进行处理,例如计算每个区间内的最高价、最低价、平均售价,可以加入max、min、avg参数,如下:

GET /cars/transactions/_search
{
  "size":0,                  ---令返回值的hits对象为空
  "aggs":{                   ---聚合命令
   "price":{                 ---聚合字段名称
     "histogram": {          ---桶类型
       "field": "price",     ---指定price字段的值作为判断条件
       "interval": 20000     ---每个桶负责的区间大小为20000
     },
     "aggs": {               ---表示对桶内数据做metrics
        "max_price": {       ---指定metrics处理结果的字段名
          "max":{            ---metrics类型为max
            "field": "price" ---指定取price字段的值做最大值比较
          }
        },
        "min_price": {       ---指定metrics处理结果的字段名
          "min":{            ---metrics类型为min
            "field": "price" ---指定取price字段的值做最小值比较
          }
        },
        "avg_price": {       ---指定metrics处理结果的字段名
          "avg":{            ---metrics类型为avg
            "field": "price" ---指定取price字段的值计算平均值
          }
        }
      }
   } 
  }
}

es返回数据和说明如下,可见每个桶中的文档都做了三种metrics处理

{
  "took" : 17,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 8,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {             ---聚合结果
    "price" : {                  ---请求参数中指定的名称
      "buckets" : [              ---price桶的数据在此数组中
        {
          "key" : 0.0,           ---第一个区间[0-19999],0.0是起始值
          "doc_count" : 3,       ---这个区间有三条记录(price值分别是10000、12000、15000)
          "max_price" : {        ---指定的metrics结果名称
            "value" : 15000.0    ---桶中有三个文档,price字段的最大值是15000
          },
          "min_price" : {
            "value" : 10000.0    ---桶中有三个文档,price字段的最小值是10000
          },
          "avg_price" : {
            "value" : 12333.333333333334    ---桶中有三个文档,price字段的平均值是12333.333333333334
          }
        },
       ......

 

4.时间区间的桶(date_histogram)

GET /cars/transactions/_search
{
  "size": 0,                    ---令返回值的hits对象为空
  "aggs": {                     ---聚合命令
    "sales": {                  ---聚合字段名称
      "date_histogram": {       ---桶类型
        "field": "sold",        ---用sold字段的值作进行时间区间判断
        "interval": "month",    ---间隔单位是月
        "format": "yyyy-MM-dd"  ---返回的数据中,时间字段格式

                    ,"min_doc_count": 0,---// 为空的话则填充0
                    "extended_bounds": { ---// 需要填充0的范围
                        "min": 1533556800000,
                        "max": 1533806520000
                    }
————————————————
版权声明:本文为优快云博主「大白能」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_28988969/article/details/81565765
      },
      "aggs": {                 ---表示对桶内数据做metrics
        "max_price": {          ---指定metrics处理结果的字段名
          "max":{               ---metrics类型为max
            "field": "price"    ---指定取price字段的值做最大值比较
          }
        },
        "min_price": {          ---指定metrics处理结果的字段名
          "min":{               ---metrics类型为min
            "field": "price"    ---指定取price字段的值做最小值比较
          }
        }
      }
    }
  }
}

es返回数据如下,篇幅所限因此略去了头部和尾部的一些信息,只看关键的

"aggregations" : {                           ---聚合结果
    "sales" : {                              ---请求参数中指定的名称
      "buckets" : [                          ---sales桶的数据在此数组中
        {
          "key_as_string" : "2014-01-01",    ---请求的format参数指定了key的格式
          "key" : 1388534400000,             ---真正的时间字段
          "doc_count" : 1,                   ---2014年1月份的文档数量
          "max_price" : {                    ---2014年1月的文档做了metrics类型为max的处理后,结果在此
            "value" : 80000.0                ---2014年1月的文档中,price字段的最大值
          },
          "min_price" : {                    ---2014年1月的文档做了metrics类型为min的处理后,结果在此
            "value" : 80000.0                ---2014年1月的文档中,price字段的最大值
          }
        },
        {
          "key_as_string" : "2014-02-01",
          "key" : 1391212800000,
          "doc_count" : 1,
          "max_price" : {
            "value" : 25000.0
          },
          "min_price" : {
            "value" : 25000.0
          }
        },
        ......

上面的请求是以一个月作为区间的,如果想以其他时间单位作为区间又该怎么做呢?例如90天,把interval字段写成90d即可,其他粒度的时间间隔写法如下表

5.ranges 自定义范围聚合查询

GET /tt11/_search
{
  "size": 0,
  "aggs": {
    "tt": {
      "range": {
        "field": "classification_score",
        "ranges": [
          {
            "from": 0,   >=0
            "to": 2      <2  
          },
          {
            "from": 2,  >=0
            "to": 4     <4   
          },
           {
            "from": 4  <4
          }
        ]
      }
    }
  }
}

 

[Unity_Plastic SCM小技巧] 使用 UnityYAMLMerge 工具合并场景和预制件文件 首先YAMLMerge工具其实并不局限于PlasticSCM,git也可以,它是内置在Editor内的一个更加智能的版本控制工具,只不过正常不会启用,他的目录在C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe(Unity Editor安装目录),MAC上:/Applications/Unity/Unity.app/Content... 阅读详情

相关推荐

3D Slicer:从入门到精通(二)——入门指南

本篇文章包含开始使用3D Slicer所需的信息,包括如何安装和快速开始使用基本功能,以及在哪里找到更多信息。

walt3433的博客 2万+

ElasticeSearch 统计总条数

本文主要介绍了 Elasticsearch 中统计文档总条数的两种方式:一是利用_count API,可直接获取符合查询条件的文档总数,操作直接;二是借助搜索操作的hits.total.value字段,配合size: 0和track_total_hits参数控制统计精确性与性能。实际使用需结合场景,依需求选方式,平衡准确性和效率。

lhp3000的博客 6105

告别理论!手把手教你用Patran/Nastran搞定悬臂翼的颤振分析(附完整模型文件)

本文提供了一份详细的Patran/Nastran悬臂翼颤振分析实战指南,涵盖从几何建模到结果解读的全过程。通过手把手教学和完整模型文件,帮助工程师和学生快速掌握气动弹性分析技术,特别适合需要实际操作的初学者。文章重点介绍了模态分析、气动建模和颤振求解等关键步骤,并提供了常见问题排查和优化建议。

weixin_30879169的博客 492

ES查询distinct、count、groupby、in、between

ES查询distinct、count、groupby、in、between

haylee的专栏 1973

大型我的世界RPG服务器开服全攻略:从环境配置到插件部署

搭建一个能支撑百人稳定在线的我的世界服务器,远不止选择服务端和安装插件那么简单。服务器架设涉及硬件选型、Java环境、端口放行、启动脚本与systemd守护等基础环节,而大型RPG玩法还依赖MythicMobs、Quests、LuckPerms等插件协同工作。理解这些技术组件的原理与配置逻辑,是确保长线运营的关键。对于希望打造原创剧情、职业副本和自定义Boss的团队而言,合理规划MySQL数据库、RCON批量管理及性能调优,能显著降低后期维护成本。本文围绕RPG服务器核心能力,从环境准备到插件部署,再到常见

weixin_27230891的博客 369

TL3562/3568内核驱动移植实战:解决无锡沐创N500L-AM4网口异常问题

本文详细介绍了在TL3562/3568平台上移植无锡沐创N500L-AM4网卡驱动的实战经验,重点解决了第四个网口通讯异常问题。通过升级驱动版本至rnpgbe-0.2.3,生成关键头文件并正确配置内核,最终实现四个网口稳定工作。文章还提供了性能优化建议和避坑指南,为类似硬件驱动移植项目提供参考。

weixin_28273593的博客 180

Elaticsearch基本使用,2021大厂Java面试经历

删除索引请求格式: DELETE /索引库名 示例: 使用HEAD请求,查看索引是否存在: HEAD /索引库名 示例: 映射配置 索引有了,接下来肯定是添加数据。但是,在添加数据之前必须定义映射。映射是定义文档的过程,文档包含哪些字段,这些字段是否保存,是否索引,是否分词等,配置清楚映射,Elasticsearch会帮我们进行索引库的创建。 创建映射字段: PUT /索引库名/_mapping/类型名称 { "properties": { "字段名": {

m0_60607838的博客 331

Sony SLVS-EC接口实战:如何用Xilinx K7 FPGA接收IMX421传感器数据(附电气特性匹配技巧)

本文详细介绍了在Xilinx Kintex-7 FPGA平台上实现Sony IMX421图像传感器SLVS-EC接口数据接收的完整实战方案。内容涵盖从硬件选型、PCB布局的电气特性匹配技巧,到FPGA内部GTX收发器配置、多通道绑定以及SLVS-EC协议数据解析与图像重组的关键步骤,为高速视觉系统开发提供了宝贵的调试经验和系统集成指导。

efc12345678的博客 261

Elastic Search之Count API(获取符合条件的记录数)

上篇说到elastic search(简称es)中常用的search api,但有时候我们不需要满足条件的原始文档数据,而是需要返回符合条件的文档数,类似于mysql的select count(*)查询条数,es中进行count查询的api的endpoint为"_count",如下示例: 返回的count节点即表示符合条件的匹配数目。"_count"支持多个索引同时查询符合条件的匹配数: ...

分享传递价值 8万+

CListCtrl控件的自绘操作

1、CListCtrl控件 :OwnerDraw Fixed = True,创建一个CListCtrl类的派生类CMyListCtrl,同时创建一个CMyListCtrl控件类型变量:CMyListCtrl m_cList;。 CListCtrl控件的自绘主要是CMyListCtrl类中重写DrawItem虚函数。 流程: 1.主对话框中CListCtrl的一些初始化操作: BOOL

小米的修行之路 3559

【气候极端指数】MATLAB计算各种气候极端指数

简介各类气候极端指数,及其MATLAB计算代码

WW、forever的博客 4916

elasticsearch 简单聚合查询示例

因为懒癌犯了,查询语句使用的截图而不是文字,导致了发布随笔的时候提示少于150字的随笔不能发布。 我就很郁闷了。 下面的查询都是前段时间工作中使用过的查询语句。 开始的时候是使用nodejs构建es查询语法,后来因为有些查询需要关联mysql数据库中的数据, 没有时间再去研究怎样使用nodejs查询mysql数据库,后来改成了使用java api查询的方式。 使用nodejs查询es是真...

weixin_34294649的博客 261

YOLOv11改进策略【模型轻量化】| 使用 MoblieOne 模块,引入结构重参数化,提高模型检测效率

本文记录的是基于MobileOne的YOLOv11骨干网络改进方法研究。MobileOne的基础模块通过重参数化,。在将其替换YOLOv11的骨干网络后,实现模型轻量化。

Limiiiing的博客 1424

Elasearch时间查询及分组统计

/** *从ES中查询数据 *ES的时间如果不设置的话,默认是UTC时间,与北京时间相差8个小时,在查询统计的时候,如果不做统计的话,数据肯定是不准确的。 *ES版本:6.4.1。使用的javaApi是ElasearchHighLevelRestClient6.4 *@parammonthDate(patten:yyyy-MM) *@ret...

weixin_33943836的博客 831

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

elasearch全文查询和词条查询

使用match做全文检索,比较适合text类型,index=true GET my_index/my_type/_search { "query": { "match": { "full_text": "xx yy" } } } term做词条查询,比较适合keyword类型,index=true POST /_search -d { ...

海涛高软 600

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

python elasearch-dsl 查询

python elasearch-dsl 查询 zhanwei 2

LeonTom的博客 426

oracle ela怎么看,Elasearch时间查询及分组统计

/***从ES中查询数据*ES的时间如果不设置的话,默认是UTC时间,与北京时间相差8个小时,在查询统计的时候,如果不做统计的话,数据肯定是不准确的。*ES版本:6.4.1。使用的javaApi是ElasearchHighLevelRestClient6.4*@parammonthDate(patten:yyyy-MM)*@returnList统计结果。*/publi...

weixin_35389904的博客 272

一文搞懂Elasticsearch如何搜索数据

目录前言query string searchquery DSL 前言 我们都知道Elasticsearch是一个搜索服务器,所以搜索是它最重要的功能,所以下面就介绍几种Elasticsearch中搜索数据的方法 query string search 我们搜索某个类型下的全部数据使用的方法为_search方法,如 GET /索引名/类型名/_search 使用上面的url进行请求,我们就可以得到如下数据 { "took" : 103, "timed_out" : false, "_shar

qq_36551991的博客 4198

ElasticSerach基础语法

一、常用查询关键字match查询会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。 2.match_phrase默认使用 match_phrase 时会精确匹配查询的短语,需要全部单词和顺序要完全一样,标点符号除外。 3.match_phrase_prefixmatch_phrase_prefix 和 match_phrase 用法是一样的,区别就在于它允许对最后一个词条前缀匹配。 multi_match 查询 multi_match 查询可以在多个字段上执行相

勿扰博客 554

Elasticsearch 7.x 检索案例(RestHighLevelClient)

1、检索案例 /** * 请求的索引 可以使用 *号通配符 检索符合前缀的所有索引 */ SearchRequest searchRequest = new SearchRequest("t11_pop*"); /** * 请求体 */ SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(

qq_35332013的博客 2789

[ELK实战] Elasticsearch 常用操作 (基于DSL)

为什么不能修改一个字段的type?原因是一个字段的类型修改以后,那么该字段的所有数据都需要重新索引。Elasticsearch底层使用的是lucene库,字段类型修改以后索引和搜索要涉及分词方式等操作。索引库一旦mapping创建后无法修改和删除,但是可以添加新的字段。query下面的参数有match/...

OxYGC 966

关于Elasticsearch的十道面试题

Elasticsearch是什么?跟mysql的区别 java开发的基于lucene分布式全文搜索引擎,基于restful Web接口,在检索领域相当优秀。 ElasticSearch是一个分布式搜索引擎 mysql为关系型数据库是当下Web应用开发中最流行的关系型数据库 Elasticsearch中的类型都是什么? 基本数据类型:long、integer、short、byte、double、float、half_float 浮点数的高精度类型:scaled_float Date:日期类型 El..

weixin_50904269的博客 316

Elasticsearch搜索延迟高?,3步诊断法快速定位并解决瓶颈

快速解决Elasticsearch搜索延迟问题,掌握3步诊断法实现高效搜索优化。适用于高并发、大数据量场景,通过查询分析、索引调优和资源监控精准定位瓶颈,提升响应速度30%以上,值得收藏。

ProcePerch的博客 948

Python-ElasticSearch搜索

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可能是目前存在的,不论开源还是私有的,拥有最先进,高性能和全功能搜索引擎功能的库。但是 Lucene 仅仅只是一个库。为了利用它,你需要编写 Java 程序,并在你的 java 程序里面直接集成 Lucene 包。 更坏的情况是,你需要对信息检索有一定程度的理解才能明...

第一天 264

ElasticSearch的REST接口操作(一)

# 查看集群的健康状态 GET /_cat/health?v # 查看节点状态 GET /_cat/nodes?v # 查看索引的状态 GET /_cat/indices?v # 创建一个索引 PUT /movie_index # 删除索引 DELETE /movie_index # 查看某一个索引的分片情况 GET /_cat/shards/movie_index?v # 创建文档 PUT /movie_index/movie/1 { "id":100, "name":"oper

qq_44665283的博客 335

Elaticsearch基本使用

由于篇幅限制,小编在此截出几张知识讲解的图解range查询找出那些落在指定区间内的数字或者时间“query”:{“range”: {“price”: {fuzzy查询是term查询的模糊等价。它允许用户搜索词条与实际词条的拼写出现偏差,但是偏差的编辑距离不得超过2:“query”: {由于篇幅限制,小编在此截出几张知识讲解的图解[外链图片转存中…(img-mxZOiQlR-1718807831007)][外链图片转存中…(img-LC3LUUVL-1718807831008)]

2401_85111824的博客 1177

ElastaticSearch 去重cardinality的使用。

项目中,Elastatic search(下面简称ES)用于数据存储和分析。 项目中的存储的对象有包含关系。 A对象是B对象的集合,即一个A对象包含多个属于A对象的B对象。在前端展示的时候,需要分别对A和B级别进行查询汇总。设计的时候,考虑到尽可能的减少存储量又能满足各种查询条件,决定以B...

chouen8010的博客 853
上一篇: kafka常用命令
下一篇: elasticsearch 主动触发段合并
nddjava
博客等级 码龄16年 15粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值