Elasticsearch的分析分為Bucket,Metric,Pipeline三種類型
Metric
在一組文檔中對某一個數字型字段進行計算名額值
Metric包含兩種單值分析和多值分析
單值分析
隻輸出一個分析結果
min, max, avg, sum,Cardinality(類似 distinct Count)
多值分析
輸出多個分析結果
stats, extended stats,percentile, percentilerank,top hits(排在前面的結果)
Bucket
按照一定的規則,将文檔配置設定到不同的桶中,進而達到分類的目的
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比較
DocValues
預設啟⽤用,可以通過 Mapping 設定關閉
● 增加索引的速度/減少磁盤空間
如果重新打開,需要重建索引
什麼時候需要關閉
● 明确不不需要做排序及聚合分析
FieldData
預設關閉,可以通過Mapping設定打開。修改設定後,即時生效,⽆需重建索引
其他字段類型不支援,隻支援對Text進行設定
打開後,可以對Text字段進⾏排序。但是是對分詞後的term排序,是以,結果往無法滿⾜
預期,不建議使用部分情況下打開,滿足一些聚合分析的特定需求
聚合分析的精準度問題
在分布式系統的計算中,沒法做到在大資料量的情況下,同時保證精确度和資料量
如果要保證精确度,那麼就使用Hadoop
如果要保證明時性,那麼可以使用Es
聚合分析的過程
Es的聚合分析是,首先在每個分片上聚合分析,然後在聚合分析多個分片上的資料
Min聚合分析的執⾏流程
Terms聚合分析的執⾏流程
TermsAggregation的傳回值
在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