首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
ElasticSearch开篇ES的安装
ElasticSearch的基本概念与名词解析
ElasticSearch数据管理文档的基础操作
ElasticSearch全文搜索API实践
ElasticSearch之Term-Query-API实践
ElasticSearch组合查询
ElasticSearch推荐搜索选项Suggesters的API
ElasticSearch统计需求之聚合
ElasticSearch集群管理API的使用
ElasticSearch索引管理API的使用
ElasticSearch中Mapping的使用
ElasticSearch关系模型之嵌套类型和父子文档
ElasticSearch正排索引与倒排索引简介
ElasticSearch全文搜索之倒排索引的实现
ElasticSearch数据相似的依据之相关性评分
ElasticSearch词项生成器之分词器
ElasticSearch分布式之集群中常见问题与解决方案
ElasticSearch分布式文档搜索机制
ElasticSearch数据持久化之分布式文档的存储流程
ElasticSearch分页之from+size、search after、scroll api
ElasticSearch聚合分析的原理之聚合结果一定准确
ElasticSearch数据副本策略
ElasticSearch数据副本模型
ElasticSearch集群运维
ElasticSearch索引的生命周期ILM
ElasticSearch安全之集群安全
ElasticSearch异常管理之搭建ELK日志系统
当前位置:
首页>>
技术小册>>
ElasticSearch零基础到实战
小册名称:ElasticSearch零基础到实战
**一、概述** 本文将重点介绍ElasticSearch中的聚合操作,包括聚合类型、聚合语法和代码示例,以帮助读者更好地理解和使用ElasticSearch中的聚合功能。 **二、聚合类型** 在ElasticSearch中,聚合操作主要有以下几种类型: 桶(Bucket)聚合 桶聚合是一种分组聚合,它将文档分组到不同的桶中,并对每个桶进行聚合操作。常用的桶聚合有: 术语(Terms)聚合:按照指定字段的值进行分组; 范围(Range)聚合:按照指定字段的范围进行分组; 直方图(Histogram)聚合:按照指定字段的值进行分组,并将值分成多个区间; 时间(Date)聚合:按照指定时间字段的值进行分组,并将时间分成多个区间; 地理位置(Geo)聚合:按照指定地理位置字段的值进行分组。 指标(Metric)聚合 指标聚合是对文档中的某个数值类型字段进行聚合操作,常用的指标聚合有: 平均值(Avg)聚合:计算指定字段的平均值; 最大值(Max)聚合:计算指定字段的最大值; 最小值(Min)聚合:计算指定字段的最小值; 求和(Sum)聚合:计算指定字段的总和; 统计(Stats)聚合:计算指定字段的总数、平均值、最大值、最小值和总和。 嵌套(Nested)聚合 嵌套聚合是对嵌套对象进行聚合操作,它可以对嵌套对象中的字段进行桶或指标聚合操作。 矩阵统计(Matrix Stats)聚合 矩阵统计聚合是用于计算多个数值字段之间的相关性和协方差矩阵的聚合操作,它可以帮助我们发现数据中的相关性规律和趋势。 其他聚合 除了上述聚合类型之外,ElasticSearch还提供了许多其他聚合类型,如全局(Global)聚合、过滤(Filter)聚合、嵌套聚合(Nested)等。 **三、聚合语法** 在ElasticSearch中,聚合操作是通过DSL语法实现的。DSL(Domain Specific Language)是一种面向特定领域的编程语言,它能够让我们更加简洁地表达特定领域的问题。ElasticSearch的DSL语法非常灵活,支持多种聚合类型和聚合嵌套。 以下是ElasticSearch中的聚合语法: 桶聚合语法 桶聚合语法如下所示: ```asp { "aggs": { "<aggregation_name>": { "<aggregation_type>": { "<field>": "<value>" } } } } ``` 其中,aggs表示进行聚合操作,aggregation_name为聚合名称,aggregation_type为聚合类型,field和value为桶聚合需要的参数。 例如,使用术语聚合将文档按照city字段的值进行分组: ```asp { "aggs": { "cities": { "terms": { "field": "city" } } } } ``` 指标聚合语法 指标聚合语法如下所示: ```asp { "aggs": { "<aggregation_name>": { "<aggregation_type>": { "field": "<field_name>" } } } } ``` 其中,aggregation_name为聚合名称,aggregation_type为聚合类型,field_name为需要进行聚合的字段。 例如,使用平均值聚合计算文档中age字段的平均值: ```asp { "aggs": { "average_age": { "avg": { "field": "age" } } } } ``` 嵌套聚合语法 嵌套聚合语法如下所示: ```asp { "aggs": { "<outer_aggregation_name>": { "<outer_aggregation_type>": { "field": "<field_name>" }, "aggs": { "<inner_aggregation_name>": { "<inner_aggregation_type>": { "field": "<nested_field_name>" } } } } } } ``` 其中,outer_aggregation_name为外层聚合名称,outer_aggregation_type为外层聚合类型,field_name为需要进行聚合的字段,inner_aggregation_name为内层聚合名称,inner_aggregation_type为内层聚合类型,nested_field_name为需要进行嵌套聚合的字段。 例如,使用嵌套聚合将文档按照orders字段中price进行求和: ```asp { "aggs": { "orders": { "nested": { "path": "orders" }, "aggs": { "total_sales": { "sum": { "field": "orders.price" } } } } } } ``` **四、代码示例** 以下是一个完整的使用聚合功能的代码示例: ```asp from elasticsearch import Elasticsearch # 创建连接对象 es = Elasticsearch() # 创建索引 mapping = { "properties": { "name": {"type": "keyword"}, "age": {"type": "integer"}, "city": {"type": "keyword"}, "orders": { "type": "nested", "properties": { "price": {"type": "integer"}, "product": {"type": "keyword"} } } } } es.indices.create(index="users", body={"mappings": mapping}) # 添加文档 users = [ {"name": "John", "age": 30, "city": "New York", "orders": [{"product": "apple", "price": 10}, {"product": "banana", "price": 20}]}, {"name": "Bob", "age": 25, "city": "Los Angeles", "orders": [{"product": "orange", "price": 15}, {"product": "grape", "price": 25}]}, {"name": "Mike", "age": 35, "city": "Chicago", "orders": [{"product": "pear", "price": 8}, {"product": "peach", "price": 18}]} ] for user in users: es.index(index="users", body=user) # 桶聚合 bucket_aggs = { "aggs": { "cities": { "terms": { "field": "city" } } } } bucket_res = es.search(index="users", body=bucket_aggs) print("桶聚合结果:") print(bucket_res) # 指标聚合 metric_aggs = { "aggs": { "average_age": { "avg": { "field": "age" } } } } metric_res = es.search(index="users", body=metric_aggs) print("指标聚合结果:") print(metric_res) # 嵌套聚合 nested_aggs = { "aggs": { "orders": { "nested": { "path": "orders" }, "aggs": { "total_sales": { "sum": { "field": "orders.price" } } } } } } nested_res = es.search(index="users", body=nested_aggs) print("嵌套聚合结果:") print(nested_res) ``` 代码中,首先创建了一个名为users的索引,并向其中添加了三个文档。然后,分别使用桶聚合、指标聚合和嵌套聚合进行聚合操作,并将结果输出到控制台。可以看到,三个聚合操作的结果都已经正确地返回了相应的聚合结果。
上一篇:
ElasticSearch推荐搜索选项Suggesters的API
下一篇:
ElasticSearch集群管理API的使用
该分类下的相关小册推荐:
ElasticSearch入门与实践