一、數(shù)據(jù)聚合
聚合(aggregations)可以讓我們極其方便的實(shí)現(xiàn)對(duì)數(shù)據(jù)的統(tǒng)計(jì)、分析、運(yùn)算。例如:
-
什么品牌的手機(jī)最受歡迎?
-
這些手機(jī)的平均價(jià)格、最高價(jià)格、最低價(jià)格?
-
這些手機(jī)每月的銷(xiāo)售情況如何?
實(shí)現(xiàn)這些統(tǒng)計(jì)功能的比數(shù)據(jù)庫(kù)的sql要方便的多,而且查詢(xún)速度非???,可以實(shí)現(xiàn)近實(shí)時(shí)搜索效果。
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-444432.html
1.1、聚合的種類(lèi)
聚合常見(jiàn)的有三類(lèi):
-
桶(Bucket)聚合:用來(lái)對(duì)文檔做分組
-
TermAggregation:按照文檔字段值分組,例如按照品牌值分組、按照國(guó)家分組
-
Date Histogram:按照日期階梯分組,例如一周為一組,或者一月為一組
-
-
度量(Metric)聚合:用以計(jì)算一些值,比如:最大值、最小值、平均值等
-
Avg:求平均值
-
Max:求最大值
-
Min:求最小值
-
Stats:同時(shí)求max、min、avg、sum等
-
-
管道(pipeline)聚合:其它聚合的結(jié)果為基礎(chǔ)做聚合
注意:參加聚合的字段必須是keyword、日期、數(shù)值、布爾類(lèi)型
?
1.2、DSL實(shí)現(xiàn)聚合
我們要統(tǒng)計(jì)所有數(shù)據(jù)中的酒店品牌有幾種,其實(shí)就是按照品牌對(duì)數(shù)據(jù)分組。此時(shí)可以根據(jù)酒店品牌的名稱(chēng)做聚合,也就是Bucket聚合。
Bucket聚合語(yǔ)法
語(yǔ)法如下:
GET?/hotel/_search { ??"size":?0,??//?設(shè)置size為0,結(jié)果中不包含文檔,只包含聚合結(jié)果 ??"aggs":?{?//?定義聚合 ????"brandAgg":?{?//給聚合起個(gè)名字 ??????"terms":?{?//?聚合的類(lèi)型,按照品牌值聚合,所以選擇term ????????"field":?"brand",?//?參與聚合的字段 ????????"size":?20?//?希望獲取的聚合結(jié)果數(shù)量 ??????} ????} ??} }
結(jié)果如圖:
?
聚合結(jié)果排序
默認(rèn)情況下,Bucket聚合會(huì)統(tǒng)計(jì)Bucket內(nèi)的文檔數(shù)量,記為count,并且按照count降序排序。
我們可以指定order屬性,自定義聚合的排序方式:
GET?/hotel/_search { ??"size":?0,? ??"aggs":?{ ????"brandAgg":?{ ??????"terms":?{ ????????"field":?"brand", ????????"order":?{ ??????????"_count":?"asc" //?按照_count升序排列 ????????}, ????????"size":?20 ??????} ????} ??} }
限定聚合范圍
默認(rèn)情況下,Bucket聚合是對(duì)索引庫(kù)的所有文檔做聚合,但真實(shí)場(chǎng)景下,用戶(hù)會(huì)輸入搜索條件,因此聚合必須是對(duì)搜索結(jié)果聚合。那么聚合必須添加限定條件。
我們可以限定要聚合的文檔范圍,只要添加query條件即可:
GET?/hotel/_search { ??"query":?{ ????"range":?{ ??????"price":?{ ????????"lte":?200 // 只對(duì)200元以下的文檔聚合 ??????} ????} ??},? ??"size":?0,? ??"aggs":?{ ????"brandAgg":?{ ??????"terms":?{ ????????"field":?"brand", ????????"size":?20 ??????} ????} ??} }
這次,聚合得到的品牌明顯變少了:
Metric聚合語(yǔ)法
對(duì)桶內(nèi)的酒店做運(yùn)算,獲取每個(gè)品牌的用戶(hù)評(píng)分的min、max、avg等值。
這就要用到Metric聚合了,例如stat聚合:就可以獲取min、max、avg等結(jié)果。
語(yǔ)法如下:
GET?/hotel/_search { ??"size":?0,? ??"aggs":?{ ????"brandAgg":?{? ??????"terms":?{? ????????"field":?"brand",? ????????"size":?20 ??????}, ??????"aggs":?{?//?是brands聚合的子聚合,也就是分組后對(duì)每組分別計(jì)算 ????????"score_stats":?{?//?聚合名稱(chēng) ??????????"stats":?{?//?聚合類(lèi)型,這里stats可以計(jì)算min、max、avg等 ????????????"field":?"score"?//?聚合字段,這里是score ??????????} ????????} ??????} ????} ??} }
這次的score_stats聚合是在brandAgg的聚合內(nèi)部嵌套的子聚合。因?yàn)槲覀冃枰诿總€(gè)桶分別計(jì)算。?
?
另外,我們還可以給聚合結(jié)果做個(gè)排序,例如按照每個(gè)桶的酒店平均分做排序:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-444432.html
到了這里,關(guān)于Elasticsearch --- 數(shù)據(jù)聚合、自動(dòng)補(bǔ)全的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!