ElasticSearch學習筆記(二)——對聚合的簡單理解

qq_27311165發表於2018-06-17

    測試資料請看上一篇部落格“筆記(一)”

    聚合的格式一般為

{
	"aggs":{
		"my_agg_name":{
			...
		}
	}
}

    1.若是

{
	"aggs":{
		"my_agg_name":{
			"terms":{
				"field":"city"
			}
		}
	}
}

    相當於

SELECT city,COUNT(*) FROM table GROUP BY city; #分組聚合,會返回buckets

    2.若是

{
	"aggs":{
		"my_agg_name":{
			"avg":{
				"field":"money"
			}
		}
	}
}

    相當於

SELECT AVG(money) FROM table; #度量聚合,會返回一個value

    3.若是

{
	"aggs":{
		"my_agg_name":{
			"terms":{
				"field":"city"
			},
			"aggs":{
				"my_child_agg_name":{
					"avg":{
						"field":"money"
					}
				}
			}
		}
	}
}
    相當於
SELECT city,AVG(money) FROM table GROUP BY city; #分組聚合,會返回buckets,每個bucket裡有一個度量聚合
對比1和3,
SELECT city,COUNT(*) FROM table GROUP BY city; #分組聚合,會返回buckets
SELECT city,AVG(money) FROM table GROUP BY city; #分組聚合,會返回buckets,每個bucket裡有一個度量聚合
SQL語句差不多,一個是統計每組記錄數,一個是統計每組錢的平均值,

但1只用了一次聚合,3在聚合裡用了一個子聚合

    4.重點,並列的子聚合!

{
	"aggs":{
		"my_agg_name":{
			"terms":{
				"field":"city"
			},
			"aggs":{
				"my_child_agg_name":{
					"avg":{
						"field":"money"
					}
				},
				"my_child_agg_name2":{
					"max":{
						"field":"money"
					}
				}
			}
			
		}
	}
}

    相當於

SELECT city,AVG(money),MAX(money) FROM table GROUP BY city; #分組聚合,會返回buckets
    結論:並列的子聚合之間其實沒有一點關係,都是對上一級的結果進行再操作。

    再舉個例子:

{
	"aggs":{
		"my_agg_name":{
			"filter":{  //過濾,查詢所有
				"query": {
					"match_all": {}
				}
			},
			"aggs":{
				"name1_0":{  //並列的子聚合互不影響,對上一級的結果進行操作,按age分組,包含key是15和2的桶(只有15的桶)
					"terms":{
						"field":"age",
						"include":[15,2]
					}
				},
				"name1_4":{  //並列的子聚合互不影響,對上一級的結果進行操作,先過濾出年齡是15的,再按money分組(得到5個桶)
					"filter":{
						"query": {
							"term": {
								"age": 15
							}
						}
					},
					"aggs":{
						"name1_4_0":{
							"terms":{
								"field":"money"
							}
						}
					}
				},
				"name1_5":{  //並列的子聚合互不影響,對上一級的結果進行操作,先過濾出錢是4000的,再按age分組(得到1個桶)
					"filter":{
						"query": {
							"term": {
								"money": 4000
							}
						}
					},
					"aggs":{
						"name1_5_0":{
							"terms":{
								"field":"age"
							}
						}
					}
				}
			}
		}
	}
}
    可以在筆記(一)插入的資料中跑跑上述程式碼,加深理解。


相關文章