ElastaticSearch--- es多字段聚合

在使用es时,我们经常会用到聚合查询。

简单的聚合查询,已经在前面介绍过,详情见: https://www.cnblogs.com/expiator/p/13843969.html

有时,也会用到多字段聚合查询。类似于Mysql的Group By多个字段。

比如,查询统计各个地区的各个日期,各自的订单总量。

es多字段聚合

DSL的格式,如下所示:

复制代码
{
  "size" : 0,
  "query" : {  },
  "aggregations" : {
    "自己命名的聚合名称1" : {
      "terms" : {
        "field" : "字段名称1",
        "size" : 20000,
        "order" : {
          "_term" : "asc"
        }
      },
	  
      "aggregations" : {
        "自己命名的聚合统计名称2" : {
          "sum" : {
            "field" : "字段名称2"
          }
        },
        "自己命名的聚合名称3" : {
          "terms" : {
            "field" : "字段名称3",
            "size" : 20,
            "order" : {
              "_term" : "asc"
            }
          },
          "aggregations" : {
            "自己命名的聚合统计名称4" : {
              "sum" : {
                "field" : "字段名称4"
              }
            }
          }
        }
      }
	  
    }
  }
} 

示例如下:

复制代码
{
  "size" : 0,
  "query" : {  },
  "aggregations" : {
    "agg_area" : {
      "terms" : {
        "field" : "area",
        "size" : 20000,
        "order" : {
          "_term" : "asc"
        }
      },
      "aggregations" : {
        "sum_area" : {
          "sum" : {
            "field" : "amount"
          }
        },
        "agg_day" :  {
          "terms" : {
            "field" : "day",
            "size" : 20,
            "order" : {
              "_term" : "asc"
            }
          },
          "aggregations" : {
            "sum_day" : {
              "sum" : {
                "field" : "amount"
              }
            }
          }
        }
      }
    }
  }
}

es多字段聚合的java api

示例的代码如下:

复制代码
public String getAggDSL() {
	SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.searchSource();
        //聚合的第二个字段
	AggregationBuilder dayAgg = AggregationBuilders.terms("agg_day").field("day")
			.order(Terms.Order.aggregation(TERM, true)).size(20)
			.subAggregation(AggregationBuilders.sum("sum_day").field("amount"));
	//聚合的第一个字段		
	AggregationBuilder areaDayAgg = AggregationBuilders.terms("agg_area").field("area")
					.order(Terms.Order.aggregation(TERM, true)).size(10000)
					.subAggregation(AggregationBuilders.sum("sum_area").field("amount"))
					.subAggregation(dayAgg);		
					
	return searchSourceBuilder.query().aggregation(areaDayAgg).size(0).toString();				
		
}

script实现es多字段聚合

es多字段聚合,对性能要求不高的话,可以使用script。

对A,B等多个字段进行聚合,那也可以直接将它们组合起来,形成A和B相关的script,

只要script的值相同,就聚合到同一组。

查询语句如下:

复制代码
 {
  "size" : 0,
  "query" : {
    "bool" : {
      "filter" : [
        {
          "term" : {
            "过滤字段1" : {
              "value" : "匹配值"
            }
          }
        },
        {
          "term" : {
            "过滤字段2" : {
              "value" : "匹配值"
            }
          }
        }
      ]
    }
  }
  ,"aggregations" : {
    "聚合名称" : {
      "terms" : {
        "script" : {
          "inline" : "doc['字段名称1'].values +'-'+ doc['字段名称2'].values",
          "lang" : "painless"
        },
        "size" : 10000,
        "order" : {
          "排序字段" : "desc"
        }
      },
      "aggregations" : {
        "自已命令的聚合名称" : {
          "sum" : {
            "field" : "聚合求和字段"
          }
        }
      }
    }
  }
 }      
相关推荐
飞询1 小时前
Docker 安装 Elasticsearch 9
elasticsearch·docker
G皮T2 小时前
【Elasticsearch】检索高亮
大数据·elasticsearch·搜索引擎·全文检索·kibana·检索·高亮
大只鹅16 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
HGW6891 天前
基于 Elasticsearch 实现地图点聚合
java·elasticsearch·高德地图
小袁拒绝摆烂1 天前
ElasticSearch快速入门-1
大数据·elasticsearch·搜索引擎
GISer_Jing2 天前
Git协作开发:feature分支、拉取最新并合并
大数据·git·elasticsearch
高山莫衣2 天前
git rebase多次触发冲突
大数据·git·elasticsearch
kobe_OKOK_2 天前
【团队开发】git 操作流程
git·elasticsearch·团队开发
大只鹅2 天前
Springboot3.3.4使用spring-data-elasticsearch整合Elasticsearch7.12.1
spring boot·elasticsearch
二闹2 天前
SLF4J/Logback 配置与 ELK 集成实战指南
后端·elasticsearch·logstash