在ES搜索中,聚合是一個非常重要的概念。通過ES聚合,我們可以快速地對搜索結果進行匯總統計,方便查詢分析。而在實際應用中,有時候需要對多個欄位進行聚合,這時就需要使用到ES的多欄位聚合。
一、使用多欄位聚合進行分組統計
使用ES的多欄位聚合進行分組統計是一個非常常見的需求。比如,在一個電商網站中,需要對商品進行分組統計,統計出每個品牌下每個分類的銷售數量以及銷售額。這時就需要使用到ES的多欄位聚合。
{ "aggs": { "brand_group": { "terms": { "field": "brand.keyword", "size": 10 }, "aggs": { "category_group": { "terms": { "field": "category.keyword", "size": 10 }, "aggs": { "sales_count": { "sum": { "field": "sales_count" } }, "sales_sum_amount": { "sum": { "field": "sales_amount" } } } } } } } }
上面的代碼中,首先使用了一個名為「brand_group」的聚合,根據「brand.keyword」欄位進行聚合,並限制聚合結果返回的桶的數量為10個。在「brand_group」聚合下嵌套了一個名為「category_group」的聚合,根據「category.keyword」欄位進行聚合,並同樣限制返回的桶數量為10個。
在「category_group」聚合下,有兩個子聚合「sales_count」和「sales_sum_amount」。這兩個子聚合分別聚合了「sales_count」和「sales_amount」欄位,並對這兩個欄位進行求和。這樣就能統計出每個品牌下每個分類的銷售數量以及銷售額。
二、使用多欄位聚合進行統計排序
除了進行分組統計,還可以使用ES的多欄位聚合進行統計排序。比如,在一個房產網站中,需要對房源進行統計排序,以便用戶更快地找到自己需要的房源。這時就可以使用ES的多欄位聚合進行統計排序。
{ "size": 10, "aggs": { "price_stat": { "stats": { "field": "price" } }, "price_group": { "histogram": { "field": "price", "interval": 500 }, "aggs": { "area_group": { "terms": { "field": "area" }, "aggs": { "price_avg": { "avg": { "field": "price" } } } } } }, "price_ranges": { "range": { "field": "price", "ranges": [ { "from": 0, "to": 500 }, { "from": 500, "to": 1000 }, { "from": 1000, "to": 2000 }, { "from": 2000, "to": 5000 } ] } } } }
上面的代碼中,首先使用了一個「stats」聚合,對「price」欄位進行統計,得到該欄位的最大值、最小值、平均值和總和。
在「price_group」聚合中,使用了一個「histogram」聚合對「price」欄位進行切分,並在每個價位桶中再使用「terms」聚合按照「area」欄位進行聚合。最終在每個桶下面還使用了一個「avg」聚合,對「price」欄位求出了該桶內的平均價格。
最後一個聚合「price_ranges」使用了一個「range」聚合,將價格按照一定的區間進行歸納,並使用「from」和「to」欄位指定了價格區間的範圍。這樣就可以方便地進行價格篩選,供用戶使用。
三、使用多欄位聚合進行數據透視
除了分組統計和統計排序,ES的多欄位聚合還可以進行數據透視。比如,在一個企業的訂單管理系統中,需要統計某個時間段內每個員工的銷售額,並按照部門進行分類,同時還需要統計每個員工的銷售額占該部門總銷售額的百分比。
{ "aggs": { "dept_group": { "terms": { "field": "dept.keyword", "size": 10 }, "aggs": { "employee_group": { "terms": { "field": "employee.keyword", "size": 10 }, "aggs": { "sales_amount": { "sum": { "field": "sales_amount" } }, "dept_sales_amount": { "sum": { "field": "sales_amount" }, "partition": { "terms": { "field": "dept.keyword", "size": 10 } } } } } } } } }
上面的代碼中,首先使用了一個名為「dept_group」的聚合,根據「dept.keyword」欄位進行聚合,並限制結果桶的數量為10個。在「dept_group」聚合下面嵌套了一個名為「employee_group」的聚合,根據「employee.keyword」欄位進行聚合,並同樣限制結果桶數量為10個。
在「employee_group」聚合下,有兩個子聚合「sales_amount」和「dept_sales_amount」。其中,「sales_amount」聚合對「sales_amount」欄位進行求和,統計每個員工的銷售額;「dept_sales_amount」聚合也對「sales_amount」欄位進行求和,並增加了「partition」子聚合,對「dept.keyword」進行聚合,計算出每個部門的總銷售額。
通過這兩個聚合的組合,我們可以計算出每個員工的銷售額,以及他所在部門的總銷售額。這樣就可以方便地計算每個員工的銷售額占該部門總銷售額的百分比。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/287040.html