Elasticsearch聚合学习之一:基本操作

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch的聚合是常用的功能,此三部曲系列通过实战来熟悉和了解常用的聚合命令和参数

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

本篇概览

  • 聚合是我们在使用elasticsearch服务时常用的功能,从本篇起,一起通过实战来学习和掌握聚合的有关知识;

系列文章列表

  1. 《Elasticsearch聚合学习之一:基本操作》
  2. 《Elasticsearch聚合学习之二:区间聚合》
  3. 《Elasticsearch聚合学习之三:范围限定》;
  4. 《Elasticsearch聚合学习之四:结果排序》

关于聚合

  • 通过搜索,我们可找到匹配查询条件的文档集;
  • 通过聚合,我们会得到一个数据的概念,以汽车销售信息为例,以下都是聚合数据:
  1. 有多少中颜色;
  2. 每辆车的平均价格是多少;
  3. 按照汽车的颜色来划分,每个颜色的销售量是多少;
  • 学习Elasticsearch聚合的第一步就是理解两个概念:桶(Buckets)和指标(Metrics)

桶(Buckets)

  • 桶是指满足特定条件的文档的集合,例如按照汽车颜色分类,如下图,每个颜色都有一个桶,里面放的是所有这个颜色的文档:

在这里插入图片描述

指标(Metrics)

  • 指标是对桶内的文档进行统计计算,如统计红色汽车的数量、最低价、最高价、平均售价、总销售额等,这些都是根据桶中的文档的值来计算的;
  • 基本概念有所了解后一起通过实战来学习和掌握聚合的知识;

环境信息

  • 以下是本次实战的环境信息,请确保您的Elasticsearch可以正常运行:
  1. 操作系统:Ubuntu 18.04.2 LTS
  2. JDK:1.8.0_191
  3. Elasticsearch:6.7.1
  4. Kibana:6.7.1

导入实战数据

  • 本次实战用到的数据来自《Elasticsearch权威指南》的示例;
  • 实战会用到名为cars的索引,里面的每个文档是一条汽车销售记录,具体字段定义如下:
字段 类型 作用
price long 汽车售价
color text 汽车颜色
make text 汽车品牌
sold date 销售日期
  • 通过静态映射的方式来创建索引,在Kibana的Dev Tools页面执行以下命令,就会创建cars索引和transactions类型,并且指定了每个字段的定义:
PUT /cars

{
  "mappings" : {
      "transactions" : {
        "properties" : {
          "color" : {
            "type" : "keyword"
          },
          "make" : {
            "type" : "keyword"
          },
          "price" : {
            "type" : "long"
          },
          "sold" : {
            "type" : "date"
          }
        }
      }
    }
}
  • 导入数据:
POST /cars/transactions/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
  • 通过head插件看到新建的索引cars的所有数据如下图,例如第一条记录,表示售价30000,汽车颜色是绿色,品牌是ford,销售时间是2014年5月8日:

在这里插入图片描述

最简单的聚合:terms桶

  • 第一个聚合命令是terms桶,相当于SQL中的group by,将所有记录按照颜色聚合,执行以下查询命令:
GET /cars/transactions/_search
{
  "size":0,
  "aggs":{
   "popular_colors":{
     "terms": {
       "field": "color"
     }
   } 
  }
}
  • 收到响应如下:
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 8,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "popular_colors" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "red",
          "doc_count" : 4
        },
        {
          "key" : "blue",
          "doc_count" : 2
        },
        {
          "key" : "green",
          "doc_count" : 2
        }
      ]
    }
  }
}
  • 现在对查询命令中的参数做出解释:
  • size设置为0,这样返回的hits字段为空(hits不是我们本次查询关心的内容),这样可以提高查询速度;
  • aggs:聚合操作都被至于aggs之下,注意aggs是顶层参数,另外使用aggregations替代aggs也可以;
  • popular_colors:为聚合的类型指定名称,本次是按照颜色来聚合的,所以起名为popular_colors,响应内容中可以看到该字段的聚合结果如下:
aggregations" : {
    "popular_colors" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "red",
          "doc_count" : 4
        },
        {
          "key" : "blue",
          "doc_count" : 2
        },
        ...
  • terms:在聚合的时候,桶的类型有很多种,terms是常用的一种,作用是按照指定字段来聚合,例如本例指定了color字段,所以所有color为red的文档聚合到一个桶,green的文档聚合到另一个桶,实际上桶类型是有很多种的,常见的类型在后面的实战中会用到,更多详细内容请参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.0/search-aggregations-bucket.html
  • field的值就是terms桶指定的聚合字段,这里是color字段;
  • 接下来看看返回的信息,aggregations就是聚合结果,popular_colors是我们指定的别名,buckets是个json数组,里面的每个json对象都是一个桶,里面的doc_count就是记录数;例如结果中的第一条记录就是红色汽车的销售记录;

