暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ElasticSearch 桶聚合

北漂码农有话说 2021-08-07
944


前面我们说了 Es 中的指标聚合,今天我们该聊 Es 中的桶聚合了。

以下是视频笔记:

注意,笔记只是视频内容的一个简要记录,因此笔记内容比较简单,完整的内容可以查看视频。

23.ElasticSearch 桶聚合(bucket)

23.1 Terms Aggregation

Terms Aggregation 用于分组聚合,例如,统计各个出版社出版的图书总数量:

GET books/_search
{
  "aggs": {
    "NAME": {
      "terms": {
        "field""publish",
        "size": 20
      }
    }
  }
}

统计结果如下:

image-20201204200925589

在 terms 分桶的基础上,还可以对每个桶进行指标聚合。

统计不同出版社所出版的图书的平均价格:

GET books/_search
{
  "aggs": {
    "NAME": {
      "terms": {
        "field""publish",
        "size": 20
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field""price"
          }
        }
      }
    }
  }
}

统计结果如下:

image-20201204201400225

23.2 Filter Aggregation

过滤器聚合。可以将符合过滤器中条件的文档分到一个桶中,然后可以求其平均值。

例如查询书名中包含 java 的图书的平均价格:

GET books/_search
{
  "aggs": {
    "NAME": {
      "filter": {
        "term": {
          "name""java"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field""price"
          }
        }
      }
    }
  }
}

23.3 Filters Aggregation

多过滤器聚合。过滤条件可以有多个。

例如查询书名中包含 java 或者 office 的图书的平均价格:

GET books/_search
{
  "aggs": {
    "NAME": {
      "filters": {
        "filters": [
          {
            "term":{
              "name":"java"
            }
          },{
            "term":{
              "name":"office"
            }
          }
          ]
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field""price"
          }
        }
      }
    }
  }
}

23.4 Range Aggregation

按照范围聚合,在某一个范围内的文档数统计。

例如统计图书价格在 0-50、50-100、100-150、150以上的图书数量:

GET books/_search
{
  "aggs": {
    "NAME": {
      "range": {
        "field""price",
        "ranges": [
          {
            "to": 50
          },{
            "from": 50,
            "to": 100
          },{
            "from": 100,
            "to": 150
          },{
            "from": 150
          }
        ]
      }
    }
  }
}

23.5 Date Range Aggregation

Range Aggregation 也可以用来统计日期,但是也可以使用 Date Range Aggregation,后者的优势在于可以使用日期表达式。

造数据:

PUT blog/_doc/1
{
  "title":"java",
  "date":"2018-12-30"
}
PUT blog/_doc/2
{
  "title":"java",
  "date":"2020-12-30"
}
PUT blog/_doc/3
{
  "title":"java",
  "date":"2022-10-30"
}

统计一年前到一年后的博客数量:

GET blog/_search
{
  "aggs": {
    "NAME": {
      "date_range": {
        "field""date",
        "ranges": [
          {
            "from""now-12M/M",
            "to""now+1y/y"
          }
        ]
      }
    }
  }
}

  • 12M/M 表示 12 个月。
  • 1y/y 表示 1年。
  • d 表示天

23.6 Date Histogram Aggregation

时间直方图聚合。

例如统计各个月份的博客数量

GET blog/_search
{
  "aggs": {
    "NAME": {
      "date_histogram": {
        "field""date",
        "calendar_interval""month"
      }
    }
  }
}

23.7 Missing Aggregation

空值聚合。

统计所有没有 price 字段的文档:

GET books/_search
{
  "aggs": {
    "NAME": {
      "missing": {
        "field""price"
      }
    }
  }
}

23.8 Children Aggregation

可以根据父子文档关系进行分桶。

查询子类型为 student 的文档数量:

GET stu_class/_search
{
  "aggs": {
    "NAME": {
      "children": {
        "type""student"
      }
    }
  }
}

23.9 Geo Distance Aggregation

对地理位置数据做统计。

例如查询(34.288991865037524,108.9404296875)坐标方圆 600KM 和 超过 600KM 的城市数量。

GET geo/_search
{
  "aggs": {
    "NAME": {
      "geo_distance": {
        "field""location",
        "origin""34.288991865037524,108.9404296875",
        "unit""km"
        "ranges": [
          {
            "to": 600
          },{
            "from": 600
          }
        ]
      }
    }
  }
}

23.10 IP Range Aggregation

IP 地址范围查询。

GET blog/_search
{
  "aggs": {
    "NAME": {
      "ip_range": {
        "field""ip",
        "ranges": [
          {
            "from""127.0.0.5",
            "to""127.0.0.11"
          }
        ]
      }
    }
  }
}

文章转载自北漂码农有话说,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论