ES基本的聚合查詢

ES提供了強大的聚合分析功能,按照操作上細化绍弟,可以主要分為四種锐锣,如下表所示:

聚合方式 解釋
Bucket Aggregation 一些滿足特定條件的文檔的集合
Metric Aggregation 一些數(shù)學(xué)計算腌闯,可以對文檔字段統(tǒng)計分析
Pipeline Aggregation 對其他的聚合結(jié)果進行二次聚合
Metrix Aggregation 支持對多個字段的操作并提供一個結(jié)果矩陣

???? 在我個人看來這些只是理論意義上的細化,在實際的應(yīng)用過程中雕憔,我們并沒有說針對那種場景使用那種聚合分析姿骏。都是為了滿足我們的業(yè)務(wù),在實現(xiàn)的過程中同時會使用到多種聚合的方式斤彼。

一. 四種聚合方式

1.1 Bucket(分桶)

???? 分桶就是將具有某一類共同特征的數(shù)據(jù)歸為一類分瘦,然后求其總數(shù),例如: 男女琉苇、公司同一工作崗位的員工嘲玫、商品高中低檔等。在對數(shù)據(jù)分桶后還可以進一步分桶并扇,例如:0~ 20歲男性去团、21~50歲男性、50歲以上男性穷蛹;同一工作崗位男性土陪、女性;高檔商品好評肴熏、中評鬼雀、差評的商品。


分桶

1.2 Metric(計算)

???? 計算具有一類特征的數(shù)據(jù)的統(tǒng)計值蛙吏,例如平均值取刃、最大值蹋肮、最小值等。

1.3 Pipeline(管道)

???? pipeline與Linux操作系統(tǒng)中的管道操作(將上一步操作的結(jié)果作為下一步操作的數(shù)據(jù)源)類似璧疗。即將上一次聚合操作的結(jié)果作為下一次聚合操作的數(shù)據(jù)源坯辩。

1.4 Metrix(矩陣)

???? 矩陣就是同時可以支持多值的輸出,例如對分桶的數(shù)據(jù)同時求平均崩侠、最大漆魔、最小值;

二. 具體的案例

???? 在說具體的案例的時候筆者并不會嚴(yán)格的去按照四種聚合方式去講解却音。首先在ES中插入一批的測試數(shù)據(jù)改抡,在插入測試數(shù)據(jù)之前先定義mapping.

2.1 mapping的定義

PUT employee
{
  "mappings": {
    "properties": {
      "id": {
        "type": "integer"
      },
      "name": {
        "type": "keyword"
      },
      "job": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      },
      "gender": {
        "type": "keyword"
      }
    }
  }
}

2.2 插入數(shù)據(jù)

PUT employee/_bulk
{"index": {"_id": 1}}
{"id": 1, "name": "Bob", "job": "java", "age": 21, "sal": 8000, "gender": "male"}
{"index": {"_id": 2}}
{"id": 2, "name": "Rod", "job": "html", "age": 31, "sal": 18000, "gender": "female"}
{"index": {"_id": 3}}
{"id": 3, "name": "Gaving", "job": "java", "age": 24, "sal": 12000, "gender": "male"}
{"index": {"_id": 4}}
{"id": 4, "name": "King", "job": "dba", "age": 26, "sal": 15000, "gender": "female"}
{"index": {"_id": 5}}
{"id": 5, "name": "Jonhson", "job": "dba", "age": 29, "sal": 16000, "gender": "male"}
{"index": {"_id": 6}}
{"id": 6, "name": "Douge", "job": "java", "age": 41, "sal": 20000, "gender": "female"}
{"index": {"_id": 7}}
{"id": 7, "name": "cutting", "job": "dba", "age": 27, "sal": 7000, "gender": "male"}
{"index": {"_id": 8}}
{"id": 8, "name": "Bona", "job": "html", "age": 22, "sal": 14000, "gender": "female"}
{"index": {"_id": 9}}
{"id": 9, "name": "Shyon", "job": "dba", "age": 20, "sal": 19000, "gender": "female"}
{"index": {"_id": 10}}
{"id": 10, "name": "James", "job": "html", "age": 18, "sal": 22000, "gender": "male"}
{"index": {"_id": 11}}
{"id": 11, "name": "Golsling", "job": "java", "age": 32, "sal": 23000, "gender": "female"}
{"index": {"_id": 12}}
{"id": 12, "name": "Lily", "job": "java", "age": 24, "sal": 2000, "gender": "male"}
{"index": {"_id": 13}}
{"id": 13, "name": "Jack", "job": "html", "age": 23, "sal": 3000, "gender": "female"}
{"index": {"_id": 14}}
{"id": 14, "name": "Rose", "job": "java", "age": 36, "sal": 6000, "gender": "female"}
{"index": {"_id": 15}}
{"id": 15, "name": "Will", "job": "dba", "age": 38, "sal": 4500, "gender": "male"}
{"index": {"_id": 16}}
{"id": 16, "name": "smith", "job": "java", "age": 32, "sal": 23000, "gender": "male"}

