Elasticsearch学习-- 聚合查询

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

一、聚合分类

 1. 分桶聚合  bucket aggregations

按照每个标签进行分类 ,类似于group by

Elasticsearch学习-- 聚合查询

Elasticsearch学习-- 聚合查询 

Elasticsearch学习-- 聚合查询 

 文章来源地址https://www.toymoban.com/news/detail-408521.html

 2. 指标聚合 metrics aggregations

Elasticsearch学习-- 聚合查询

 

3. 管道聚合 pipeline aggregations

Elasticsearch学习-- 聚合查询

先计算平均值,再计算最小值

Elasticsearch学习-- 聚合查询 

 二、语法

GET test_index/_search
{
  "aggs": {
    "聚合后返回的字段": {
      "avg": {
        "聚合的字段": ""
      }
    },
    "聚合后返回的字段2": {
      "avg": {
        "聚合的字段": ""
      }
    }
  }
}

 默认查询返回结果是10条,可以通过设置size来看返回值数量

GET test_index/_search?size=20
GET test_index/_search
{
  "size":20
}

三、桶聚合

1. 统计不同标签的商品数量

PUT product/_doc/1
{
  "name":"prodect1 aa",
  "price": 1000,
  "tags":["tag1","tag2","tag3"]
}

PUT product/_doc/2
{
  "name":"prodect2 bb",
  "price": 2000,
  "tags":["tag2","tag3"]
}

PUT product/_doc/3
{
  "name":"prodect3 bb",
  "price": 2000,
  "tags":["tag4"]
}

PUT product/_doc/4
{
  "name":"prodect4 bb",
  "price": 3000,
  "tags":["tag1","tag4"]
}

PUT product/_doc/5
{
  "name":"prodect5 aa",
  "price": 3000,
  "tags":["tag1","tag5"]
}

PUT product/_doc/6
{
  "name":"prodect6 aa",
  "price": 4000,
  "tags":["tag1","tag2"]
}

GET product/_search
{
  "size": 0, 
  "aggs": {
    "agg_tag": {
      "terms": {
        "field": "tags.keyword",
        "size": 10,
        "order": {
          "_count": "asc"
        }
      }
    }
  }
}

 

Elasticsearch学习-- 聚合查询

2. 为什么上面使用tags.keyword

因为聚合查询使用的是doc_values的正排索引,tags.keyword有正排索引

也可以通过设置fileddata属性进行正排索引

3. fileddata

修改mapping中tags字段的fileddata属性为true

POST product/_mapping
{
  "properties":{
    "tags":{
      "type":"text",
      "fielddata":true
    }
  }
}

这样就可以使用tags直接进行聚合操作

