Elasticsearch聚合查詢

聚合 aggregations

聚合可以讓我們極其方便的實(shí)現(xiàn)對(duì)數(shù)據(jù)的統(tǒng)計(jì)铺罢、分析。例如:

  • 什么品牌的手機(jī)最受歡迎会烙?
  • 這些手機(jī)的平均價(jià)格负懦、最高價(jià)格、最低價(jià)格柏腻?
  • 這些手機(jī)每月的銷(xiāo)售情況如何纸厉?

1、基本概念

Elasticsearch中的聚合五嫂,包含多種類(lèi)型颗品,最常用的兩種肯尺,一個(gè)叫,一個(gè)叫度量

桶(bucket)

桶的作用躯枢,是按照某種方式對(duì)數(shù)據(jù)進(jìn)行分組则吟,每一組數(shù)據(jù)在ES中稱為一個(gè),例如我們根據(jù)品牌對(duì)手機(jī)劃分锄蹂,可以得到小米桶氓仲、華為桶蘋(píng)果桶……或者我們按照年齡段對(duì)人進(jìn)行劃分:010,1020,2030,3040等得糜。

Elasticsearch中提供的劃分桶的方式有很多:

  • Date Histogram Aggregation:根據(jù)日期階梯分組敬扛,例如給定階梯為周,會(huì)自動(dòng)每周分為一組
  • Histogram Aggregation:根據(jù)數(shù)值階梯分組掀亩,與日期類(lèi)似
  • Terms Aggregation:根據(jù)詞條內(nèi)容分組舔哪,詞條內(nèi)容完全匹配的為一組
  • Range Aggregation:數(shù)值和日期的范圍分組欢顷,指定開(kāi)始和結(jié)束槽棍,然后按段分組
  • ……

綜上所述,我們發(fā)現(xiàn)bucket aggregations 只負(fù)責(zé)對(duì)數(shù)據(jù)進(jìn)行分組抬驴,并不進(jìn)行計(jì)算炼七,因此往往bucket中往往會(huì)嵌套另一種聚合:metrics aggregations即度量

度量(metrics)

分組完成以后,我們一般會(huì)對(duì)組中的數(shù)據(jù)進(jìn)行聚合運(yùn)算布持,例如求平均值豌拙、最大、最小题暖、求和等按傅,這些在ES中稱為度量

比較常用的一些度量聚合方式:

  • Avg Aggregation:求平均值
  • Max Aggregation:求最大值
  • Min Aggregation:求最小值
  • Percentiles Aggregation:求百分比
  • Stats Aggregation:同時(shí)返回avg、max胧卤、min唯绍、sum、count等
  • Sum Aggregation:求和
  • Top hits Aggregation:求前幾
  • Value Count Aggregation:求總數(shù)
  • ……

為了測(cè)試聚合枝誊,我們先批量導(dǎo)入一些數(shù)據(jù)
創(chuàng)建索引:

PUT /cars
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "transactions": {
      "properties": {
        "color": {
          "type": "keyword"
        },
        "make": {
          "type": "keyword"
        }
      }
    }
  }
}

注意:在ES中况芒,需要進(jìn)行聚合、排序叶撒、過(guò)濾的字段其處理方式比較特殊绝骚,因此不能被分詞。這里我們將color和make這兩個(gè)文字類(lèi)型的字段設(shè)置為keyword類(lèi)型祠够,這個(gè)類(lèi)型不會(huì)被分詞压汪,將來(lái)就可以參與聚合

導(dǎo)入數(shù)據(jù)

POST /cars/transactions/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "吉利", "sold" : "2020-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "長(zhǎng)城", "sold" : "2020-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "比亞迪", "sold" : "2020-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "比亞迪", "sold" : "2020-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "長(zhǎng)城", "sold" : "2020-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "長(zhǎng)安", "sold" : "2020-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "吉利", "sold" : "2020-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "長(zhǎng)安", "sold" : "2020-02-12" }

2 聚合為桶

首先,我們按照 汽車(chē)的顏色color來(lái)劃分

