• 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" : "聚合求和字段"
              }
            }
          }
        }
      }
     }      
    
  • 相关阅读:
    多线程--ThreadLocal类
    常用开发类库支持--UUID及空值处理Optional
    国际化的程序实现及其原理
    浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象
    使用批处理命令注册运行mysql数据库,无需注册mysql服务,可以在任意电脑登录使用
    计算机中位、字长、字的区别
    SQL Server用户自定义数据类型
    简单的回合制小游戏
    单链表创建、删除、查找、插入之C语言实现
    LeetCode-905 Sort Array By Parity Solution (with Java)
  • 原文地址:https://www.cnblogs.com/expiator/p/14429405.html
Copyright © 2020-2023  润新知