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" : "聚合求和字段"
          }
        }
      }
    }
  }
 }      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM