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" : "聚合求和字段"
          }
        }
      }
    }
  }
 }      
相关推荐
hengzhepa3 分钟前
ElasticSearch备考 -- Async search
大数据·学习·elasticsearch·搜索引擎·es
bubble小拾7 小时前
ElasticSearch高级功能详解与读写性能调优
大数据·elasticsearch·搜索引擎
不能放弃治疗8 小时前
重生之我们在ES顶端相遇第 18 章 - Script 使用(进阶)
elasticsearch
hengzhepa9 小时前
ElasticSearch备考 -- Search across cluster
学习·elasticsearch·搜索引擎·全文检索·es
Elastic 中国社区官方博客11 小时前
Elasticsearch:使用 LLM 实现传统搜索自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
慕雪华年12 小时前
【WSL】wsl中ubuntu无法通过useradd添加用户
linux·ubuntu·elasticsearch
Elastic 中国社区官方博客14 小时前
使用 Vertex AI Gemini 模型和 Elasticsearch Playground 快速创建 RAG 应用程序
大数据·人工智能·elasticsearch·搜索引擎·全文检索
alfiy15 小时前
Elasticsearch学习笔记(四) Elasticsearch集群安全配置一
笔记·学习·elasticsearch
alfiy15 小时前
Elasticsearch学习笔记(五)Elastic stack安全配置二
笔记·学习·elasticsearch
丶21361 天前
【大数据】Elasticsearch 实战应用总结
大数据·elasticsearch·搜索引擎