es 时间字段聚合_ES之五:ElasticSearch聚合
1、單值聚合
Sum求和,dsl參考如下:
{
"size": 0,
"aggs": {
"return_balance": {
"sum": {
"field": "balance"
}
}
}
}
返回balance之和,其中size=0 表示不需要返回參與查詢的文檔。
Min求最小值
{
"size": 0,
"aggs": {
"return_min_balance": {
"min": {
"field": "balance"
}
}
}
}
返回結(jié)果
Max求最大值
{
"size": 0,
"aggs": {
"return_max_balance": {
"max": {
"field": "balance"
}
}
}
}
返回結(jié)果:
AVG求平均值
{
"size": 0,
"aggs": {
"return_avg_balance": {
"avg": {
"field": "balance"
}
}
}
}
返回結(jié)果:
Cardinality 求基數(shù)(如下示例,查找性別的基數(shù) M、F,共兩個)
{
"size": 0,
"aggs": {
"return_cardinality": {
"cardinality": {
"field": "gender"
}
}
}
}
結(jié)果為:
2、多值聚合
percentiles 求百分比
查看官方文檔時候,沒看懂,下面是自己測試時的例子,按照性別(F,M)查看工資范圍的百分比
{
"size": 0,
"aggs": {
"states": {
"terms": {
"field": "gender"
},
"aggs": {
"banlances": {
"percentile_ranks": {
"field": "balance",
"values": [
20000,
40000
]
}
}
}
}
}
結(jié)果:
stats 統(tǒng)計
查看balance的統(tǒng)計情況:
{
"size": 0,
"aggs": {
"balance_stats": {
"stats": {
"field": "balance"
}
}
}
}
返回結(jié)果:
extended_stats?擴展統(tǒng)計
{
"size": 0,
"aggs": {
"balance_stats": {
"extended_stats": {
"field": "balance"
}
}
}
}
結(jié)果:
更加復雜的查詢,后續(xù)慢慢在實踐中道來。
Terms聚合
記錄有多少F,多少M
{
"size": 0,
"aggs": {
"genders": {
"terms": {
"field": "gender"
}
}
}
}
返回結(jié)果如下:m記錄507條,f記錄493條
數(shù)據(jù)的不確定性
使用terms聚合,結(jié)果可能帶有一定的偏差與錯誤性。
比如:
我們想要獲取name字段中出現(xiàn)頻率最高的前5個。
此時,客戶端向ES發(fā)送聚合請求,主節(jié)點接收到請求后,會向每個獨立的分片發(fā)送該請求。
分片獨立的計算自己分片上的前5個name,然后返回。當所有的分片結(jié)果都返回后,在主節(jié)點進行結(jié)果的合并,再求出頻率最高的前5個,返回給客戶端。
這樣就會造成一定的誤差,比如最后返回的前5個中,有一個叫A的,有50個文檔;B有49。 但是由于每個分片獨立的保存信息,信息的分布也是不確定的。 有可能第一個分片中B的信息有2個,但是沒有排到前5,所以沒有在最后合并的結(jié)果中出現(xiàn)。 這就導致B的總數(shù)少計算了2,本來可能排到第一位,卻排到了A的后面。
size與shard_size
為了改善上面的問題,就可以使用size和shard_size參數(shù)。
size參數(shù)規(guī)定了最后返回的term個數(shù)(默認是10個)
shard_size參數(shù)規(guī)定了每個分片上返回的個數(shù)
如果shard_size小于size,那么分片也會按照size指定的個數(shù)計算
通過這兩個參數(shù),如果我們想要返回前5個,size=5;shard_size可以設(shè)置大于5,這樣每個分片返回的詞條信息就會增多,相應(yīng)的誤差幾率也會減小。
order排序
order指定了最后返回結(jié)果的排序方式,默認是按照doc_count排序。
{
"aggs" : {
"genders" : {
"terms" : {
"field" : "gender",
"order" : { "_count" : "asc" }
}
}
}
}
也可以按照字典方式排序:
{
"aggs" : {
"genders" : {
"terms" : {
"field" : "gender",
"order" : { "_term" : "asc" }
}
}
}
}
當然也可以通過order指定一個單值聚合,來排序。
{
"aggs" : {
"genders" : {
"terms" : {
"field" : "gender",
"order" : { "avg_balance" : "desc" }
},
"aggs" : {
"avg_balance" : { "avg" : { "field" : "balance" } }
}
}
}
}
同時也支持多值聚合,不過要指定使用的多值字段:
{
"aggs" : {
"genders" : {
"terms" : {
"field" : "gender",
"order" : { "balance_stats.avg" : "desc" }
},
"aggs" : {
"balance_stats" : { "stats" : { "field" : "balance" } }
}
}
}
}
返回結(jié)果:
min_doc_count與shard_min_doc_count
聚合的字段可能存在一些頻率很低的詞條,如果這些詞條數(shù)目比例很大,那么就會造成很多不必要的計算。
因此可以通過設(shè)置min_doc_count和shard_min_doc_count來規(guī)定最小的文檔數(shù)目,只有滿足這個參數(shù)要求的個數(shù)的詞條才會被記錄返回。
通過名字就可以看出:
min_doc_count:規(guī)定了最終結(jié)果的篩選
shard_min_doc_count:規(guī)定了分片中計算返回時的篩選
script
桶聚合也支持腳本的使用:
{
"aggs" : {
"genders" : {
"terms" : {
"script" : "doc[‘gender‘].value"
}
}
}
}
以及外部腳本文件:
{
"aggs" : {
"genders" : {
"terms" : {
"script" : {
"file": "my_script",
"params": {
"field": "gender"
}
}
}
}
}
}
filter
filter字段提供了過濾的功能,使用兩種方式:include可以匹配出包含該值的文檔,exclude則排除包含該值的文檔。
例如:
{
"aggs" : {
"tags" : {
"terms" : {
"field" : "tags",
"include" : ".*sport.*",
"exclude" : "water_.*"
}
}
}
}
上面的例子中,最后的結(jié)果應(yīng)該包含sport并且不包含water。
也支持數(shù)組的方式,定義包含與排除的信息:
{
"aggs" : {
"JapaneseCars" : {
"terms" : {
"field" : "make",
"include" : ["mazda", "honda"]
}
},
"ActiveCarManufacturers" : {
"terms" : {
"field" : "make",
"exclude" : ["rover", "jensen"]
}
}
}
}
多字段聚合
通常情況,terms聚合都是僅針對于一個字段的聚合。因為該聚合是需要把詞條放入一個哈希表中,如果多個字段就會造成n^2的內(nèi)存消耗。
不過,對于多字段,ES也提供了下面兩種方式:
1 使用腳本合并字段
2 使用copy_to方法,合并兩個字段,創(chuàng)建出一個新的字段,對新字段執(zhí)行單個字段的聚合。
collect模式
對于子聚合的計算,有兩種方式:
depth_first 直接進行子聚合的計算
breadth_first 先計算出當前聚合的結(jié)果,針對這個結(jié)果在對子聚合進行計算。
默認情況下ES會使用深度優(yōu)先,不過可以手動設(shè)置成廣度優(yōu)先,比如:
{
"aggs" : {
"actors" : {
"terms" : {
"field" : "actors",
"size" : 10,
"collect_mode" : "breadth_first"
},
"aggs" : {
"costars" : {
"terms" : {
"field" : "actors",
"size" : 5
}
}
}
}
}
}
缺省值Missing value
缺省值指定了缺省的字段的處理方式:
{
"aggs" : {
"tags" : {
"terms" : {
"field" : "tags",
"missing": "N/A"
}
}
}
}
總結(jié)
以上是生活随笔為你收集整理的es 时间字段聚合_ES之五:ElasticSearch聚合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svn复制出来的java_从svn下载的
- 下一篇: 码工里开关灯为什么遮罩层在下面_装修公司