GET product/_search
{
  "size": 0, 
  "aggs": {
    "agg_tag": {
      "terms": {
        "field": "tags",
        "size": 10,
        "order": {
          "_count": "asc"
        }
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

4. doc_values和field_data的区别

doc_values和filed_data都可以用于聚合查询,

doc_vaules是基于磁盘的,filed_data是基于内存的

数据量比较大时,尽量不要使用filed_data

四、指标聚合

1. 统计商品最贵、最便宜、平均价格

GET product/_search
{
  "size": 0,
  "aggs": {
    "max_price": {
      "max": {
        "field": "price"
      }
    },
    "min_price": {
      "min": {
        "field": "price"
      }
    },
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

 Elasticsearch学习-- 聚合查询

 2. stats 查看所有指标

# 查看price的所有指标
GET product/_search
{
  "size": 0,
  "aggs": {
    "stats_price": {
      "stats": {
        "field": "price"
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 3. cardinality去重后的数量

# 按照price字段进行去重后的数量
GET product/_search
{
  "_source": false, 
  "aggs": {
    "price_count": {
      "cardinality": {
        "field": "price"
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 五、管道聚合(二次聚合)

统计平均价格最低的商品分类

1)先对tags进行分桶

2)对分桶后的tags取平均price(在哪个的基础上进行操作,就放在同一级)

3)对上面的平均价格取最小平均价格的标签

# 统计平均价格最低的商品分类
GET product/_search
{
  "size": 0,
  "aggs": {
    "tags_bucket": {
      "terms": {
        "field": "tags.keyword"
      },
      "aggs":{
        "avg_price_bucket":{
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "min_price_bucket":{
      "min_bucket": {
        "buckets_path": "tags_bucket>avg_price_bucket"
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 六、基于聚合结果的聚合--案例

1. 准备数据

11条商品信息

PUT /goods/_doc/1
{
    "name" : "小米手机",
    "desc" :  "手机中的战斗机",
    "price" :  3999,
    "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-10-01T08:00:00Z",
    "tags": [ "性价比", "发烧", "不卡顿" ]
}
PUT /goods/_doc/2
{
    "name" : "小米NFC手机",
    "desc" :  "支持全功能NFC,手机中的滑翔机",
    "price" :  4999,
        "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-05-21T08:00:00Z",
    "tags": [ "性价比", "发烧", "公交卡" ]
}
PUT /goods/_doc/3
{
    "name" : "NFC手机",
    "desc" :  "手机中的轰炸机",
    "price" :  2999,
        "lv":"高端机",
    "type":"手机",
    "createtime":"2020-06-20",
    "tags": [ "性价比", "快充", "门禁卡" ]
}
PUT /goods/_doc/4
{
    "name" : "小米耳机",
    "desc" :  "耳机中的黄焖鸡",
    "price" :  999,
        "lv":"百元机",
    "type":"耳机",
    "createtime":"2020-06-23",
    "tags": [ "降噪", "防水", "蓝牙" ]
}
PUT /goods/_doc/5
{
    "name" : "红米耳机",
    "desc" :  "耳机中的肯德基",
    "price" :  399,
    "type":"耳机",
        "lv":"百元机",
    "createtime":"2020-07-20",
    "tags": [ "防火", "低音炮", "听声辨位" ]
}
PUT /goods/_doc/6
{
    "name" : "小米手机10",
    "desc" :  "充电贼快掉电更快,超级无敌望远镜,高刷电竞屏",
    "price" :  "",
        "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-07-27",
    "tags": [ "120HZ刷新率", "120W快充", "120倍变焦" ]
}
PUT /goods/_doc/7
{
    "name" : "挨炮 SE2",
    "desc" :  "除了CPU,一无是处",
    "price" :  "3299",
        "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-07-21",
    "tags": [ "割韭菜", "割韭菜", "割新韭菜" ]
}
PUT /goods/_doc/8
{
    "name" : "XS Max",
    "desc" :  "听说要出新款12手机了,终于可以换掉手中的4S了",
    "price" :  4399,
        "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-08-19",
    "tags": [ "5V1A", "4G全网通", "大" ]
}
PUT /goods/_doc/9
{
    "name" : "小米电视",
    "desc" :  "70寸性价比只选,不要一万八,要不要八千八,只要两千九百九十八",
    "price" :  2998,
        "lv":"高端机",
    "type":"耳机",
    "createtime":"2020-08-16",
    "tags": [ "巨馍", "家庭影院", "游戏" ]
}
PUT /goods/_doc/10
{
    "name" : "红米电视",
    "desc" :  "我比上边那个更划算,我也2998,我也70寸,但是我更好看",
    "price" :  2999,
    "type":"电视",
        "lv":"高端机",
    "createtime":"2020-08-28",
    "tags": [ "大片", "蓝光8K", "超薄" ]
}
PUT /goods/_doc/11
{
  "name": "红米电视",
  "desc": "我比上边那个更划算,我也2998,我也70寸,但是我更好看",
  "price": 2998,
  "type": "电视",
  "lv": "高端机",
  "createtime": "2020-08-28",
  "tags": [
    "大片",
    "蓝光8K",
    "超薄"
  ]
}

2. 统计不同lv下的不同type的数量

# 统计不同lv下的不同type的数量
GET goods/_search
{
  "size": 0,
  "aggs": {
    "lv_type_agg": {
      "terms": {
        "field": "lv.keyword"
      },
      "aggs": {
        "type_agg": {
          "terms": {
            "field": "type.keyword"
          }
        }
      }
    }
  }
}

Elasticsearch学习-- 聚合查询  

3. 统计不同lv的价格信息

# 统计不同lv下价格信息
GET goods/_search
{
  "size": 0,
  "aggs": {
    "lv_type_agg": {
      "terms": {
        "field": "lv.keyword"
      },
      "aggs": {
        "price_agg": {
          "stats": {
            "field": "price"
          }
        }
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 4. 统计不同type下的,不同lv的,price信息

#统计不同type下的,不同lv的,price信息
GET goods/_search
{
  "size": 0,
  "aggs": {
    "type_agg": {
      "terms": {
        "field": "type.keyword"
      },
      "aggs": {
        "lv_agg": {
          "terms": {
            "field": "lv.keyword"
          },
          "aggs": {
            "price_agg": {
              "stats": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 统计不同type下的,不同lv的,price信息和tag信息

#统计不同type下的,不同lv的,price信息和tag信息
GET goods/_search
{
  "size": 0,
  "aggs": {
    "type_agg": {
      "terms": {
        "field": "type.keyword"
      },
      "aggs": {
        "lv_agg": {
          "terms": {
            "field": "lv.keyword"
          },
          "aggs": {
            "price_agg": {
              "stats": {
                "field": "price"
              }
            },
            "tag_agg": {
              "terms": {
                "field": "tags.keyword"
              }
            }
          }
        }
      }
    }
  }
}

 Elasticsearch学习-- 聚合查询

 

5. 统计每个商品type中,不同的lv商品中,平均price最低的lv

# 统计每个商品type中,不同的lv商品中,平均price最低的lv
GET goods/_search
{
  "size": 0,
  "aggs": {
    "type_agg": {
      "terms": {
        "field": "type.keyword"
      },
      "aggs": {
        "lv_agg": {
          "terms": {
            "field": "lv.keyword"
          },
          "aggs": {
            "price_agg": {
              "avg": {
                "field": "price"
              }
            }
          }
        },
        "min_price_bucket": {
          "min_bucket": {
            "buckets_path": "lv_agg>price_agg"
          }
        }
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 七、基于查询结果的聚合和基于聚合结果的查询--案例

1. 基于查询结果的聚合

1)查询price>4000的tags信息

GET goods/_search
{
  "size": 10,
  "query": {
    "range": {
      "price": {
        "gte": 4000
      }
    }
  },
  "aggs": {
    "tags_bucket": {
      "terms": {
        "field": "tags.keyword"
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 2) 基于filter

与上面的结果一样

GET goods/_search
{
  "size": 10,
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "price": {
            "gte": 4000
          }
        }
      }
    }
  },
  "aggs": {
    "tags_bucket": {
      "terms": {
        "field": "tags.keyword"
      }
    }
  }
}

2. 基于聚合结果的查询

使用post_filter

GET goods/_search
{
  "size": 10,
  "aggs": {
    "tags_bucket": {
      "terms": {
        "field": "tags.keyword"
      }
    }
  },
  "post_filter": {
    "term": {
      "tags.keyword": "性价比"
    }
  }
}
GET goods/_search
{
  "size": 10,
  "query": {
    "term": {
      "tags.keyword": {
        "value": "性价比"
      }
    }
  }, 
  "aggs": {
    "tags_bucket": {
      "terms": {
        "field": "tags.keyword"
      }
    }
  }
}

以上两个语句,查询结果相同

1)查询price>4000的平均price和所有商品的平均price

#查询price>4000的平均price和所有商品的平均price
GET goods/_search
{
  "size": 0,
  "query": {
    "range": {
      "price": {
        "gte": 4000
      }
    }
  }, 
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    },
    "all_avg_price":{
      "global": {},
      "aggs":{
        "avg_price2":{
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 2) 将上面的global换成filter的话,是与最上面的查询条件产生交集

GET goods/_search
{
  "size": 0,
  "query": {
    "range": {
      "price": {
        "gte": 4000
      }
    }
  }, 
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    },
    "all_avg_price":{
      "filter": {
        "range": {
          "price": {
            "lte": 3000
          }
        }
      },
      "aggs":{
        "avg_price2":{
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 八、聚合排序

1. _count

按照doc_count排序

GET goods/_search
{
  "size": 0,
  "aggs": {
    "tags_aggs": {
      "terms": {
        "field": "tags.keyword",
        "order": {
          "_count": "desc"
        }
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 

2._term/_key

_term已经淘汰,按照key字典序排序

GET goods/_search
{
  "size": 0,
  "aggs": {
    "tags_aggs": {
      "terms": {
        "field": "tags.keyword",
        "order": {
          "_key": "asc"
        }
      }
    }
  }
}

 

Elasticsearch学习-- 聚合查询

3. 多层聚合

外层按照type的数量倒序排,里层按照lv的数量正序排

GET goods/_search
{
  "size": 0,
  "aggs": {
    "type_aggs": {
      "terms": {
        "field": "type.keyword",
        "order": {
          "_count": "desc"
        }
      },
      "aggs": {
        "lv_aggs": {
          "terms": {
            "field": "lv.keyword",
            "order": {
              "_count": "asc"
            }
          }
        }
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 

 根据price_stats中的最小值进行排序

# 根据price_stats中的最小值进行排序
GET goods/_search
{
  "size": 0,
  "aggs": {
    "type_aggs": {
      "terms": {
        "field": "type.keyword",
        "order": {
          "filter_aggs>price_stats.min": "asc"
        }
      },
      "aggs": {
        "filter_aggs": {
          "filter": {
            "terms": {
              "type.keyword": [
                "耳机",
                "手机",
                "电视"
              ]
            }
          },
          "aggs": {
            "price_stats": {
              "stats": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 九、图形化

1. 根据价格range分桶

GET goods/_search
{
  "size": 0,
  "aggs": {
    "price_range": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 1000
          },
          {
            "from": 1000,
            "to": 2000
          },
          {
            "from": 2000,
            "to": 3000
          },
          {
            "from": 3000,
            "to": 4000
          },
          {
            "from": 4000,
            "to": 5000
          }
        ]
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 2. histogram(直方图、柱状图)

根据price,间隔1000,跟上面的基本相同

GET goods/_search
{
  "size": 0,
  "aggs": {
    "price_range": {
      "histogram": {
        "field": "price",
        "interval": 1000
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

跟field、interval同级的其他参数

keyed:设置true,表示将结果输出为key、value形式

min_doc_count:设置成1,表示输出结果doc_value大于等于1的数据(过滤0)

missing:对空值赋默认值(设置成500,上图中表示,将price缺失的数据的price设置成500)

3. date-histogram

专门针对日期类型的直方图

根据月份进行分桶,可以用format进行指定格式输出

GET goods/_search
{
  "size": 0,
  "aggs": {
    "date_range": {
      "date_histogram": {
        "field": "createtime",
        "interval": "month"
      }
    }
  }
}

Elasticsearch学习-- 聚合查询

 可以设置extended_bounds,展示没有的数据0

Elasticsearch学习-- 聚合查询

 4. auto_date_histogram

自动设置interval,根据buckets

Elasticsearch学习-- 聚合查询

5. cumulative_sum(累加聚合)

 十、percentile (百分位统计、饼状图)

1. percentiles

Elasticsearch学习-- 聚合查询

 2. percentile_ranks

Elasticsearch学习-- 聚合查询

 

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

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

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

相关文章

  • MongoDB聚合:$bucket

    $bucket 将输入文档按照指定的表达式和边界进行分组,每个分组为一个文档,称为“桶”,每个桶都有一个唯一的 _id ,其值为文件桶的下线。每个桶中至少要包含一个输入文档,也就是没有空桶。 语法 groupBy 对文档进行分组的表达式。若指定字段路径,需要在字段名前加上

    2024年01月23日
    浏览(34)
  • elasticsearch中的聚合分组查询

    分组聚合及嵌套查询 聚合查询可以理解为SQL中的求和、求最大值、最小值以及求均值的需求 嵌套可以理解为es存值的某一个字段为对象属性的值做处理. Elasticsearch Java API分组与聚合结合 其中对字段field_one进行分组,分组的别名为fieldOne,取2^31-1组数据.如果不设置size,查询的结果

    2024年02月11日
    浏览(37)
  • Elasticsearch 基本使用(四)聚合查询

    说到聚合查询,马上会想到 SQL 中的 group by,ES中也有类似的功能,名叫 Aggregation。 统计分组后的数量 按年龄分组,然后统计每个年龄人数 count(*) ,age xxx group by age 非文档字段分组 文档字段分组 直接使用文档字段分组会报错。 ES没有对文本字段聚合,排序等操作优化;如果对

    2024年02月12日
    浏览(38)
  • 一起学Elasticsearch系列-聚合查询

    本文已收录至Github,推荐阅读 👉 Java随想录 微信公众号:Java随想录 聚合查询是 Elasticsearch 中一种强大的数据分析工具,用于从索引中提取和计算有关数据的统计信息。聚合查询可以执行各种聚合操作,如计数、求和、平均值、最小值、最大值、分组等,以便进行数据汇总和

    2024年01月22日
    浏览(39)
  • Elasticsearch 聚合查询(Aggregation)详解

    Elasticsearch中的聚合查询,类似SQL的SUM/AVG/COUNT/GROUP BY分组查询,主要用于统计分析场景。 实例: 例子聚合统计的效果等价SQL:

    2024年02月04日
    浏览(34)
  • Elasticsearch 查询和聚合查询:基本语法和统计数量

    摘要:Elasticsearch是一个强大的分布式搜索和分析引擎,提供了丰富的查询和聚合功能。本文将介绍Elasticsearch的基本查询语法,包括预发查询和聚合查询,以及如何使用聚合功能统计数量。 Elasticsearch是一种开源的分布式搜索和分析引擎,广泛应用于各种场景,包括日志分析、

    2024年02月11日
    浏览(36)
  • ElasticSearch(7.8版本)聚合查询使用javaHighLevelRestClient实现(从MySQL聚合查询概念->ES聚合概念及实操)

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

    2023年04月24日
    浏览(44)
  • ElasticSearch java API - 聚合查询

    }, “low”: { “type”: “long” }, “date”: { “format”: “strict_date_optional_time||epoch_millis”, “type”: “date” }, “close”: { “type”: “long” } }, “_all”: { “enabled”: false } } } 索引中的全部数据: name age salary team position james 33 3000 cav sf irving 25 2000 cav pg curry 29 1000 war pg thompson 26

    2024年04月10日
    浏览(29)
  • ElasticSearch搜索技术深入与聚合查询实战

    分词器官方称之为文本分析器,顾名思义,是对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项,粒度大小取决于分词器规则。 分词器的处理过程发生在 Index Time 和 Search Time 两个时期。 Index Time:文档写入并创

    2024年02月06日
    浏览(38)
  • Java Elasticsearch多条件分组聚合查询

    需求         在项目开发中,需要从elasticsearch中查询日志数据,先统计每一天的日志调用量,然后在每一天的分组聚合基础上,再分组聚合统计成功和失败的日志调用量。 代码

    2024年02月08日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包