Elasticsearch——聚合搜索案例

創(chuàng)建索引及映射

PUT /tvs
PUT /tvs/_mapping
{
  "properties":{
    "price":{
      "type":"long"
    },
    "color":{
      "type":"keyword"
    },
    "brand":{
      "type":"keyword"
    },
    "sold_date":{
      "type":"date"
    }
  }
}

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

POST /tvs/_bulk
{"index":{}}
{"price":1000,"color":"紅色","brand":"長虹","sold_date":"2019-10-28"}
{"index":{}}
{"price":2000,"color":"紅色","brand":"長虹","sold_date":"2019-11-05"}
{"index":{}}
{"price":3000,"color":"綠色","brand":"小米","sold_date":"2019-05-18"}
{"index":{}}
{"price":1500,"color":"藍色","brand":"TCL","sold_date":"2019-07-02"}
{"index":{}}
{"price":1200,"color":"綠色","brand":"TCL","sold_date":"2019-08-19"}
{"index":{}}
{"price":2000,"color":"紅色","brand":"長虹","sold_date":"2019-11-05"}
{"index":{}}
{"price":5000,"color":"紅色","brand":"三星","sold_date":"2020-01-01"}
{"index":{}}
{"price":2500,"color":"藍色","brand":"小米","sold_date":"2020-02-12"}
{"index":{}}
{"price":6000,"color":"黑色","brand":"海信","sold_date":"2020-02-18"}
{"index":{}}
{"price":4000,"color":"黑色","brand":"海爾","sold_date":"2020-02-28"}
{"index":{}}
{"price":5000,"color":"白色","brand":"海爾","sold_date":"2020-03-28"}
{"index":{}}
{"price":3500,"color":"黑色","brand":"創(chuàng)維","sold_date":"2020-03-18"}

1、統(tǒng)計哪種種電視的銷量最高

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "popular_color": {
      "terms": {
        "field": "color"
      }
    }
  }
}

返回結(jié)果:

{
  "took" : 1031,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 12,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "popular_color" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "紅色",
          "doc_count" : 4
        },
        {
          "key" : "黑色",
          "doc_count" : 3
        },
        {
          "key" : "綠色",
          "doc_count" : 2
        },
        {
          "key" : "藍色",
          "doc_count" : 2
        },
        {
          "key" : "白色",
          "doc_count" : 1
        }
      ]
    }
  }
}

返回結(jié)果解析:

  • hits.hits:指定了size為0捐康,所以hits.hits為空
  • aggregations:聚合結(jié)果
  • popular_color:指定某個聚合的名稱
  • buckets:根據(jù)指定的field劃分出bucket
  • key:每個bucket對應(yīng)的值
  • doc_count:bucket分組內(nèi),有多少數(shù)據(jù)數(shù)量

每種顏色對應(yīng)的bucket中的數(shù)據(jù)默認的排序規(guī)則:按照doc_count降序排序

2懂算、統(tǒng)計每種顏色電視的平均價格

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "popular_color": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

3策严、每個顏色下的平均價格以及每個顏色下每個品牌的平均價格

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "color_avg_price": {
          "avg": {
            "field": "price"
          }
        },
        "group_by_brand":{
          "terms": {
            "field": "brand"
          },
          "aggs": {
            "brand_avg_brand": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

4、更多的metric

count:bucket,terms,自動就會有一個doc_count猪落,就相當(dāng)于count昨凡。
avg:avg aggs,求平均值晌该。
max:求一個bucket內(nèi),指定field值最大的那個數(shù)據(jù)。
min:求一個bucket內(nèi)憋肖,指定field值最小的那個數(shù)據(jù)因痛。
sum:求一個bucket內(nèi),指定field值的總和岸更。

求出每個顏色的銷售數(shù)量鸵膏、平均價格、最大價格怎炊、最小價格谭企、價格總和

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "color_avg": {
          "avg": {
            "field": "price"
          }
        },
        "max_price":{
          "max": {
            "field": "price"
          }
        },
        "min_price":{
          "min": {
            "field": "price"
          }
        },
        "sum_price":{
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

5、劃分范圍 histogram评肆,求出價格每2000為一個區(qū)間债查,每個區(qū)間的銷售總額

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "price_histogram": {
      "histogram": {
        "field": "price",
        "interval": 2000
      },
      "aggs": {
        "income": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

histogram類似于terms,也是進行bucket分組操作瓜挽,接收一個field攀操,按照這個field的值的各個范圍區(qū)間,進行bucket分組操作秸抚。

"histogram": {
    "field": "price",
    "interval": 2000
}

interval:2000速和,劃分范圍,0-2000剥汤、2000-4000颠放、4000-6000、6000-8000吭敢,buckets
bucket有了之后碰凶,對每個bucket進行avg、count鹿驼、sum欲低、max、min等各種metric操作畜晰,聚合分析砾莱。

6、按照日期聚合分組凄鼻,求出每個月銷售個數(shù)

date_histogram:按照我們指定的某個date類型的日期field腊瑟,以及日期interval,按照一定的日期間隔块蚌,去劃分bucket闰非。
min_doc_count:即使某個日期interval,如2019-01-01~2019-01-31中一條數(shù)據(jù)也沒有峭范,那么這個區(qū)間也是要返回的财松,不然默認是會過濾掉這個區(qū)間。
extended_bounds纱控、min辆毡、max:劃分bucket的時候政敢,會限定在這個起始日期和結(jié)束日期內(nèi)。

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "date_sales": {
      "date_histogram": {
        "field": "sold_date",
        "calendar_interval": "month",
        "format": "yyyy-MM-dd",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "2019-01-01",
          "max": "2019-12-31"
        }
      }
    }
  }
}

7胚迫、統(tǒng)計每個季度每個品牌的銷售額喷户,及每個季度銷售總額

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "date_sales": {
      "date_histogram": {
        "field": "sold_date",
        "calendar_interval": "quarter",
        "format": "yyyy-MM-dd",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "2019-01-01",
          "max": "2020-12-31"
        }
      },
      "aggs": {
        "group_by_brand": {
          "terms": {
            "field": "brand"
          },
          "aggs": {
            "sum_price": {
              "sum": {
                "field": "price"
              }
            }
          }
        },
        "total_sum_price":{
          "sum":{
            "field": "price"
          }
        }
      }
    }
  }
}

