聚合在Elasticsearch中的使用及示例驗(yàn)證

聚合在Elasticsearch中的使用

系統(tǒng)中使用的ES環(huán)境不一定每篇文章都有慢叨,但是可以在合集中找到,關(guān)注《醉魚(yú)Java》一起進(jìn)步

環(huán)境

  • elasticsearch 8.1

搭建

version: '3.8'
services:
  cerebro:
    image: lmenezes/cerebro:0.8.3
    container_name: cerebro
    ports:
     - "9000:9000"
    command:
     - -Dhosts.0.host=http://eshot:9200
    networks:
     - elastic
  kibana:
    image: docker.elastic.co/kibana/kibana:8.1.3
    container_name: kibana
    environment:
      - I18N_LOCALE=zh-CN
      - XPACK_GRAPH_ENABLED=true
      - TIMELION_ENABLED=true
      - XPACK_MONITORING_COLLECTION_ENABLED="true"
      - ELASTICSEARCH_HOSTS=http://eshot:9200
      - server.publicBaseUrl=http://192.168.160.234:5601
    ports:
      - "5601:5601"
    networks:
      - elastic
  eshot:
    image: elasticsearch:8.1.3
    container_name: eshot
    environment:
      - node.name=eshot
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=eshot,eswarm,escold
      - cluster.initial_master_nodes=eshot,eswarm,escold
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
      - node.attr.node_type=hot
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - D:\zuiyuftp\docker\es8.1\eshot\data:/usr/share/elasticsearch/data
      - D:\zuiyuftp\docker\es8.1\eshot\logs:/usr/share/elasticsearch/logs
      - D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
    ports:
      - 9200:9200
    networks:
      - elastic
  eswarm:
    image: elasticsearch:8.1.3
    container_name: eswarm
    environment:
      - node.name=eswarm
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=eshot,eswarm,escold
      - cluster.initial_master_nodes=eshot,eswarm,escold
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
      - node.attr.node_type=warm
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - D:\zuiyuftp\docker\es8.1\eswarm\data:/usr/share/elasticsearch/data
      - D:\zuiyuftp\docker\es8.1\eswarm\logs:/usr/share/elasticsearch/logs
      - D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
    networks:
      - elastic
  escold:
    image: elasticsearch:8.1.3
    container_name: escold
    environment:
      - node.name=escold
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=eshot,eswarm,escold
      - cluster.initial_master_nodes=eshot,eswarm,escold
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
      - node.attr.node_type=cold
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - D:\zuiyuftp\docker\es8.1\escold\data:/usr/share/elasticsearch/data
      - D:\zuiyuftp\docker\es8.1\escold\logs:/usr/share/elasticsearch/logs
      - D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
    networks:
      - elastic

# volumes:
#   eshotdata:
#     driver: local
#   eswarmdata:
#     driver: local
#   escolddata:
#     driver: local

networks:
  elastic:
    driver: bridge

什么是聚合?

在Elasticsearch中,聚合是一種功能強(qiáng)大的數(shù)據(jù)處理技術(shù),它允許我們對(duì)索引中的數(shù)據(jù)進(jìn)行多種計(jì)算和分析操作。聚合可以理解為對(duì)數(shù)據(jù)集進(jìn)行分組躺率,并在每個(gè)分組上執(zhí)行各種指標(biāo)計(jì)算,類(lèi)似于SQL中的GROUP BY和聚合函數(shù)万矾。

示例數(shù)據(jù)

為了驗(yàn)證聚合功能悼吱,我們將使用一個(gè)示例數(shù)據(jù)集,假設(shè)我們有一個(gè)存儲(chǔ)了商品信息的索引良狈,包含以下字段:

  1. product_name:商品名稱(chēng)
  2. category:商品分類(lèi)
  3. price:商品價(jià)格
  4. quantity:商品數(shù)量
  5. manufacturer:制造商
  6. timestamp:記錄時(shí)間戳