數(shù)據(jù)說明:插入的數(shù)據(jù)為員工信息,name是員工的姓名系瓢,job是員工的工種阿纤,age為員工的年齡,sal為員工的薪水夷陋,gender為員工的性別

2.3 聚合查詢

查詢工種的數(shù)量

GET employee/_search
{
  "size": 0, 
  "aggs": {
    "job_category_count": {
      "cardinality": {
        "field": "job"
      }
    }
  }
}
員工的分桶信息

查詢每個工種的分桶信息

GET employee/_search
{
  "size": 0,
  "aggs": {
    "job_category_num": {
      "cardinality": {
        "field": "job"
      }
    }
  }
}
查詢工種的數(shù)量

查詢不同工種的員工的數(shù)量欠拾,并查詢每個工種最大年齡的員工信息。

GET employee/_search
{
  "size": 0, 
  "aggs": {
    "job_analysis": {
      "terms": {
        "field": "job"
      },
      "aggs": {
        "age_top_1": {
          "top_hits": {
            "size": 1,
            "sort": [
              {
                "age": {
                  "order": "desc"
                }
              }  
            ]
          }
        }
      }
    }
  }
}
不同工種最大年齡員工信息

查詢工資范圍在 0~5000, 5001~8000, 8001~12000, 12001~18000, 18001+ 員工的人數(shù)

GET employee/_search
{
  "size": 0, 
  "aggs": {
    "sal_range_info": {
      "range": {
        "field": "sal",
        "ranges": [
          {
            "to": 5000
          },
          {
            "from": 5001,
            "to": 8000
          },
          {
            "from": 8001,
            "to": 12000
          },
          {
            "from": 12001,
            "to": 18000
          },
          {
            "from": 18001
          }
        ]
      }
    }
  }
}
查詢在指定工資范圍內(nèi)的員工數(shù)量

以每5000為一個區(qū)間骗绕,查詢工資在對應(yīng)范圍內(nèi)的員工的數(shù)量

GET employee/_search
{
  "size": 0, 
  "aggs": {
    "sal_histogram": {
      "histogram": {
        "field": "sal",
        "interval": 5000,
        "extended_bounds": {
          "min": 0,
          "max": 25000
        }
      }
    }
  }
}
直方圖指定區(qū)間查詢

查詢每個工種的數(shù)量藐窄,以及不同工種的工資統(tǒng)計信息

GET employee/_search
{
  "size": 0, 
  "aggs": {
    "job_and_salary_info": {
      "terms": {
        "field": "job"
      },
      "aggs": {
        "sal_info": {
          "stats": {
            "field": "sal"
          }
        }
      }
    }
  }
}
多結(jié)果的矩陣

不同工種下男女員工的數(shù)量,以及男女員工的薪資信息

GET employee/_search
{
  "size": 0, 
  "aggs": {
    "job_gender_sal_info": {
      "terms": {
        "field": "job"
      },
      "aggs": {
        "gender_info": {
          "terms": {
            "field": "gender"
          },
          "aggs": {
            "sal_info": {
              "stats": {
                "field": "sal"
              }
            }
          }
        }
      }
    }
  }
}
聚合嵌套查詢

