天天看點

Elasticsearch4.聚合

Elasticsearch的分析分為Bucket,Metric,Pipeline三種類型

Metric

在一組文檔中對某一個數字型字段進行計算名額值

Metric包含兩種單值分析和多值分析

單值分析

隻輸出一個分析結果

min, max, avg, sum,Cardinality(類似 distinct Count)

多值分析

輸出多個分析結果

stats, extended stats,percentile, percentilerank,top hits(排在前面的結果)

Bucket

Elasticsearch4.聚合

按照一定的規則,将文檔配置設定到不同的桶中,進而達到分類的目的

Bucket包括Terms和數字類型(Range/DataRange,Histogram/DateHistogram)

Terms

字段需要打開fielddata,才能進⾏TermsAggregation

Keyword 預設支援 doc_values

Text需要在 Mapping中enable。會按照分詞後的結果進行分

Cardinality

類似SQL中的Distinct

Bucket Size & Top Hits

當擷取分桶後,桶内最比對的頂部document清單

Bucket + Metric Aggregation

Bucket 聚合分析允許通過添加子聚合分析來進一步分析,子聚合分析可以是Bucket和Metric

Pipeline

⽀持對聚合分析的結果,再次進行聚合分析,Pipeline分為兩種

Sibling

結果和現有分析結果同級

Max,min,Avg&SumBucket,Stats,ExtendedStatusBucket,PercentilesBucket

Parent

結果内嵌到現有的聚合分析結果之中

Derivative(求導),CumultiveSum (累計求和),MovingFunction (滑動窗⼝口)

聚合的作用範圍

ES聚合分析的預設作用範圍是query的查詢結果集,ES也支援以下方式來改變聚合的作用範圍

Filter,Post_Filter,Globa

聚合分析的排序

Elasticsearch預設采用相關性算分對結果進行降序排序

DocValues和FieldData

排序的過程

排序是針對字段原始内容進行的。 反向索引無法發揮作用

需要⽤用到正排索引。通過⽂文檔 Id 和字段快速得到字段原始内容

Elasticsearch 有兩種實作⽅方法

  • Fielddata
  • DocValues(列式存儲,對Text類型無效)

DocValues和FieldData比較

Elasticsearch4.聚合

DocValues

預設啟⽤用,可以通過 Mapping 設定關閉

● 增加索引的速度/減少磁盤空間

如果重新打開,需要重建索引

什麼時候需要關閉

● 明确不不需要做排序及聚合分析

FieldData

預設關閉,可以通過Mapping設定打開。修改設定後,即時生效,⽆需重建索引

其他字段類型不支援,隻支援對Text進行設定

打開後,可以對Text字段進⾏排序。但是是對分詞後的term排序,是以,結果往無法滿⾜

預期,不建議使用部分情況下打開,滿足一些聚合分析的特定需求

聚合分析的精準度問題

Elasticsearch4.聚合

在分布式系統的計算中,沒法做到在大資料量的情況下,同時保證精确度和資料量

如果要保證精确度,那麼就使用Hadoop

如果要保證明時性,那麼可以使用Es

聚合分析的過程

Es的聚合分析是,首先在每個分片上聚合分析,然後在聚合分析多個分片上的資料

Elasticsearch4.聚合

Min聚合分析的執⾏流程

Elasticsearch4.聚合

Terms聚合分析的執⾏流程

Elasticsearch4.聚合

TermsAggregation的傳回值

Elasticsearch4.聚合

在TermsAggregation的傳回中有兩個特殊的數值

doc_count_error_upper_bound:被遺漏的term分桶,包含的⽂檔,有可能的最⼤值

sum_other_doc_count:除了傳回結果bucket的terms以外,其他terms的⽂檔總數(總數-傳回的總數)

解決Terms不準的問題

Terms聚合分析不準的原因,資料分散在多個分⽚上,CoordinatingNode⽆法擷取資料全貌

解決⽅案1

當資料量不⼤時,設定PrimaryShard為1,實作準确性

解決方案2

在分布式資料上,設定shard_size參數,提⾼精确度

原理:每次從Shard上額外多擷取資料,提升準确率

調整shardsize⼤⼩,降低doc_count_error_upper_bound來提升準确度,增加整體計算量,提⾼了準确度,但會降低相應時間,ShardSize預設⼤⼩設定shardsize = size *1.5 +10