下面我們導(dǎo)入測(cè)試數(shù)據(jù)

創(chuàng)建索引

PUT /zfc-doc-000001
{
  "settings": {
    "index":{
      "number_of_shards":3,
      "number_of_replicas":2
    }
  },
  "mappings": {
    "properties": {
      "product_name":{
        "type":"keyword"
      },
      "category":{
        "type":"keyword"
      },
      "price":{
        "type": "integer"
      },
      "quantity":{
        "type": "integer"
      },
      "manufacturer":{
        "type": "keyword"
      },
      "timestamp":{
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" 
      }
    }
  }
}

添加數(shù)據(jù)

PUT _bulk
{"index":{"_index":"zfc-doc-000002","_id":"1"}}
{"product_name": "iPhone 12","category": "Electronics","price": 999,"quantity": 50,"manufacturer": "Apple","timestamp": "2023-07-24 10:00:00"}
{"index":{"_index":"zfc-doc-000002","_id":"2"}}
{"product_name": "Samsung Galaxy S21","category": "Electronics","price": 799,"quantity": 30,"manufacturer": "Samsung","timestamp": "2023-07-24 11:30:00"}
{"index":{"_index":"zfc-doc-000002","_id":"3"}}
{"product_name": "Sony Bravia 65-inch TV","category": "Electronics","price": 1499,"quantity": 20,"manufacturer": "Sony","timestamp": "2023-07-24 13:15:00"}
{"index":{"_index":"zfc-doc-000002","_id":"4"}}
{"product_name": "HP Spectre x360","category": "Electronics","price": 1299,"quantity": 25,"manufacturer": "HP","timestamp": "2023-07-24 15:45:00"}
{"index":{"_index":"zfc-doc-000002","_id":"5"}}
{"product_name": "Dell XPS 15", "category": "Electronics","price": 1399,"quantity": 15,"manufacturer": "Dell","timestamp": "2023-07-24 17:20:00"}
{"index":{"_index":"zfc-doc-000002","_id":"6"}}
{"product_name": "Nike Air Zoom Pegasus 38", "category": "Sports","price": 119,"quantity": 100,"manufacturer": "Nike","timestamp": "2023-07-24 09:30:00"}
{"index":{"_index":"zfc-doc-000002","_id":"7"}}
{"product_name": "Adidas Ultraboost 21","category": "Sports","price": 129,"quantity": 80,"manufacturer": "Adidas","timestamp": "2023-07-24 10:45:00"}
{"index":{"_index":"zfc-doc-000002","_id":"8"}}
{"product_name": "Canon EOS Rebel T7i","category": "Electronics","price": 699,"quantity": 10,"manufacturer": "Canon","timestamp": "2023-07-24 14:05:00"}
{"index":{"_index":"zfc-doc-000002","_id":"9"}}
{"product_name": "LG 55-inch 4K TV", "category": "Electronics","price": 899,"quantity": 30,"manufacturer": "LG","timestamp": "2023-07-24 16:30:00"}
{"index":{"_index":"zfc-doc-000002","_id":"10"}}
{"product_name": "Lenovo ThinkPad X1 Carbon", "category": "Electronics","price": 1599,"quantity": 18,"manufacturer": "Lenovo","timestamp": "2023-07-24 18:10:00"}

聚合示例

1. 詞條聚合(Terms Aggregation)

詞條聚合是一種用于對(duì)文本字段進(jìn)行分組的聚合方式后添,它會(huì)將相同值的文檔分到同一個(gè)桶(Bucket)中,并計(jì)算每個(gè)桶中文檔的數(shù)量薪丁。

示例查詢:

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "category_count": {
      "terms": {
        "field": "category",
        "size": 10
      }
    }
  }
}

