聚合在Elasticsearch中的使用及示例验证

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

聚合在Elasticsearch中的使用

系统中使用的ES环境不一定每篇文章都有,但是可以在合集中找到,关注《醉鱼Java》一起进步

环境

  • elasticsearch 8.1

搭建

version: '3.8'
services:
  cerebro:
    image: lmenezes/cerebro:0.8.3
    container_name: cerebro
    ports:
     - "9000:9000"
    command:
     - -Dhosts.0.host=http://eshot:9200
    networks:
     - elastic
  kibana:
    image: docker.elastic.co/kibana/kibana:8.1.3
    container_name: kibana
    environment:
      - I18N_LOCALE=zh-CN
      - XPACK_GRAPH_ENABLED=true
      - TIMELION_ENABLED=true
      - XPACK_MONITORING_COLLECTION_ENABLED="true"
      - ELASTICSEARCH_HOSTS=http://eshot:9200
      - server.publicBaseUrl=http://192.168.160.234:5601
    ports:
      - "5601:5601"
    networks:
      - elastic
  eshot:
    image: elasticsearch:8.1.3
    container_name: eshot
    environment:
      - node.name=eshot
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=eshot,eswarm,escold
      - cluster.initial_master_nodes=eshot,eswarm,escold
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
      - node.attr.node_type=hot
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - D:\zuiyuftp\docker\es8.1\eshot\data:/usr/share/elasticsearch/data
      - D:\zuiyuftp\docker\es8.1\eshot\logs:/usr/share/elasticsearch/logs
      - D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
    ports:
      - 9200:9200
    networks:
      - elastic
  eswarm:
    image: elasticsearch:8.1.3
    container_name: eswarm
    environment:
      - node.name=eswarm
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=eshot,eswarm,escold
      - cluster.initial_master_nodes=eshot,eswarm,escold
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
      - node.attr.node_type=warm
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - D:\zuiyuftp\docker\es8.1\eswarm\data:/usr/share/elasticsearch/data
      - D:\zuiyuftp\docker\es8.1\eswarm\logs:/usr/share/elasticsearch/logs
      - D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
    networks:
      - elastic
  escold:
    image: elasticsearch:8.1.3
    container_name: escold
    environment:
      - node.name=escold
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=eshot,eswarm,escold
      - cluster.initial_master_nodes=eshot,eswarm,escold
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
      - node.attr.node_type=cold
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - D:\zuiyuftp\docker\es8.1\escold\data:/usr/share/elasticsearch/data
      - D:\zuiyuftp\docker\es8.1\escold\logs:/usr/share/elasticsearch/logs
      - D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
    networks:
      - elastic

# volumes:
#   eshotdata:
#     driver: local
#   eswarmdata:
#     driver: local
#   escolddata:
#     driver: local

networks:
  elastic:
    driver: bridge

什么是聚合?

在Elasticsearch中,聚合是一种功能强大的数据处理技术,它允许我们对索引中的数据进行多种计算和分析操作。聚合可以理解为对数据集进行分组,并在每个分组上执行各种指标计算,类似于SQL中的GROUP BY和聚合函数。

示例数据

为了验证聚合功能,我们将使用一个示例数据集,假设我们有一个存储了商品信息的索引,包含以下字段:

  1. product_name:商品名称
  2. category:商品分类
  3. price:商品价格
  4. quantity:商品数量
  5. manufacturer:制造商
  6. timestamp:记录时间戳

下面我们导入测试数据

创建索引

PUT /zfc-doc-000001
{
  "settings": {
    "index":{
      "number_of_shards":3,
      "number_of_replicas":2
    }
  },
  "mappings": {
    "properties": {
      "product_name":{
        "type":"keyword"
      },
      "category":{
        "type":"keyword"
      },
      "price":{
        "type": "integer"
      },
      "quantity":{
        "type": "integer"
      },
      "manufacturer":{
        "type": "keyword"
      },
      "timestamp":{
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" 
      }
    }
  }
}

添加数据