添加度量指标

  • 上面的示例返回的是每个桶中的文档数量,接下es支持丰富的指标,例如平均值(Avg)、最大值(Max)、最小值(Min)、累加和(Sum)等,接下来试试累加和的用法;
  • 下面请求的作用是统计每种颜色汽车的销售总额:
GET /cars/transactions/_search
{
  "size":0,
  "aggs":{
   "colors":{
     "terms": {
       "field": "color"
     },
     "aggs":{
       "sales":{
         "sum":{
           "field":"price"
         }
       }
     }
   } 
  }
}
  • 收到响应如下:
{
  "took" : 17,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 8,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "colors" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "red",
          "doc_count" : 4,
          "sales" : {
            "value" : 130000.0
          }
        },
        {
          "key" : "blue",
          "doc_count" : 2,
          "sales" : {
            "value" : 40000.0
          }
        },
        {
          "key" : "green",
          "doc_count" : 2,
          "sales" : {
            "value" : 42000.0
          }
        }
      ]
    }
  }
}
  • 请求参数和第一次的请求相比,按颜色聚合的参数不变,但是内部多了个aggs对象,详细的说明如下:
GET /cars/transactions/_search
{
  "size":0,
  "aggs":{         ------和前面一样,指定聚合操作
   "colors":{      ------别名
     "terms": {    ------桶类型是按指定字段聚合
       "field": "color" ------按照color字段聚合
     },
     "aggs":{      ------新增的aggs对象,用于处理聚合在每个桶内的文档
       "sales":{   ------别名
         "sum":{   ------度量指标是指定字段求和
           "field":"price" ---求和的字段是price
         }
       }
     }
   } 
  }
}
  • 对响应的数据说明如下:
 "aggregations" : {               ------聚合结果
    "colors" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [               ------这个json数组的每个对象代表一个桶
        {
          "key" : "red",        ------该桶将所有color等于red的文档聚合进来
          "doc_count" : 4,      ------有4个color等于red的文档
          "sales" : {           ------这里面是sum计算后的结果  
            "value" : 130000.0  ------所有color等于red的汽车销售总额
          }
        },
        {
          "key" : "blue",
          "doc_count" : 2,
          "sales" : {
            "value" : 40000.0  ------所有color等于blue的汽车销售总额
          }
        },

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
自然语言处理 Java 网络架构
elasticsearch学习三:elasticsearch-ik分词器的自定义配置 分词内容
这篇文章是关于如何自定义Elasticsearch的ik分词器配置以满足特定的中文分词需求。
156 0
elasticsearch学习三:elasticsearch-ik分词器的自定义配置 分词内容
|
1月前
|
存储 SQL 监控
|
2月前
|
JSON Java 网络架构
elasticsearch学习四:使用springboot整合 rest 进行搭建elasticsearch服务
这篇文章介绍了如何使用Spring Boot整合REST方式来搭建和操作Elasticsearch服务。
148 4
elasticsearch学习四:使用springboot整合 rest 进行搭建elasticsearch服务
|
2月前
|
自然语言处理 搜索推荐 关系型数据库
elasticsearch学习六:学习 全文搜索引擎 elasticsearch的语法,使用kibana进行模拟测试(持续更新学习)
这篇文章是关于Elasticsearch全文搜索引擎的学习指南,涵盖了基本概念、命令风格、索引操作、分词器使用,以及数据的增加、修改、删除和查询等操作。
37 0
elasticsearch学习六:学习 全文搜索引擎 elasticsearch的语法,使用kibana进行模拟测试(持续更新学习)
|
2月前
|
Web App开发 JavaScript Java
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
这篇文章是关于如何使用Spring Boot整合Elasticsearch,并通过REST客户端操作Elasticsearch,实现一个简单的搜索前后端,以及如何爬取京东数据到Elasticsearch的案例教程。
223 0
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
|
2月前
|
自然语言处理 Java Maven
elasticsearch学习二:使用springboot整合TransportClient 进行搭建elasticsearch服务
这篇博客介绍了如何使用Spring Boot整合TransportClient搭建Elasticsearch服务,包括项目创建、Maven依赖、业务代码和测试示例。
132 0
elasticsearch学习二:使用springboot整合TransportClient 进行搭建elasticsearch服务
|
2月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
221 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
3月前
|
存储 自然语言处理 关系型数据库
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
聚合、补全、RabbitMQ消息同步、集群、脑裂问题、集群分布式存储、黑马旅游实现过滤和搜索补全功能
|
4月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
158 1
|
6月前
|
SQL 安全 数据挖掘
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
Elasticsearch聚合查询用于复杂数据分析,包括统计空值率。示例展示了如何计算字段`my_field`非空非零文档的百分比。查询分为三步:总文档数计数、符合条件文档数计数及计算百分比。聚合概念涵盖度量、桶和管道聚合。脚本在聚合中用于动态计算。常见聚合类型如`sum`、`avg`、`date_histogram`等。组合使用可实现多值统计、嵌套聚合和空值率计算。[阅读更多](https://zhangfeidezhu.com/?p=515)
314 0
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?