解釋?zhuān)?/p>

  • "size": 0:表示只返回聚合結(jié)果遇西,不返回實(shí)際文檔數(shù)據(jù)馅精。

  • "aggs":定義聚合操作。

  • "category_count":自定義的聚合名稱(chēng)粱檀,用于標(biāo)識(shí)結(jié)果洲敢。

  • "terms":指定使用詞條聚合。

  • "field": "category":指定要進(jìn)行聚合的字段茄蚯。

2. 嵌套聚合(Nested Aggregation)

嵌套聚合允許在一個(gè)桶內(nèi)進(jìn)行更深層次的聚合操作压彭。例如,我們可以先按分類(lèi)分組渗常,然后在每個(gè)分類(lèi)內(nèi)再按制造商進(jìn)行分組壮不,并計(jì)算每個(gè)分類(lèi)下的平均價(jià)格。

示例查詢:

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "category_group": {
      "terms": {
        "field": "category",
        "size": 10
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

解釋?zhuān)?/p>

  • "aggs":定義聚合操作皱碘。
  • "category_group":自定義的聚合名稱(chēng)忆畅,用于標(biāo)識(shí)結(jié)果。
  • "terms":指定使用詞條聚合尸执。
  • "field": "category":指定要進(jìn)行聚合的字段。
  • "avg_price":自定義的聚合名稱(chēng)缓醋,用于標(biāo)識(shí)結(jié)果如失。
  • "avg":指定使用平均值聚合。
  • "field": "price":指定要進(jìn)行聚合的數(shù)值字段送粱。

3.直方圖聚合示例(Histogram)

假設(shè)我們希望根據(jù)商品價(jià)格(price字段)創(chuàng)建一個(gè)價(jià)格區(qū)間的直方圖褪贵,將商品按照價(jià)格范圍進(jìn)行分組,并統(tǒng)計(jì)每個(gè)價(jià)格區(qū)間內(nèi)的商品數(shù)量抗俄。

示例查詢:

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "price_histogram": {
      "histogram": {
        "field": "price",
        "interval": 200
      }
    }
  }
}

解釋?zhuān)?/p>

  • "aggs":定義聚合操作脆丁。
  • "price_histogram":自定義的聚合名稱(chēng),用于標(biāo)識(shí)結(jié)果动雹。
  • "histogram":指定使用直方圖聚合槽卫。
  • "field": "price":指定要進(jìn)行聚合的數(shù)值字段,即商品價(jià)格胰蝠。
  • "interval": 200:指定直方圖的間隔大小歼培,這里設(shè)置為200表示將價(jià)格范圍劃分為200的區(qū)間,例如:0-200茸塞、200-400躲庄、400-600等。

4.范圍聚合示例(Range)

范圍聚合允許我們根據(jù)指定的范圍條件將文檔分組钾虐,例如:按價(jià)格范圍進(jìn)行分組并統(tǒng)計(jì)每個(gè)價(jià)格范圍內(nèi)的商品數(shù)量。

示例查詢:

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "from": 0, "to": 200 },
          { "from": 200, "to": 500 },
          { "from": 500, "to": 1000 },
          { "from": 1000 }
        ]
      }
    }
  }
}

解釋?zhuān)?/p>

  • "aggs":定義聚合操作。
  • "price_ranges":自定義的聚合名稱(chēng)旷太,用于標(biāo)識(shí)結(jié)果。
  • "range":指定使用范圍聚合直砂。
  • "field": "price":指定要進(jìn)行聚合的數(shù)值字段,即商品價(jià)格丐枉。
  • "ranges":指定價(jià)格范圍的條件數(shù)組哆键。
    • { "from": 0, "to": 200 }:表示價(jià)格從0到200之間的商品。
    • { "from": 200, "to": 500 }:表示價(jià)格從200到500之間的商品瘦锹。
    • { "from": 500, "to": 1000 }:表示價(jià)格從500到1000之間的商品籍嘹。
    • { "from": 1000 }:表示價(jià)格大于等于1000的商品。

5. 統(tǒng)計(jì)聚合(Stats Aggregation)

