.value(
(new MultiValuesSourceFieldConfig.Builder())
.setFieldName(“num”)
.setMissing(0)
.build()
)
.weight(
(new MultiValuesSourceFieldConfig.Builder())
.setFieldName(“num”)
.setMissing(1)
.build()
)
// .valueType(ValueType.LONG)
;
avg.toString();
sourceBuilder.aggregation(avg);
sourceBuilder.size(0);
sourceBuilder.query(
QueryBuilders.termQuery(“sellerId”, 24)
);
searchRequest.source(sourceBuilder);
SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(result);
} catch (Throwable e) {
e.printStackTrace();
} finally {
EsClient.close(client);
}
}
Cardinality Aggregation
基數(shù)聚合,先distinct,再聚合,類似關(guān)系型數(shù)據(jù)庫(count(distinct))。
示例如下:
POST /sales/_search?size=0
{
“aggs” : {
“type_count” : {
“cardinality” : {
“field” : “type”
}
}
}
}
對應(yīng)的JAVA示例如下:
public static void test_Cardinality_Aggregation() {
RestHighLevelClient client = EsClient.getClient();
try {
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(“aggregations_index02”);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
AggregationBuilder aggregationBuild = AggregationBuilders.cardinality(“buyerid_count”).field(“buyerId”);
sourceBuilder.aggregation(aggregationBuild);
sourceBuilder.size(0);
sourceBuilder.query(
QueryBuilders.termQuery(“sellerId”, 24)
);
searchRequest.source(sourceBuilder);
SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(result);
} catch (Throwable e) {
e.printStackTrace();
} finally {
EsClient.close(client);
}
}
返回結(jié)果如下:
{
“took”:30,
“timed_out”:false,
“_shards”:{
“total”:5,
“successful”:5,
“skipped”:0,
“failed”:0
},
“hits”:{
“total”:39,
“max_score”:0,
“hits”:[
]
},
“aggregations”:{
“cardinality#type_count”:{
“value”:11
}
}
}
上述實現(xiàn)與SQL:SELECT COUNT(DISTINCT buyerId) from es_order_tmp where sellerId=24; 效果類似,表示購買了商家id為24的買家個數(shù)。
其核心參數(shù)如下:
- precision_threshold
精確度控制。在此計數(shù)之下,期望計數(shù)接近準(zhǔn)確。在這個值之上,計數(shù)可能會變得更加模糊(不準(zhǔn)確)。支持的最大值是40000,超過此值的閾值與40000的閾值具有相同的效果。默認(rèn)值是3000。
上述示例中返回的11是精確值,如果改寫成下面的代碼,結(jié)果將變的不準(zhǔn)確:
field(“buyerId”).precisionThreshold(5)
其返回結(jié)果如下:
{
“took”:5,
“timed_out”:false,
“_shards”:{
“total”:5,
“successful”:5,
“skipped”:0,
“failed”:0
},
“hits”:{
“total”:39,
“max_score”:0,
“hits”:[
]
},
“aggregations”:{
“cardinality#buyerid_count”:{
“value”:9
}
}
}
- Pre-computed hashes
一個比較好的實踐是需要對字符串類型的字段進行基數(shù)聚合的話,可以提前索引該字符串的hash值,通過對hash值的聚合,提高效率。
- Missing Value
missing參數(shù)定義了應(yīng)該如何處理缺少值的文檔。默認(rèn)情況下,它們將被忽略,但也可以將它們視為具有一個值,通過missing value來設(shè)置。
Extended Stats Aggregation
stats聚合的擴展版本,示例如下:
GET /exams/_search
{
“size”: 0,
“aggs” : {
“grades_stats” : { “extended_stats” : { “field” : “grade” } }
}
}
對應(yīng)的JAVA示例如下:
public static void test_Extended_Stats_Aggregation() {
RestHighLevelClient client = EsClient.getClient();
try {
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(“aggregations_index02”);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
AggregationBuilder aggregationBuild = AggregationBuilders.extendedStats(“extended_stats”)
.field(“num”)
;
sourceBuilder.aggregation(aggregationBuild);
sourceBuilder.size(0);
sourceBuilder.query(
QueryBuilders.termQuery(“sellerId”, 24)
);
searchRequest.source(sourceBuilder);
SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(result);
} catch (Throwable e) {
e.printStackTrace();
} finally {
EsClient.close(client);
}
}
返回的結(jié)果如下:
{
“took”:13,
“timed_out”:false,
“_shards”:{
“total”:5,
“successful”:5,
“skipped”:0,
“failed”:0
},
“hits”:{
“total”:39,
“max_score”:0,
“hits”:[
]
},
“aggregations”:{
“extended_stats#extended_stats”:{
“count”:39, // @1
“min”:1, // @2
“max”:11, // @3
“avg”:1.2820512820512822, // @4
“sum”:50, // @5
“sum_of_squares”:162, // @6
“variance”:2.5101906640368177, // @7
“std_deviation”:1.5843581236692725, // @8
“std_deviation_bounds”:{ // @9
“upper”:4.450767529389827,
“l(fā)ower”:-1.886664965287263
}
}
}
}
將所能支持的聚合類型都返回。
@1:返回符合條件的總條數(shù)。
@2:該屬性在符合條件中的最小值。
@3:該屬性在符合條件中的最大值。
@4:該屬性在符合條件的文檔中的平均值。
@5:該屬性在符合條件的文檔中的sum求和。
@6-9:暫未理解其含義。
同樣支持missing屬性。
max Aggregation
求最大值,與avg Aggregation聚合類似,不再重復(fù)介紹。
min Aggregation
求最小值,與avg Aggregation聚合類似,不再重復(fù)介紹。
Percentiles Aggregation
百分位計算,ES提供的另外一種近似度量方式。主要用于展現(xiàn)以具體百分比下觀察到的數(shù)值,例如,第95個百分位上的數(shù)值,是高于 95% 的數(shù)據(jù)總和。百分位聚合通常用來找出異常,適用與使用統(tǒng)計學(xué)中正態(tài)分布來觀察問題。
官方文檔:https://www.elastic.co/guide/cn/elasticsearch/guide/current/percentiles.html
例如:
GET latency/_search
{
“size”: 0,
“aggs” : {
“l(fā)oad_time_outlier” : {
“percentiles” : {
“field” : “l(fā)oad_time”
}
}
}
}
load_time,在官方文檔中的字段含義為字段加載時間,其返回值如下:
{
…
“aggregations”: {
“l(fā)oad_time_outlier”: {
“values” : {
“1.0”: 5.0,
“5.0”: 25.0,
“25.0”: 165.0,
“50.0”: 445.0,
“75.0”: 725.0,
“95.0”: 945.0,
“99.0”: 985.0
}
}
}
}
默認(rèn)的百分比key為[ 1, 5, 25, 50, 75, 95, 99 ]。
按照官方的解讀,可以這樣理解上述返回結(jié)果:
“1.0”: 5.0;表示(100-1)%的數(shù)據(jù)都大于5.0;也表示1%的數(shù)據(jù)小于5.0。
“5.0”: 25.0 表示,95%的請求的加載時間大于等于25。
“99.0”: 985.0 表示1%的請求的加載時間大于985.0。
- percentile
用來定義其百分比,例如percents:[10,50,95,99]
- keyed
默認(rèn)情況下,keyed參數(shù)為true,其結(jié)果的返回格式如上:
“values” : {
“1.0”: 5.0,
“5.0”: 25.0,
“25.0”: 165.0,
“50.0”: 445.0,
“75.0”: 725.0,
“95.0”: 945.0,
“99.0”: 985.0
}
如果設(shè)置keyed=false,則返回值的格式如下:
“aggregations”: {
“l(fā)oad_time_outlier”: {
“values”: [
{
“key”: 1.0,
“value”: 5.0
},
{
“key”: 5.0,
“value”: 25.0
},
…
]
}
}
- 百分位使用場景
百分位通常使用近似統(tǒng)計。
計算百分位數(shù)有許多不同的算法。簡單實現(xiàn)只是將所有值存儲在一個排序數(shù)組中。要找到第50個百分位,只需找到my_array[count(my_array) * 0.5]處的值。
顯然,這種簡單的實現(xiàn)沒有伸縮性——排序數(shù)組隨數(shù)據(jù)集中值的數(shù)量線性增長。為了計算es集群中可能存在的數(shù)十億個值的百分位數(shù),兼顧性能的需求,故ES通常使用計算近似百分位數(shù)。近似百分位通常使用TDigest 算法。
在使用近似百分位時,通常需要考慮這些:
-
準(zhǔn)確度與q(1-q)成正比。這意味著極端百分位數(shù)(如99%)比不那么極端的百分位數(shù)(如中位數(shù))更準(zhǔn)確
-
對于較小的值集,百分位數(shù)是非常準(zhǔn)確的(如果數(shù)據(jù)足夠小,可能是100%準(zhǔn)確)。
-
當(dāng)桶中值的數(shù)量增加時,算法開始近似百分位數(shù)。它有效地以準(zhǔn)確性換取內(nèi)存節(jié)省。準(zhǔn)確的不準(zhǔn)確程度很難一概而論,因為它取決于您的數(shù)據(jù)分布和聚合的數(shù)據(jù)量。
- Compression
近似算法必須平衡內(nèi)存利用率和估計精度。這個平衡可以使用參數(shù)compression來控制。
TDigest算法使用許多“節(jié)點”來近似百分位數(shù)——可用節(jié)點越多,與數(shù)據(jù)量成比例的準(zhǔn)確性(和大內(nèi)存占用)就越高。壓縮參數(shù)將節(jié)點的最大數(shù)量限制為20 * compression。
因此,通過增加壓縮值,可以以增加內(nèi)存為代價來提高百分位數(shù)的準(zhǔn)確性。較大的壓縮值也會使算法變慢,因為底層樹數(shù)據(jù)結(jié)構(gòu)的大小會增加,從而導(dǎo)致更昂貴的操作。默認(rèn)壓縮值是100。
一個“節(jié)點”使用大約32字節(jié)的內(nèi)存,因此在最壞的情況下(大量數(shù)據(jù)按順序到達),默認(rèn)設(shè)置將產(chǎn)生大約64KB(32 * 20 * 100)大小的TDigest。實際上,數(shù)據(jù)往往更隨機,TDigest使用的內(nèi)存更少。
HDR Histogram(直方圖)
HDR直方圖(High Dynamic Range Histogram,高動態(tài)范圍直方圖)是一種替代實現(xiàn),在計算延遲度量的百分位數(shù)時非常有用,因為它比t-digest實現(xiàn)更快,但需要更大的內(nèi)存占用。此實現(xiàn)維護一個固定的最壞情況百分比錯誤(指定為有效數(shù)字的數(shù)量)。這意味著如果數(shù)據(jù)記錄值從1微秒到1小時(3600000000毫秒)直方圖設(shè)置為3位有效數(shù)字,它將維持一個價值1微秒的分辨率值1毫秒,3.6秒(或更好的)最大跟蹤值(1小時)。
GET latency/_search
{
“size”: 0,
“aggs” : {
“l(fā)oad_time_outlier” : {
“percentiles” : {
“field” : “l(fā)oad_time”,
“percents” : [95, 99, 99.9],
“hdr”: {
“number_of_significant_value_digits” : 3
}
}
}
}
}
- hdr
通過hdr屬性指定直方圖相關(guān)的參數(shù)。
- number_of_significant_value_digits
指定以有效位數(shù)為單位的直方圖值的分辨率。
注意:hdr直方圖只支持正值,如果傳遞負值,則會出錯。如果值的范圍是未知的,那么使用HDRHistogram也不是一個好主意,因為這可能會導(dǎo)致內(nèi)存的大量使用。
- Missing value
missing參數(shù)定義了應(yīng)該如何處理缺少值的文檔。默認(rèn)情況下,它們將被忽略,但也可以將它們視為具有一個值。
Percentiles Aggregation示例(Java Demo):
public static void test_Percentiles_Aggregation() {
RestHighLevelClient client = EsClient.getClient();
try {
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(“aggregations_index02”);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
AggregationBuilder aggregationBuild = AggregationBuilders.percentiles(“percentiles”)
.field(“l(fā)oad_time”)
.percentiles(75,90,99.9)
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進入阿里一直到現(xiàn)在。
深知大多數(shù)Java工程師,想要提升技能,往往是自己摸索成長或者是報班學(xué)習(xí),但對于培訓(xùn)機構(gòu)動則幾千的學(xué)費,著實壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Java開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時減輕大家的負擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學(xué)習(xí)提升的進階課程,基本涵蓋了95%以上Java開發(fā)知識點,真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且后續(xù)會持續(xù)更新
如果你覺得這些內(nèi)容對你有幫助,可以添加V獲?。簐ip1024b (備注Java)
最后
既已說到spring cloud alibaba,那對于整個微服務(wù)架構(gòu),如果想要進一步地向上提升自己,到底應(yīng)該掌握哪些核心技能呢?
就個人而言,對于整個微服務(wù)架構(gòu),像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等這些都是最最核心的知識,架構(gòu)師必經(jīng)之路!下圖,是自繪的微服務(wù)架構(gòu)路線體系大綱,如果有還不知道自己該掌握些啥技術(shù)的朋友,可根據(jù)小編手繪的大綱進行一個參考。
如果覺得圖片不夠清晰,也可來找小編分享原件的xmind文檔!
且除此份微服務(wù)體系大綱外,我也有整理與其每個專題核心知識點對應(yīng)的最強學(xué)習(xí)筆記:
-
出神入化——SpringCloudAlibaba.pdf
-
SpringCloud微服務(wù)架構(gòu)筆記(一).pdf
-
SpringCloud微服務(wù)架構(gòu)筆記(二).pdf
-
SpringCloud微服務(wù)架構(gòu)筆記(三).pdf
-
SpringCloud微服務(wù)架構(gòu)筆記(四).pdf
-
Dubbo框架RPC實現(xiàn)原理.pdf
-
Dubbo最新全面深度解讀.pdf
-
Spring Boot學(xué)習(xí)教程.pdf
-
SpringBoo核心寶典.pdf
-
第一本Docker書-完整版.pdf
-
使用SpringCloud和Docker實戰(zhàn)微服務(wù).pdf
-
K8S(kubernetes)學(xué)習(xí)指南.pdf
另外,如果不知道從何下手開始學(xué)習(xí)呢,小編這邊也有對每個微服務(wù)的核心知識點手繪了其對應(yīng)的知識架構(gòu)體系大綱,不過全是導(dǎo)出的xmind文件,全部的源文件也都在此!文章來源:http://www.zghlxwxcb.cn/news/detail-851142.html
pring cloud alibaba,那對于整個微服務(wù)架構(gòu),如果想要進一步地向上提升自己,到底應(yīng)該掌握哪些核心技能呢?
就個人而言,對于整個微服務(wù)架構(gòu),像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等這些都是最最核心的知識,架構(gòu)師必經(jīng)之路!下圖,是自繪的微服務(wù)架構(gòu)路線體系大綱,如果有還不知道自己該掌握些啥技術(shù)的朋友,可根據(jù)小編手繪的大綱進行一個參考。
[外鏈圖片轉(zhuǎn)存中…(img-Rh12Ut2l-1711657561122)]
如果覺得圖片不夠清晰,也可來找小編分享原件的xmind文檔!
且除此份微服務(wù)體系大綱外,我也有整理與其每個專題核心知識點對應(yīng)的最強學(xué)習(xí)筆記:
-
出神入化——SpringCloudAlibaba.pdf
-
SpringCloud微服務(wù)架構(gòu)筆記(一).pdf
-
SpringCloud微服務(wù)架構(gòu)筆記(二).pdf
-
SpringCloud微服務(wù)架構(gòu)筆記(三).pdf
-
SpringCloud微服務(wù)架構(gòu)筆記(四).pdf
-
Dubbo框架RPC實現(xiàn)原理.pdf
-
Dubbo最新全面深度解讀.pdf
-
Spring Boot學(xué)習(xí)教程.pdf
-
SpringBoo核心寶典.pdf
-
第一本Docker書-完整版.pdf
-
使用SpringCloud和Docker實戰(zhàn)微服務(wù).pdf
-
K8S(kubernetes)學(xué)習(xí)指南.pdf
[外鏈圖片轉(zhuǎn)存中…(img-yGZzCqhR-1711657561122)]
另外,如果不知道從何下手開始學(xué)習(xí)呢,小編這邊也有對每個微服務(wù)的核心知識點手繪了其對應(yīng)的知識架構(gòu)體系大綱,不過全是導(dǎo)出的xmind文件,全部的源文件也都在此!
[外鏈圖片轉(zhuǎn)存中…(img-02XKjh37-1711657561123)]文章來源地址http://www.zghlxwxcb.cn/news/detail-851142.html
到了這里,關(guān)于ES度量聚合(ElasticSearch Metric Aggregations),Java開發(fā)自學(xué)教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!