Aggregation 可以和普通查詢結(jié)果并存,一個查詢結(jié)果中也允許包含多個不相關的Aggregation. 如果只關心聚合結(jié)果而不關心查詢結(jié)果的話會把SearchSource的size設置為0,能有效提高性能.
創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設、網(wǎng)站設計與策劃設計,大寧網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設十載,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:大寧等地區(qū)。大寧做網(wǎng)站價格咨詢:028-86922220
Metrics:
簡單聚合類型, 對于目標集和中的所有文檔計算聚合指標, 一般沒有嵌套的sub aggregations. 比如 平均值(avg) , 求和 (sum), 計數(shù) (count), 基數(shù) (cardinality). Cardinality對應distinct count
Bucketing:
桶聚合類型, 在一系列的桶而不是所有文檔上計算聚合指標,每個桶表示原始結(jié)果集合中符合某種條件的子集. 一般有嵌套的sub aggregations. 典型的如TermsAggregation, HistogramAggregation
Matrix:
矩陣聚合, 多維度聚合, 即根據(jù)兩個或者多個聚合維度計算二維甚至多維聚合指標表格. 目前貌似只有一種MatrixStatAggregation. 并且目前不支持腳本(scripting)
Aggregation request:
兩層結(jié)構(gòu):
Aggregation -> SubAggregation
Sub aggregation是在原來的Aggregation的計算結(jié)果中進一步做聚合計算
Aggregation response:
三層結(jié)構(gòu): (針對Bucketing aggregation) MultiBucketsAggregation -> Buckets -> Aggregations
Aggregation 屬性:
name: 和請求中的Aggregation的名字對應
buckets: 每個Bucket對應Agggregation結(jié)果中每一個可能的取值和相應的聚合結(jié)果.
Bucket 屬性:
key: 對應的是聚合維度可能的取值, 具體的值和Aggregation的類型有關, 比如Term aggregation (按交易類型計算總金額), 那么Bucket key值就是所有可能的交易類型 (credit/debit etc). 又比如DateHistogram aggregation (按天計算交易筆數(shù)), 那么Bucket key值就是具體的日期.
docCount: 對應的是每個桶中的文本數(shù)量.
value: 對應的是聚合指標的計算結(jié)果. 注意如果是多層Aggregation計算, 中間層的Aggregation value一般沒有值, 比如Term aggregation. 只有到底層具體計算指標的Aggregation才有值.
aggregations: 對應請求中當前Aggregation的subAggregation的計算結(jié)果 (如果存在)
SQL映射實現(xiàn)的前提: 只針對聚合計算,即sql select部分存在聚合函數(shù)類型的column
映射過程很難直接描述,上幾個例子方便大家理解,反正SQL的結(jié)構(gòu)也無非就是SELECT/FROM/WHERE/GROUP BY/HAVING/ORDER BY. ORDER BY先不討論,一般聚合結(jié)果不太關心順序. FROM也很容易理解,就是索引的名字.
SQL組成部分對應的ES Builder:
Column 1 | Column 2 | Column 3 |
---|---|---|
select column (聚合函數(shù)) | MetricsAggregationBuilder 由 column對應聚合函數(shù)決定 (例如 MaxAggregationBuilder) | |
select column (group by 字段) | Bucket key | |
where | FiltersAggregationBuilder + FiltersAggregator.KeydFilter | keyedFilter = FiltersAggregator.KeyedFilter("combineCondition", sub QueryBuilder) <br/> AggregationBuilders.filters("whereAggr", keyedFilter) |
group by | TermsAggregationBuilder | AggregationBuilders.terms("aggregation name").field(fieldName) |
having | MetricsAggregationBuilder 由 having 條件聚合函數(shù)決定 (例如 MaxAggregationBuilder) + BucketSelectorPipelineAggregationBuilder | PipelineAggregatorBuilders.bucketSelector(aggregationName, bucketPathMap, script) |
常用的SQL運算符和聚合函數(shù)對應的ES Builder:
Sql element | Aggregation Type | Code to build |
---|---|---|
count(field) | ValueCountAggregationBuilder | AggregationBuilders.count(metricsName).field(fieldName) |
count(distinct field) | CardinalityAggregationBuilder | AggregationBuilders.cardinality(metricsName).field(fieldName) |
sum(field) | SumAggregationBuilder | AggregationBuilders.sum(metricsName).field(fieldName) |
min(field) | MinAggregationBuilder | AggregationBuilders.min(metricsName).field(fieldName) |
max(field) | MaxAggregationBuilder | AggregationBuilders.max(metricsName).field(fieldName) |
avg(field) | AvgAggregationBuilder | AggregationBuilders.avg(metricsName).field(fieldName) |
AND | BoolQueryBuilder | QueryBuilders.boolQuery().must().add(sub QueryBuilder) |
OR | BoolQueryBuilder | QueryBuilders.boolQuery().should().add(sub QueryBuilder) |
NOT | BoolQueryBuilder | QueryBuilders.boolQuery().mustNot().add(sub QueryBuilder) |
= | TermQueryBuilder | QueryBuilders.termQuery(fieldName, value) |
IN | TermsQueryBuilder | QueryBuilders.termsQuery(fieldName, values) |
LIKE | WildcardQueryBuilder | QueryBuilders.wildcardQuery(fieldName, value) |
> | RangeQueryBuilder | QueryBuilders.rangeQuery(fieldName).gt(value) |
>= | RangeQueryBuilder | QueryBuilders.rangeQuery(fieldName).gte(value) |
< | RangeQueryBuilder | QueryBuilders.rangeQuery(fieldName).lt(value) |
<= | RangeQueryBuilder | QueryBuilders.rangeQuery(fieldName).lte(value) |
1.select count(payerId) as payerCount from Payment group by country
這里需要注意的是payerId這個doc的屬性在實際構(gòu)造的Aggregation query 中變成了 payerId.keyword,Elasticsearch 默認對于分詞的字段(text類型)不支持聚合,會報出 "Fielddata is disabled on text fields by default. Set fielddata=true"的錯誤. fielddata聚合是一個非常costly的運算,一般不建議使用. 好在Elasticsearch索引時默認會對payerId這個屬性生成兩個字段, payerId 是分詞的text類型, payerId.keyword是不分詞的keyword類型.
2.select max(payerId) from Payment group by accountId, country
兩個group by 條件對應兩層term aggregation
3.select count(distinct payerId) as payerCount from Payment where country in ('CN', 'GE') group by accountId, country
增加了where條件, 在頂層是一個FiltersAggregationBuilder. 其中分為兩部分, 其中filters對應的是所有查詢條件構(gòu)建的一個KeyedFilter, 其中又包含了多個子查詢條件. aggregations 對應的是groupBy條件和select部分的聚合函數(shù)
4.select count(distinct payerId) as payerCount from Payment where withinTime(createAt, 1, 'DAY') and name like '%SH%' group by accountId, country
多個where條件, 用BoolQueryBuilder組合起來
5.select max(amount) as maxAmt, min(amount) as minAmt from Payment where amount > 1000.00 or amount <= 50.53 group by accountId, country having count(distinct beneficiaryId) > 3 and sum(amount) > 1530.20
史上最復雜SQL產(chǎn)生! 這里主要關注having部分的處理, 用到了Pipeline類型的BucketSelectorPipelineAggregationBuilder. 在最后一個GroupBy 條件對應的term aggregation下增加了兩類子節(jié)點: sub aggregations 除了包括select 部分的聚合函數(shù)還包括having條件對應的聚合函數(shù). pipeline aggregations 包括having條件對應的 BucketSelectorPipelineAggregationBuilder. BucketSelectorPipelineAggregationBuilder 主要的屬性有: bucketsPathMap: 保存了path的名字和對應的聚合屬性的映射,script:用腳本描述聚合條件,但是條件左側(cè)不直接使用屬性名而是path的名字替換
注意雖然從邏輯上來說having 條件是應用在之前計算出聚合的結(jié)果之上, 但是從ES Aggregation的結(jié)構(gòu)來看, BucketSelectorPipelineAggregationBuilder和having 條件中對應聚合指標的Aggregation是兄弟關系而不是父子關系!
另外要注意script path 是對于兄弟節(jié)點(sibling node)一個相對路徑而不是從根節(jié)點Aggregation的絕對路徑,用的是聚合屬性的名稱而不是Aggregation本身的名稱. 并且要求根據(jù)路徑訪問到的Bucket必須是唯一的,因為BucketSelector只是根據(jù)條件判斷當前Bucket是否被選擇, 如果路徑返回多個Bucket則無法應用這種Bool判斷.
6.select count(paymentId) from Payment group by timeRange(createdAt, '1D', 'yyyy/MM/dd')
這里用到一個自定義函數(shù)timeRage, 表示對于createAt這個屬性按天聚合,對應的ES aggregation類型為DateHistogramAggregation
Bucket count
Distinct count: Elasticsearch 采用的是基于hyperLogLog的近似算法.
https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html
網(wǎng)頁題目:ElasticsearchAggregation筆記
轉(zhuǎn)載來源:http://www.chinadenli.net/article26/ieojcg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設、手機網(wǎng)站建設、標簽優(yōu)化、關鍵詞優(yōu)化、Google、網(wǎng)站設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)