PUT _bulk
{"index":{"_index":"zfc-doc-000002","_id":"1"}}
{"product_name": "iPhone 12","category": "Electronics","price": 999,"quantity": 50,"manufacturer": "Apple","timestamp": "2023-07-24 10:00:00"}
{"index":{"_index":"zfc-doc-000002","_id":"2"}}
{"product_name": "Samsung Galaxy S21","category": "Electronics","price": 799,"quantity": 30,"manufacturer": "Samsung","timestamp": "2023-07-24 11:30:00"}
{"index":{"_index":"zfc-doc-000002","_id":"3"}}
{"product_name": "Sony Bravia 65-inch TV","category": "Electronics","price": 1499,"quantity": 20,"manufacturer": "Sony","timestamp": "2023-07-24 13:15:00"}
{"index":{"_index":"zfc-doc-000002","_id":"4"}}
{"product_name": "HP Spectre x360","category": "Electronics","price": 1299,"quantity": 25,"manufacturer": "HP","timestamp": "2023-07-24 15:45:00"}
{"index":{"_index":"zfc-doc-000002","_id":"5"}}
{"product_name": "Dell XPS 15", "category": "Electronics","price": 1399,"quantity": 15,"manufacturer": "Dell","timestamp": "2023-07-24 17:20:00"}
{"index":{"_index":"zfc-doc-000002","_id":"6"}}
{"product_name": "Nike Air Zoom Pegasus 38", "category": "Sports","price": 119,"quantity": 100,"manufacturer": "Nike","timestamp": "2023-07-24 09:30:00"}
{"index":{"_index":"zfc-doc-000002","_id":"7"}}
{"product_name": "Adidas Ultraboost 21","category": "Sports","price": 129,"quantity": 80,"manufacturer": "Adidas","timestamp": "2023-07-24 10:45:00"}
{"index":{"_index":"zfc-doc-000002","_id":"8"}}
{"product_name": "Canon EOS Rebel T7i","category": "Electronics","price": 699,"quantity": 10,"manufacturer": "Canon","timestamp": "2023-07-24 14:05:00"}
{"index":{"_index":"zfc-doc-000002","_id":"9"}}
{"product_name": "LG 55-inch 4K TV", "category": "Electronics","price": 899,"quantity": 30,"manufacturer": "LG","timestamp": "2023-07-24 16:30:00"}
{"index":{"_index":"zfc-doc-000002","_id":"10"}}
{"product_name": "Lenovo ThinkPad X1 Carbon", "category": "Electronics","price": 1599,"quantity": 18,"manufacturer": "Lenovo","timestamp": "2023-07-24 18:10:00"}

聚合示例

1. 词条聚合(Terms Aggregation)

词条聚合是一种用于对文本字段进行分组的聚合方式,它会将相同值的文档分到同一个桶(Bucket)中,并计算每个桶中文档的数量。

示例查询:

GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "category_count": {
      "terms": {
        "field""category",
        "size"10
      }
    }
  }
}

解释:

  • "size": 0:表示只返回聚合结果,不返回实际文档数据。

  • "aggs":定义聚合操作。

  • "category_count":自定义的聚合名称,用于标识结果。

  • "terms":指定使用词条聚合。

  • "field": "category":指定要进行聚合的字段。

2. 嵌套聚合(Nested Aggregation)

嵌套聚合允许在一个桶内进行更深层次的聚合操作。例如,我们可以先按分类分组,然后在每个分类内再按制造商进行分组,并计算每个分类下的平均价格。

示例查询:

GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "category_group": {
      "terms": {
        "field""category",
        "size"10
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field""price"
          }
        }
      }
    }
  }
}

解释:

  • "aggs":定义聚合操作。
  • "category_group":自定义的聚合名称,用于标识结果。
  • "terms":指定使用词条聚合。
  • "field": "category":指定要进行聚合的字段。
  • "avg_price":自定义的聚合名称,用于标识结果。
  • "avg":指定使用平均值聚合。
  • "field": "price":指定要进行聚合的数值字段。
3.直方图聚合示例(Histogram)

假设我们希望根据商品价格(price字段)创建一个价格区间的直方图,将商品按照价格范围进行分组,并统计每个价格区间内的商品数量。

示例查询:

GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "price_histogram": {
      "histogram": {
        "field""price",
        "interval"200
      }
    }
  }
}

解释:

  • "aggs":定义聚合操作。
  • "price_histogram":自定义的聚合名称,用于标识结果。
  • "histogram":指定使用直方图聚合。
  • "field": "price":指定要进行聚合的数值字段,即商品价格。
  • "interval": 200:指定直方图的间隔大小,这里设置为200表示将价格范围划分为200的区间,例如:0-200、200-400、400-600等。
4.范围聚合示例(Range)

范围聚合允许我们根据指定的范围条件将文档分组,例如:按价格范围进行分组并统计每个价格范围内的商品数量。

示例查询:

GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "price_ranges": {
      "range": {
        "field""price",
        "ranges": [
          { "from"0"to"200 },
          { "from"200"to"500 },
          { "from"500"to"1000 },
          { "from"1000 }
        ]
      }
    }
  }
}

解释:

  • "aggs":定义聚合操作。
  • "price_ranges":自定义的聚合名称,用于标识结果。
  • "range":指定使用范围聚合。
  • "field": "price":指定要进行聚合的数值字段,即商品价格。
  • "ranges":指定价格范围的条件数组。
    • { "from": 0, "to": 200 }:表示价格从0到200之间的商品。
    • { "from": 200, "to": 500 }:表示价格从200到500之间的商品。
    • { "from": 500, "to": 1000 }:表示价格从500到1000之间的商品。
    • { "from": 1000 }:表示价格大于等于1000的商品。
5. 统计聚合(Stats Aggregation)

统计聚合可以对数值字段进行计算,包括最小值、最大值、平均值、总和和文档数量。

示例查询:

GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "price_stats": {
      "stats": {
        "field""price"
      }
    }
  }
}

解释:

  • "aggs":定义聚合操作。
  • "price_stats":自定义的聚合名称,用于标识结果。
  • "stats":指定使用统计聚合。
  • "field": "price":指定要进行聚合的数值字段。

我们上面在统计聚合中可以获取很多值,那么我们也可以细化单独获取某一个的聚合结果。

6. 平均值聚合(Avg Aggregation)

GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "avg_price": {
      "avg": {
        "field""price"
      }
    }
  }
}
7. 总和聚合(Sum Aggregation)
GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "total_price": {
      "sum": {
        "field""price"
      }
    }
  }
}
8. 最小值聚合(Min Aggregation)
GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "min_price": {
      "min": {
        "field""price"
      }
    }
  }
}

9. 最大值聚合(Max Aggregation)
GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "max_price": {
      "max": {
        "field""price"
      }
    }
  }
}

10. 扩展统计聚合(Extended Stats Aggregation)
GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "price_stats_extended": {
      "extended_stats": {
        "field""price"
      }
    }
  }
}
11. 百分位数聚合(Percentiles Aggregation)
GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "price_percentiles": {
      "percentiles": {
        "field""price",
        "percents": [25507590]
      }
    }
  }
}
12. 日期直方图聚合(Date Histogram Aggregation)

假设有一个名为timestamp的日期字段,我们可以进行日期直方图聚合,按照日期进行分组并统计每个时间段内的文档数量。

GET zfc-doc-000002/_search
{
  "size"0,
  "aggs": {
    "date_histogram_agg": {
      "date_histogram": {
        "field""timestamp",
        "fixed_interval""1h"
      }
    }
  }
}

本文由 mdnice 多平台发布文章来源地址https://www.toymoban.com/news/detail-638268.html

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

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

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

相关文章

  • Elasticsearch使用篇 - 管道聚合

    基于前一次聚合的结果,进行二次聚合统计。 从结构上可以分为兄弟级(Sibling)管道聚合和父级(Parent)管道聚合两种方式。 兄弟级管道聚合:在同一聚合级别上可以产生新的聚合。 父级管道聚合:由父聚合提供输出,子聚合能够产生新的桶,然后可以添加到父桶中。 基

    2024年02月06日
    浏览(38)
  • Elasticsearch(三)聚合基本使用

    基础概念 bucket 数据分组,一些数据按照某个字段进行bucket划分,这个字段值相同的数据放到一个bucket中。可以理解成Java中的MapString, List结构,类似于Mysql中的group by后的查询结果。 metric: 对一个数据分组执行的统计,比如计算最大值,最小值,平均值等 类似于Mysql中的max

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

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

    2024年02月12日
    浏览(51)
  • 使用Elasticsearch进行分组聚合统计

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

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

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

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

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

    2023年04月24日
    浏览(57)
  • Elasticsearch之聚合查询介绍与使用(附RestAPI代码案例)

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

    2023年04月13日
    浏览(43)
  • Elasticsearch使用msearch提高聚合效率(与search检索对比)

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

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

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

    2024年02月16日
    浏览(37)
  • 构建强大的Python后端分离应用:使用Token实现安全身份验证和权限控制

    使用Python构建一个强大的后端分离应用,通过使用Token实现安全的身份验证和灵活的权限控制。 什么是前后端分离: 前后端分离是一种软件架构模式,它将应用程序的前端(用户界面)和后端(业务逻辑和数据处理)分离开发和部署。在前后端分离架构中,前端和后端是独立

    2024年02月03日
    浏览(63)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包