一、介紹 (偏自我理解)
? ? ? ? 1.ES聚合查詢通用流程
? ? ? ? ? ? ? ? 1.分組 ( 好比Mysql ---> group by )
? ? ? ? ? ? ? ? 2.組內(nèi)聚合 也叫 組內(nèi)指標( 好比Mysql ---> SUM()、COUNT()、AVG()、MAX()、MIN() )
? ? ? ? 2.桶(我要是es開發(fā)者,我起名叫啥都行)
? ? ? ? ? ? ? ? 1.滿足特定條件的文檔的集合,叫做桶。
???????????????????桶的就是一組數(shù)據(jù)的集合,對數(shù)據(jù)分組后,得到一組組的數(shù)據(jù),就是一個個的桶
提示:桶等同于組,分桶和分組是一個意思,ES使用桶代表一組相同特征的數(shù)據(jù)。
? ? ? ? 3.指標
? ? ? ? ? ? ? ? 1.指標指的是對文檔進行統(tǒng)計計算方式,又叫指標聚合。
? ? ? ? ? ? ? ? 2.強大之處就是,前面將數(shù)據(jù)經(jīng)過一輪桶聚合,把數(shù)據(jù)分成一個個的桶之后,我們根據(jù)上面計算指標對桶內(nèi)的數(shù)據(jù)進行統(tǒng)計。
{
"aggregations" : {
"<aggregation_name>" : {
"<aggregation_type>" : {
<aggregation_body>
}
[,"aggregations" : { [<sub_aggregation>]+ } ]? // 嵌套聚合查詢,支持多層嵌套
}
[,"<aggregation_name_2>" : { ... } ]* // 多個聚合查詢,每個聚合查詢?nèi)〔煌拿? }
}
說明:
1)aggregations - 代表聚合查詢語句,可以簡寫為aggs
2)<aggregation_name> - 代表一個聚合計算的名字,可以隨意命名,因為ES支持一次進行多次統(tǒng)計分析查詢,后面需要通過這個名字在查詢結(jié)果中找到我們想要的計算結(jié)果。
3)<aggregation_type> - 聚合類型,代表我們想要怎么統(tǒng)計數(shù)據(jù),主要有兩大類聚合類型,桶聚合和指標聚合,這兩類聚合又包括多種聚合類型,例如:指標聚合:sum、avg, 桶聚合:terms、Date histogram等等。
4)<aggregation_body> - 聚合類型的參數(shù),選擇不同的聚合類型,有不同的參數(shù)。
5)aggregation_name_2 - 代表其他聚合計算的名字,意思就是可以一次進行多種類型的統(tǒng)計。
————————————————
版權(quán)聲明:本文為CSDN博主「書蟲罷了」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lazyboy2/article/details/125122815
? ? ? ? 4.舉例說明
下面看個簡單的聚合查詢的例子:
假設(shè)存在一個order索引,存儲了每一筆汽車銷售訂單,里面包含了汽車顏色字段color.
GET /order/_search
{
"size" : 0, // 設(shè)置size=0的意思就是,僅返回聚合查詢結(jié)果,不返回普通query查詢結(jié)果。
"aggs" : { // 聚合查詢語句的簡寫
"popular_colors" : { // 給聚合查詢?nèi)€名字,叫popular_colors
"terms" : { // 聚合類型為,terms,terms是桶聚合的一種,類似SQL的group by的作用,根據(jù)字段分組,相同字段值的文檔分為一組。
"field" : "color" // terms聚合類型的參數(shù),這里需要設(shè)置分組的字段為color,根據(jù)color分組
}
}
}
}
上面使用了terms桶聚合,而且沒有明確指定指標聚合函數(shù),默認使用的是Value Count聚合指標統(tǒng)計文檔總數(shù), 整個統(tǒng)計的意思是統(tǒng)計每一種汽車顏色的銷量。
{
...
"hits": { // 因為size=0,所以query查詢結(jié)果為空
"hits": []
},
"aggregations": { // 聚合查詢結(jié)果
"popular_colors": { // 這個就是popular_colors聚合查詢的結(jié)果,這就是為什么需要給聚合查詢?nèi)€名字的原因,如果有多個聚合查詢,可以通過名字查找結(jié)果
"buckets": [ // 因為是桶聚合,所以看到返回一個buckets數(shù)組,代表分組的統(tǒng)計情況,下面可以看到每一種顏色的銷量情況
{
"key": "red",
"doc_count": 4 // 紅色的汽車銷量為4
},
{
"key": "blue",
"doc_count": 2
},
{
"key": "green",
"doc_count": 2
}
]
}
}
}
? ? ? ? 5.常用方法
常用的統(tǒng)計函數(shù)如下:
- Value Count - 類似sql的count函數(shù),統(tǒng)計總數(shù)
- Cardinality - 類似SQL的count(DISTINCT 字段), 統(tǒng)計不重復的數(shù)據(jù)總數(shù)
- Avg - 求平均值
- Sum - 求和
- Max - 求最大值
- Min - 求最小值
? ? ? ? 4.上貨 (需求:用戶搜索熱詞檢索出搜索最多的Top10)
1.首先檢索熱詞,用戶在input框輸入的時候,每點查詢,數(shù)據(jù)的信息都需要入庫,好在咱們es中統(tǒng)計熱詞
2.插入就不展示了,就說說簡單的熱詞如何分組排序顯示。
3.Kibana操作
//先分組看結(jié)果 這很關(guān)鍵 是思想的提示
GET XXXXXX/_search
{
"size": 0,
"aggs": {
"order_by_word": { //起的別名
"terms": {
"field": "word",
"size": 10
}
}
}
}
//結(jié)果展示
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 69,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"order_by_word" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 5,
"buckets" : [ //buckets 桶 下面都是一個桶內(nèi)不同類型的分桶
{
"key" : "寶馬",
"doc_count" : 19 //這就是上面說的默認是Value_count自動聚合分組后的各數(shù)量
}, 我們就是根據(jù)這個數(shù)量分組后再來排序的不過默認這個關(guān)鍵字為"_count"
{
"key" : "奧迪",
"doc_count" : 18
},
{
"key" : "奔馳",
"doc_count" : 16
},
{
"key" : "謳歌",
"doc_count" : 3
},
{
"key" : "蘭博基尼",
"doc_count" : 2
},
{
"key" : "凱迪拉克",
"doc_count" : 2
},
{
"key" : "雷克薩斯",
"doc_count" : 1
},
{
"key" : "雅迪電動車",
"doc_count" : 1
},
{
"key" : "追風鳥電動車",
"doc_count" : 1
},
{
"key" : "艾瑪電動車",
"doc_count" : 1
}
]
}
}
}
GET lhzz_hot_word/_search
{
"size": 0,
"aggs": {
"order_by_word": {
"terms": {
"field": "word",
"size": 10,
"order": { //排序 結(jié)果和上面一樣 默認采用也是倒序
"_count": "desc"
}
}
}
}
}
????????我覺得這樣再看Java操作就很好理解了 ↓ ↓ ↓ ↓ ↓ ↓
4.Java操作
//搜索索引請求
SearchRequest searchRequest = new SearchRequest("XX_nb_hot_words");
//創(chuàng)建條件數(shù)據(jù)源
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//聚合查詢 top10熱詞
TermsAggregationBuilder field = AggregationBuilders.terms("order_by_word").field("word")
//顯示滿足條件的前10條記錄
.size(10)
//排序 false是降序 true為升序
.order(BucketOrder.aggregation("_count", false));
//把聚合條件 添加至 數(shù)據(jù)源
sourceBuilder.aggregation(field);
//把數(shù)據(jù)源 添加至 請求中
searchRequest.source(sourceBuilder);
//創(chuàng)建list用于循環(huán)接收響應(yīng)的對象
List<HotWordVO> hotWordList = Lists.newArrayList();
try {
//返回響應(yīng)
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//獲取自己起的聚合名稱
Terms terms = response.getAggregations().get("order_by_word");
for (Terms.Bucket bucket : terms.getBuckets()) {
HotWordVO hotWordVO = new HotWordVO();
//咱們指定的 word 字段
String fieldValue = bucket.getKeyAsString();
//咱們指定的 word 字段在該索引出現(xiàn)的次數(shù)
long count = bucket.getDocCount();
hotWordVO.setWord(fieldValue);
hotWordVO.setCount(count);
hotWordList.add(hotWordVO);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
????????將最終結(jié)果,包括關(guān)鍵字以及該關(guān)鍵字的出現(xiàn)次數(shù)都return給前端,讓前端大哥去處理把。
5.福利 (ES聚合用法)
本節(jié)只使用了最簡單的類似SQL的group by的Es?Terms()函數(shù) 更多細節(jié)有很多
ES常用的桶聚合如下:
1)Terms聚合 - 類似SQL的group by,根據(jù)字段唯一值分組
2)Histogram聚合 - 根據(jù)數(shù)值間隔分組,例如: 價格按100間隔分組,0、100、200、300等等
3)Date histogram聚合 - 根據(jù)時間間隔分組,例如:按月、按天、按小時分組
4)Range聚合 - 按數(shù)值范圍分組,例如: 0-150一組,150-200一組,200-500一組。
提示:桶聚合一般不單獨使用,都是配合指標聚合一起使用,對數(shù)據(jù)分組之后肯定要統(tǒng)計桶內(nèi)數(shù)據(jù),在ES中如果沒有明確指定指標聚合,默認使用Value Count指標聚合,統(tǒng)計桶內(nèi)文檔總數(shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-735669.html
6.ES網(wǎng)上學習資料很多都低于7.0,不適用與現(xiàn)在語法很多都廢棄了,所以我也是參照大佬來進行一個自我總結(jié),讓我們共同勉勵,不斷進步把?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-735669.html
到了這里,關(guān)于ES聚合查詢 基于RestHighLevelClient依賴 Java操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!