8、搜索與聚合結(jié)合访锻,查詢某個品牌按顏色銷量

aggregation褪尝,scope,任何的聚合期犬,都必須在搜索出來的結(jié)果數(shù)據(jù)之中河哑,搜索結(jié)果就是聚合分析操作的scope

GET /tvs/_search
{
  "size": 0,
  "query": {
    "term": {
      "brand": {
        "value": "小米"
      }
    }
  },
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      }
    }
  }
}

9、global bucket龟虎、單個品牌與所有品牌均價對比

aggregation璃谨,scope,一個聚合操作鲤妥,必須在query的搜索結(jié)果范圍內(nèi)執(zhí)行佳吞。
出來兩個結(jié)果,一個結(jié)果是基于query搜索結(jié)果來聚合的棉安,一個結(jié)果是對所有數(shù)據(jù)執(zhí)行聚合的底扳。

GET /tvs/_search
{
  "size": 0,
  "query": {
    "term": {
      "brand": {
        "value": "小米"
      }
    }
  },
  "aggs": {
    "single_brand_avg_price": {
      "avg": {
        "field": "price"
      }
    },
    "all":{
      "global": {},
      "aggs":{
        "all_brand_avg_price":{
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

10、過濾+聚合:統(tǒng)計價格大于1200的電視平均價格

搜索+聚合
過濾+聚合

GET /tvs/_search
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "price": {
            "gte": 1200
          }
        }
      },
      "boost": 1.2
    }
  },
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

11贡耽、bucket filter:統(tǒng)計品牌最近一個月的平均價格

GET /tvs/_search
{
  "size": 0,
  "query": {
    "term": {
      "brand": {
        "value": "小米"
      }
    }
  },
  "aggs": {
    "recent_150d": {
      "filter": {
        "range": {
          "sold_date": {
            "gte": "now-150d"
          }
        }
      },
      "aggs": {
        "recent_150d_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "recent_60d": {
      "filter": {
        "range": {
          "sold_date": {
            "gte": "now-60d"
          }
        }
      },
      "aggs": {
        "recent_60d_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "recent_30d": {
      "filter": {
        "range": {
          "sold_date": {
            "gte": "now-30d"
          }
        }
      },
      "aggs": {
        "recent_30d_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

aggs.filter衷模、針對的是聚合去做的。
如果放query里面的filter是全局的蒲赂,會對所有的數(shù)據(jù)都有影響阱冶。
但是如果要統(tǒng)計海信最近30天,60天滥嘴,最近3個月木蹬,最近6個月的平均值。
bucket filter:對不同的bucket下的aggs氏涩,進行filter届囚。

12有梆、排序是尖、按每種顏色的平均銷售額降序排序

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color",
        "order": {
          "avg_price": "desc"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

13、排序泥耀、按每種顏色的每種品牌平均銷售額降序排序

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "group_by_brand": {
          "terms": {
            "field": "brand",
            "order": {
              "avg_price": "desc"
            }
          }, 
          "aggs": {
            "avg_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饺汹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子痰催,更是在濱河造成了極大的恐慌兜辞,老刑警劉巖迎瞧,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逸吵,居然都是意外死亡凶硅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門扫皱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來足绅,“玉大人,你說我怎么就攤上這事韩脑∏饴瑁” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵段多,是天一觀的道長首量。 經(jīng)常有香客問我,道長进苍,這世上最難降的妖魔是什么加缘? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮觉啊,結(jié)果婚禮上生百,老公的妹妹穿的比我還像新娘。我一直安慰自己柄延,他們只是感情好蚀浆,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搜吧,像睡著了一般市俊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滤奈,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天摆昧,我揣著相機與錄音,去河邊找鬼蜒程。 笑死绅你,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昭躺。 我是一名探鬼主播忌锯,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼领炫!你這毒婦竟也來了偶垮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎似舵,沒想到半個月后脚猾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡砚哗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年龙助,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛛芥。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡泌参,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出常空,到底是詐尸還是另有隱情沽一,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布漓糙,位于F島的核電站铣缠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏昆禽。R本人自食惡果不足惜蝗蛙,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醉鳖。 院中可真熱鬧捡硅,春花似錦、人聲如沸盗棵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纹因。三九已至喷屋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞭恰,已是汗流浹背屯曹。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惊畏,地道東北人恶耽。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像颜启,于是被迫代替她去往敵國和親偷俭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

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