GET /cars/_search
{
    "size" : 0,
    "aggs" : { 
        "popular_colors" : { 
            "terms" : { 
              "field" : "color"
            }
        }
    }
}
  • size: 查詢條數(shù)古瓤,這里設(shè)置為0止剖,因?yàn)槲覀儾魂P(guān)心搜索到的數(shù)據(jù),只關(guān)心聚合結(jié)果,提高效率
  • aggs:聲明這是一個(gè)聚合查詢滴须,是aggregations的縮寫(xiě)
    • popular_colors:給這次聚合起一個(gè)名字舌狗,任意。
      • terms:劃分桶的方式扔水,這里是根據(jù)詞條劃分
        • field:劃分桶的字段

結(jié)果:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 8,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "popular_colors": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "red",
          "doc_count": 4
        },
        {
          "key": "blue",
          "doc_count": 2
        },
        {
          "key": "green",
          "doc_count": 2
        }
      ]
    }
  }
}
  • hits:查詢結(jié)果為空痛侍,因?yàn)槲覀冊(cè)O(shè)置了size為0
  • aggregations:聚合的結(jié)果
  • popular_colors:我們定義的聚合名稱
  • buckets:查找到的桶,每個(gè)不同的color字段值都會(huì)形成一個(gè)桶
    • key:這個(gè)桶對(duì)應(yīng)的color字段的值
    • doc_count:這個(gè)桶中的文檔數(shù)量

通過(guò)聚合的結(jié)果我們發(fā)現(xiàn)魔市,目前紅色的小車(chē)比較暢銷(xiāo)主届!

3 桶內(nèi)度量

求價(jià)格平均值的度量

GET /cars/_search
{
    "size" : 0,
    "aggs" : { 
        "popular_colors" : { 
            "terms" : { 
              "field" : "color"
            },
            "aggs":{
                "avg_price": { 
                   "avg": {
                      "field": "price" 
                   }
                }
            }
        }
    }
}
  • aggs:我們?cè)谏弦粋€(gè)aggs(popular_colors)中添加新的aggs〈拢可見(jiàn)度量也是一個(gè)聚合,度量是在桶內(nèi)的聚合
  • avg_price:聚合的名稱
  • avg:度量的類(lèi)型君丁,這里是求平均值
  • field:度量運(yùn)算的字段

4 桶內(nèi)嵌套桶

比如:我們想統(tǒng)計(jì)每種顏色的汽車(chē)中,分別屬于哪個(gè)制造商将宪,按照make字段再進(jìn)行分桶

GET /cars/_search
{
    "size" : 0,
    "aggs" : { 
        "popular_colors" : { 
            "terms" : { 
              "field" : "color"
            },
            "aggs":{
                "avg_price": { 
                   "avg": {
                      "field": "price" 
                   }
                },
                "maker":{
                    "terms":{
                        "field":"make"
                    }
                }
            }
        }
    }
}
  • 原來(lái)的color桶和avg計(jì)算我們不變
  • maker:在嵌套的aggs下新添一個(gè)桶绘闷,叫做maker
  • terms:桶的劃分類(lèi)型依然是詞條
  • filed:這里根據(jù)make字段進(jìn)行劃分

5劃分桶的其它方式

  • Date Histogram Aggregation:根據(jù)日期階梯分組,例如給定階梯為周较坛,會(huì)自動(dòng)每周分為一組
  • Histogram Aggregation:根據(jù)數(shù)值階梯分組印蔗,與日期類(lèi)似
  • Terms Aggregation:根據(jù)詞條內(nèi)容分組,詞條內(nèi)容完全匹配的為一組
  • Range Aggregation:數(shù)值和日期的范圍分組丑勤,指定開(kāi)始和結(jié)束华嘹,然后按段分組
    階梯分桶Histogram
    histogram是把數(shù)值類(lèi)型的字段,按照一定的階梯大小進(jìn)行分組法竞。你需要指定一個(gè)階梯值(interval)來(lái)劃分階梯大小耙厚。
    如:如果你設(shè)定interval的值為200,那么階梯就會(huì)是這樣的:
    0岔霸,200薛躬,400,600秉剑,...
GET /cars/_search
{
  "size":0,
  "aggs":{
    "price":{
      "histogram": {
        "field": "price",
        "interval": 5000
      }
    }
  }
}

計(jì)算公式