統(tǒng)計(jì)聚合可以對(duì)數(shù)值字段進(jìn)行計(jì)算弯院,包括最小值辱士、最大值、平均值听绳、總和和文檔數(shù)量颂碘。

示例查詢:

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "price_stats": {
      "stats": {
        "field": "price"
      }
    }
  }
}

解釋?zhuān)?/p>

  • "aggs":定義聚合操作。
  • "price_stats":自定義的聚合名稱(chēng)椅挣,用于標(biāo)識(shí)結(jié)果头岔。
  • "stats":指定使用統(tǒng)計(jì)聚合。
  • "field": "price":指定要進(jìn)行聚合的數(shù)值字段鼠证。

我們上面在統(tǒng)計(jì)聚合中可以獲取很多值峡竣,那么我們也可以細(xì)化單獨(dú)獲取某一個(gè)的聚合結(jié)果。

6. 平均值聚合(Avg Aggregation)


GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

7. 總和聚合(Sum Aggregation)

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "total_price": {
      "sum": {
        "field": "price"
      }
    }
  }
}

8. 最小值聚合(Min Aggregation)

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "min_price": {
      "min": {
        "field": "price"
      }
    }
  }
}

9. 最大值聚合(Max Aggregation)

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "max_price": {
      "max": {
        "field": "price"
      }
    }
  }
}

10. 擴(kuò)展統(tǒng)計(jì)聚合(Extended Stats Aggregation)

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "price_stats_extended": {
      "extended_stats": {
        "field": "price"
      }
    }
  }
}

11. 百分位數(shù)聚合(Percentiles Aggregation)

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "price_percentiles": {
      "percentiles": {
        "field": "price",
        "percents": [25, 50, 75, 90]
      }
    }
  }
}

12. 日期直方圖聚合(Date Histogram Aggregation)

假設(shè)有一個(gè)名為timestamp的日期字段量九,我們可以進(jìn)行日期直方圖聚合适掰,按照日期進(jìn)行分組并統(tǒng)計(jì)每個(gè)時(shí)間段內(nèi)的文檔數(shù)量。

GET zfc-doc-000002/_search
{
  "size": 0,
  "aggs": {
    "date_histogram_agg": {
      "date_histogram": {
        "field": "timestamp",
        "fixed_interval": "1h"
      }
    }
  }
}

本文由mdnice多平臺(tái)發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荠列,一起剝皮案震驚了整個(gè)濱河市类浪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肌似,老刑警劉巖费就,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異川队,居然都是意外死亡受楼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)呼寸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)艳汽,“玉大人,你說(shuō)我怎么就攤上這事对雪『雍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)馋艺。 經(jīng)常有香客問(wèn)我栅干,道長(zhǎng),這世上最難降的妖魔是什么捐祠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任碱鳞,我火速辦了婚禮,結(jié)果婚禮上踱蛀,老公的妹妹穿的比我還像新娘窿给。我一直安慰自己,他們只是感情好率拒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布崩泡。 她就那樣靜靜地躺著,像睡著了一般猬膨。 火紅的嫁衣襯著肌膚如雪角撞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天勃痴,我揣著相機(jī)與錄音谒所,去河邊找鬼。 笑死沛申,一個(gè)胖子當(dāng)著我的面吹牛百炬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播污它,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼庶弃!你這毒婦竟也來(lái)了衫贬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤歇攻,失蹤者是張志新(化名)和其女友劉穎固惯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缴守,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葬毫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屡穗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贴捡。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖村砂,靈堂內(nèi)的尸體忽然破棺而出烂斋,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布汛骂,位于F島的核電站罕模,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帘瞭。R本人自食惡果不足惜淑掌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝶念。 院中可真熱鬧抛腕,春花似錦、人聲如沸祸轮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)适袜。三九已至柄错,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苦酱,已是汗流浹背售貌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疫萤,地道東北人颂跨。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像扯饶,于是被迫代替她去往敵國(guó)和親恒削。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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