查詢平均工資最低的部門的平均工資酬土,以及最低工資荆忍。

GET employee/_search
{
  "size": 0, 
  "aggs": {
    "jobs": {
      "terms": {
        "field": "job"
      },
      "aggs": {
        "sal_info": {
          "avg": {
            "field": "sal"
          }
        }
      }
    },
    "min_avg_sal": {
      "max_bucket": {
        "buckets_path": "jobs>sal_info"
      }
    }
  }
}
管道操作(jobs>sal_info中的>不是大于的意思,描述的為路徑)

三. ES自帶航空數(shù)據(jù)案例

查詢到達各目的地的航班的數(shù)量

GET kibana_sample_data_flights/_search
{
  "size": 0, 
  "aggs": {
    "dest_info": {
      "terms": {
        "field": "DestCountry"
      }
    }
  }
}
到各目的地的班次數(shù)

查詢到達各航班的的數(shù)量撤缴,以及票價的最大值刹枉,平均值。

GET kibana_sample_data_flights/_search
{
  "size": 0, 
  "aggs": {
    "dest_info": {
      "terms": {
        "field": "DestCountry"
      },
      "aggs": {
        "max_ticket_price": {
          "max": {
            "field": "AvgTicketPrice"
          }
        },
        "avg_ticket_price": {
          "avg": {
            "field": "AvgTicketPrice"
          }
        }
      }
    }
  }
}
Metric查詢

查詢到達各航班的的數(shù)量屈呕,以及票價的聚合信息以及天氣的基本信息微宝。

GET kibana_sample_data_flights/_search
{
  "size": 0, 
  "aggs": {
    "dest_info": {
      "terms": {
        "field": "DestCountry"
      },
      "aggs": {
        "ticket_info": {
          "stats": {
            "field": "AvgTicketPrice"
          }
        },
        "weather_info": {
          "terms": {
            "field": "DestWeather"
          }
        }
      }
    }
  }
}
Metric與Bucket

鳴謝

全文幾乎沒有自己原創(chuàng)的內(nèi)容,只是對極客時間中阮一鳴老師的 Elasticsearch核心技術(shù)與實戰(zhàn) 自己稍稍的做了下總結(jié)凉袱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侦铜,隨后出現(xiàn)的幾起案子专甩,更是在濱河造成了極大的恐慌,老刑警劉巖钉稍,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涤躲,死亡現(xiàn)場離奇詭異,居然都是意外死亡贡未,警方通過查閱死者的電腦和手機种樱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門蒙袍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嫩挤,你說我怎么就攤上這事害幅。” “怎么了岂昭?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵以现,是天一觀的道長。 經(jīng)常有香客問我约啊,道長邑遏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任恰矩,我火速辦了婚禮记盒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘外傅。我一直安慰自己纪吮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布栏豺。 她就那樣靜靜地躺著彬碱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奥洼。 梳的紋絲不亂的頭發(fā)上巷疼,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音灵奖,去河邊找鬼嚼沿。 笑死,一個胖子當(dāng)著我的面吹牛瓷患,可吹牛的內(nèi)容都是我干的骡尽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼擅编,長吁一口氣:“原來是場噩夢啊……” “哼攀细!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爱态,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谭贪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锦担,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俭识,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年洞渔,在試婚紗的時候發(fā)現(xiàn)自己被綠了套媚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缚态。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堤瘤,靈堂內(nèi)的尸體忽然破棺而出玫芦,到底是詐尸還是另有隱情,我是刑警寧澤宙橱,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布姨俩,位于F島的核電站,受9級特大地震影響师郑,放射性物質(zhì)發(fā)生泄漏环葵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一宝冕、第九天 我趴在偏房一處隱蔽的房頂上張望张遭。 院中可真熱鬧,春花似錦地梨、人聲如沸菊卷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洁闰。三九已至,卻和暖如春万细,著一層夾襖步出監(jiān)牢的瞬間扑眉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工赖钞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腰素,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓雪营,卻偏偏與公主長得像弓千,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子献起,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355