key = Math.floor((value - offset) / interval) * interval + offset
  • value:就是當(dāng)前數(shù)據(jù)的值
  • offset:起始偏移量泛豪,默認(rèn)為0
  • interval:階梯間隔
    min_doc_count約束最少文檔數(shù)量為1,這樣文檔數(shù)量為0的桶會(huì)被過(guò)濾
GET /cars/_search
{
  "size":0,
  "aggs":{
    "price":{
      "histogram": {
        "field": "price",
        "interval": 5000,
        "min_doc_count": 1
      }
    }
  }
}

聚合查詢并且根據(jù)字段值去重

"collapse": {
    "field": "type.keyword"
  },

示例

GET xiaomi/_search
{
  "size":10,
  "_source": ["type"],
  "collapse": {
    "field": "type.keyword"
  },
  "query": {
  "term": {
    "eventType.keyword": {
       "value": "announcement"
      }
    }
  },
  "aggs" : {
    "your_aggs" : {
    "terms" : { "field" : "type.keyword" }
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侦鹏,一起剝皮案震驚了整個(gè)濱河市诡曙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌略水,老刑警劉巖价卤,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異渊涝,居然都是意外死亡慎璧,警方通過(guò)查閱死者的電腦和手機(jī)床嫌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胸私,“玉大人厌处,你說(shuō)我怎么就攤上這事∷晏郏” “怎么了阔涉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捷绒。 經(jīng)常有香客問(wèn)我瑰排,道長(zhǎng),這世上最難降的妖魔是什么暖侨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任椭住,我火速辦了婚禮,結(jié)果婚禮上字逗,老公的妹妹穿的比我還像新娘京郑。我一直安慰自己,他們只是感情好扳肛,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布傻挂。 她就那樣靜靜地躺著,像睡著了一般挖息。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兽肤,一...
    開(kāi)封第一講書(shū)人閱讀 52,807評(píng)論 1 314
  • 那天套腹,我揣著相機(jī)與錄音,去河邊找鬼资铡。 笑死电禀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笤休。 我是一名探鬼主播尖飞,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼店雅!你這毒婦竟也來(lái)了政基?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闹啦,失蹤者是張志新(化名)和其女友劉穎沮明,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體窍奋,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荐健,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年酱畅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片江场。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纺酸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出址否,到底是詐尸還是另有隱情吁峻,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布在张,位于F島的核電站用含,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帮匾。R本人自食惡果不足惜啄骇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘟斜。 院中可真熱鬧缸夹,春花似錦、人聲如沸螺句。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛇尚。三九已至芽唇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間取劫,已是汗流浹背匆笤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谱邪,地道東北人炮捧。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像惦银,于是被迫代替她去往敵國(guó)和親咆课。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Elasticsearch 聚合查詢 bucket: 概念:一個(gè)數(shù)據(jù)分組扯俱。按照某個(gè)字段就行bucket劃分书蚪,那個(gè)字...
    咸魚(yú)鮮魚(yú)閱讀 264評(píng)論 0 0
  • 在數(shù)據(jù)庫(kù)領(lǐng)域,借助SQL我們可以獲取表中的最大值(Max)蘸吓、最小值(Min)善炫,還可以對(duì)數(shù)據(jù)進(jìn)行分組(Group)。...
    冰河winner閱讀 1,660評(píng)論 0 5
  • 在Mysql中库继,我們可以獲取一組數(shù)據(jù)的 最大值(Max)箩艺、最小值(Min)窜醉。同樣我們能夠?qū)@組數(shù)據(jù)進(jìn)行 分組(Gr...
    Splunker閱讀 2,222評(píng)論 0 2
  • 1.Elasticsearch介紹和安裝 用戶訪問(wèn)我們的首頁(yè),一般都會(huì)直接搜索來(lái)尋找自己想要購(gòu)買(mǎi)的商品艺谆。 而商品的...
    強(qiáng)某某閱讀 570評(píng)論 1 1
  • 基本概念 桶 簡(jiǎn)單來(lái)說(shuō)就是滿足特定條件的文檔的集合榨惰。當(dāng)聚合開(kāi)始被執(zhí)行,每個(gè)文檔里面的值通過(guò)計(jì)算來(lái)決定符合哪個(gè)桶的條...
    javap閱讀 975評(píng)論 0 4