【Elasticsearch 】 聚合分析:桶聚合

🧑 博主簡介:CSDN博客專家歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/?__c=1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,精通Java編程高并發設計Springboot和微服務,熟悉LinuxESXI虛擬化以及云原生Docker和K8s,熱衷于探索科技的邊界,并將理論知識轉化為實際應用。保持對新技術的好奇心,樂于分享所學,希望通過我的實踐經歷和見解,啟發他人的創新思維。在這里,我希望能與志同道合的朋友交流探討,共同進步,一起在技術的世界里不斷學習成長。
技術合作請加本人wx(注明來自csdn):foreast_sea

在這里插入圖片描述


在這里插入圖片描述

【Elasticsearch 】 聚合分析:桶聚合

引言

在當今數據爆炸的時代,如何從海量數據中提取有價值的信息成為了眾多開發者和數據分析師面臨的重要挑戰。Elasticsearch 作為一款強大的分布式搜索引擎,不僅提供了高效的數據存儲和檢索功能,還具備強大的聚合分析能力,其中桶聚合是其聚合分析功能的核心組成部分。

桶聚合的概念源于數據分析中常見的分組操作,它能夠根據特定的條件將數據劃分成不同的“桶”,每個桶代表一組具有相同特征的數據集合。通過這種方式,我們可以對數據進行分類、匯總和統計,從而挖掘出數據背后隱藏的模式和規律。

想象一下,你正在處理一個電商平臺的銷售數據,其中包含了大量的訂單信息,如訂單時間、商品類別、購買金額等。通過桶聚合,你可以輕松地按照商品類別對訂單進行分組,統計每個類別的銷售總額,了解哪些商品最受歡迎;或者按照訂單時間進行分組,分析不同時間段的銷售趨勢,為營銷策略提供有力支持。

在實際應用中,桶聚合的類型豐富多樣,能夠滿足各種復雜的數據分析需求。常見的桶聚合類型包括 terms 桶聚合、date_histogram 桶聚合、range 桶聚合等。這些不同類型的桶聚合,各自適用于不同的數據特征和分析場景,為我們提供了靈活而強大的數據處理手段。

掌握桶聚合的使用方法,不僅可以幫助我們更好地理解數據,還能為業務決策提供準確的數據支持。無論是在數據分析、數據挖掘還是機器學習等領域,Elasticsearch 的桶聚合都發揮著重要的作用。

在本文,讓我們一起深入探索 Elasticsearch 桶聚合的世界,揭開它神秘的面紗,領略其在數據處理中的強大魅力。

一、Elasticsearch 簡介

Elasticsearch 是一個基于 Lucene 的分布式、RESTful 風格的搜索和數據分析引擎。它旨在快速存儲、搜索和分析大量數據,廣泛應用于各種領域,如日志分析、電商搜索、企業搜索等。

(一)核心概念

  1. 索引(Index)
    索引是 Elasticsearch 中存儲數據的邏輯容器,類似于關系型數據庫中的數據庫概念。一個索引可以包含多個文檔,每個文檔都有一個唯一的標識符。例如,在一個電商應用中,可以創建一個名為 products 的索引來存儲所有商品的信息。

  2. 文檔(Document)
    文檔是 Elasticsearch 中存儲的基本數據單元,它是一個 JSON 格式的數據結構。每個文檔都屬于一個索引,并且可以包含多個字段。以商品文檔為例,可能包含 product_idproduct_namepricecategory 等字段。

  3. 類型(Type)
    在早期版本中,類型用于在一個索引中區分不同類型的文檔。但從 Elasticsearch 7.x 版本開始,逐漸弱化了類型的概念,一個索引通常只包含一種類型的文檔。

  4. 分片(Shard)
    為了處理大規模數據,Elasticsearch 將索引分割成多個分片,每個分片是一個獨立的 Lucene 索引。分片可以分布在不同的節點上,從而實現分布式存儲和并行處理,提高系統的可擴展性和性能。

  5. 副本(Replica)
    副本是分片的復制,用于提高數據的可用性和讀取性能。每個分片可以有多個副本,當某個節點出現故障時,副本可以接管其工作,確保數據的正常訪問。

(二)工作原理

Elasticsearch 的工作原理基于分布式架構和 Lucene 的倒排索引技術。當一個文檔被索引時,Elasticsearch 會分析文檔的內容,將每個字段的值拆分成一個個的詞項(Term),并構建倒排索引。倒排索引是一種從詞項到文檔的映射結構,通過它可以快速定位包含特定詞項的文檔。

在搜索時,用戶發送查詢請求到 Elasticsearch 集群,集群中的節點會根據查詢條件在倒排索引中查找匹配的文檔,并將結果返回給用戶。對于聚合分析,Elasticsearch 會在索引數據的基礎上,按照指定的聚合規則對數據進行分組和計算。

(三)安裝與配置

  1. 下載安裝
    可以從 Elasticsearch 官方網站下載適合你操作系統的安裝包。解壓安裝包后,進入安裝目錄,在 Linux 系統下,可以通過執行 bin/elasticsearch 腳本啟動 Elasticsearch 服務;在 Windows 系統下,可以雙擊 bin\elasticsearch.bat 文件啟動。

  2. 配置文件
    Elasticsearch 的配置文件位于 config 目錄下,主要配置文件是 elasticsearch.yml。在這里可以配置集群名稱、節點名稱、網絡綁定地址、數據存儲路徑等參數。例如,修改 network.host 參數可以指定 Elasticsearch 監聽的網絡地址,以便外部可以訪問。

二、Maven 依賴

在使用 Java API 操作 Elasticsearch 進行桶聚合時,需要引入相應的 Maven 依賴。以下是詳細的依賴介紹:

(一)Elasticsearch 客戶端依賴

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.17.6</version>
</dependency>

這個依賴提供了高級 REST 客戶端,用于與 Elasticsearch 集群進行交互。高級 REST 客戶端基于低級 REST 客戶端構建,提供了更方便、更面向對象的 API,使得我們可以輕松地發送各種請求,包括索引數據、搜索數據和執行聚合操作等。

(二)Elasticsearch 核心依賴

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.17.6</version>
</dependency>

Elasticsearch 核心依賴包含了 Elasticsearch 的核心功能和類庫。它是整個 Elasticsearch 運行的基礎,提供了數據存儲、索引構建、搜索算法等核心功能。在使用 Java API 進行桶聚合時,很多核心的聚合操作類和方法都來自這個依賴。

(三)其他依賴

根據具體的應用場景,可能還需要引入一些其他的依賴。例如,如果需要處理 JSON 數據,可能需要引入 Jackson 相關的依賴:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.4</version>
</dependency>

Jackson 是一個流行的 JSON 處理庫,它可以幫助我們將 Java 對象轉換為 JSON 格式,以及將 JSON 數據解析為 Java 對象。在與 Elasticsearch 交互時,數據通常以 JSON 格式傳輸,因此 Jackson 依賴可以方便我們處理這些數據。

(四)依賴管理

在 Maven 項目中,這些依賴會被自動下載并添加到項目的類路徑中。Maven 會根據依賴的版本信息,解析和管理依賴之間的關系,確保項目使用的所有依賴都是兼容的。同時,Maven 還提供了依賴傳遞的功能,即如果一個依賴依賴于其他的庫,Maven 會自動下載這些傳遞性依賴,使得項目的依賴管理更加方便和高效。

三、常見桶聚合類型

(一)terms 桶聚合

terms 桶聚合是最常用的桶聚合類型之一,它根據指定字段的不同值對文檔進行分組。每個不同的值會形成一個獨立的桶,每個桶中包含所有該字段值相同的文檔。

1. 語法示例

以下是使用 Java API 進行 terms 桶聚合的示例代碼:

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.builder.SearchSourceBuilder;public class TermsAggregationExample {public static void main(String[] args) throws Exception {try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")))) {SearchRequest searchRequest = new SearchRequest("your_index_name");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.aggregation(AggregationBuilders.terms("category_agg").field("category"));searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Terms categoryAgg = searchResponse.getAggregations().get("category_agg");for (Terms.Bucket bucket : categoryAgg.getBuckets()) {System.out.println("Category: " + bucket.getKeyAsString() + ", Doc Count: " + bucket.getDocCount());}}}
}

在上述代碼中:

  • 首先創建了一個 RestHighLevelClient 實例,用于與 Elasticsearch 集群進行通信。
  • 然后創建了一個 SearchRequest,指定要查詢的索引為 your_index_name
  • 使用 SearchSourceBuilder 構建查詢請求,通過 aggregation 方法添加了一個 terms 桶聚合,聚合名稱為 category_agg,分組字段為 category
  • 執行搜索請求并獲取響應,從響應中獲取名為 category_agg 的聚合結果,遍歷每個桶并打印出分組的類別和該類別下的文檔數量。
2. 應用場景

terms 桶聚合在很多場景下都非常有用。例如在電商數據分析中,可以使用 terms 桶聚合按照商品類別對訂單進行分組,統計每個類別的訂單數量,從而了解哪些商品類別最受歡迎。在日志分析中,可以按照日志級別對日志進行分組,統計不同級別日志的數量,以便快速定位系統中出現問題的頻率。

(二)date_histogram 桶聚合

date_histogram 桶聚合用于按照日期范圍對文檔進行分組。它可以根據指定的時間間隔(如秒、分鐘、小時、天等)將日期數據劃分為不同的桶,每個桶包含在該時間范圍內的文檔。

1. 語法示例
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.datehistogram.DateHistogram;
import org.elasticsearch.search.builder.SearchSourceBuilder;public class DateHistogramAggregationExample {public static void main(String[] args) throws Exception {try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")))) {SearchRequest searchRequest = new SearchRequest("your_index_name");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.aggregation(AggregationBuilders.dateHistogram("date_agg").field("order_date").calendarInterval(DateHistogram.Interval.DAY).format("yyyy-MM-dd"));searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);DateHistogram dateAgg = searchResponse.getAggregations().get("date_agg");for (DateHistogram.Bucket bucket : dateAgg.getBuckets()) {System.out.println("Date: " + bucket.getKeyAsString() + ", Doc Count: " + bucket.getDocCount());}}}
}

在這段代碼中:

  • 同樣創建了 RestHighLevelClientSearchRequest
  • 使用 SearchSourceBuilder 添加了一個 date_histogram 桶聚合,聚合名稱為 date_agg,分組字段為 order_date
  • 通過 calendarInterval 方法指定時間間隔為一天,format 方法指定日期的顯示格式為 yyyy-MM-dd
  • 執行查詢后,從響應中獲取聚合結果并遍歷每個桶,打印出日期和該日期下的文檔數量。
2. 應用場景

date_histogram 桶聚合在分析時間序列數據時非常有用。比如在電商銷售數據分析中,可以按照每天的訂單時間進行分組,統計每天的訂單數量,從而分析銷售趨勢。在服務器日志分析中,可以按照日志記錄的時間進行分組,了解系統在不同時間段的活動情況,以便進行性能優化和故障排查。

(三)range 桶聚合

range 桶聚合根據數值范圍對文檔進行分組。可以指定多個數值范圍,每個范圍形成一個桶,文檔根據其指定字段的值落入相應的桶中。

1. 語法示例
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.range.Range;
import org.elasticsearch.search.builder.SearchSourceBuilder;public class RangeAggregationExample {public static void main(String[] args) throws Exception {try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")))) {SearchRequest searchRequest = new SearchRequest("your_index_name");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.aggregation(AggregationBuilders.range("price_range_agg").field("price").addUnboundedTo(100).addRange(100, 200).addUnboundedFrom(200));searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Range priceRangeAgg = searchResponse.getAggregations().get("price_range_agg");for (Range.Bucket bucket : priceRangeAgg.getBuckets()) {System.out.println("Price Range: " + bucket.getKeyAsString() + ", Doc Count: " + bucket.getDocCount());}}}
}

在上述代碼中:

  • 創建了必要的客戶端和請求對象。
  • 使用 SearchSourceBuilder 添加了一個 range 桶聚合,聚合名稱為 price_range_agg,分組字段為 price
  • 通過 addUnboundedToaddRangeaddUnboundedFrom 方法定義了三個價格范圍:小于等于 100、100 到 200 之間、大于 200。
  • 執行查詢后,獲取聚合結果并遍歷每個桶,打印出價格范圍和該范圍內的文檔數量。
2. 應用場景

range 桶聚合在數據分析中常用于對數值數據進行分段統計。例如在電商商品價格分析中,可以按照不同的價格區間對商品進行分組,了解不同價格段商品的銷售情況。在用戶年齡分析中,可以按照年齡范圍對用戶進行分組,分析不同年齡段用戶的行為特征。

(四)嵌套桶聚合

在實際的數據分析中,往往需要對數據進行多層次的分組和分析,這時候就可以使用嵌套桶聚合。嵌套桶聚合是指在一個桶聚合的基礎上,再在每個桶內進行另一個桶聚合,從而實現更復雜的數據分組和洞察。

接下來是具體的示例:

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;import java.io.IOException;public class NestedBucketAggregationExample {public static void main(String[] args) throws IOException {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));SearchRequest searchRequest = new SearchRequest("your_index_name");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 外層桶聚合,按產品類別分組TermsAggregationBuilder outerAggregation = AggregationBuilders.terms("product_categories").field("category.keyword");// 內層桶聚合,在每個產品類別桶內按子類別分組TermsAggregationBuilder innerAggregation = AggregationBuilders.terms("sub_categories").field("sub_category.keyword");// 在內層桶聚合中計算總銷售額innerAggregation.subAggregation(AggregationBuilders.sum("total_sales").field("sales_amount"));outerAggregation.subAggregation(innerAggregation);searchSourceBuilder.aggregation(outerAggregation);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);// 解析結果ParsedTerms outerTerms = searchResponse.getAggregations().get("product_categories");for (Terms.Bucket outerBucket : outerTerms.getBuckets()) {String category = outerBucket.getKeyAsString();System.out.println("Category: " + category);ParsedTerms innerTerms = outerBucket.getAggregations().get("sub_categories");for (Terms.Bucket innerBucket : innerTerms.getBuckets()) {String subCategory = innerBucket.getKeyAsString();double totalSales = innerBucket.getAggregations().get("total_sales").getValue();System.out.println("  Sub - Category: " + subCategory + ", Total Sales: " + totalSales);}}client.close();}
}
復雜多層次嵌套場景

在實際應用中,可能會遇到更復雜的多層次嵌套需求。例如,在分析用戶行為數據時,我們可能需要按日期、用戶所在地區、用戶年齡段進行多層次分組,然后分析每個分組下用戶的平均瀏覽時長。

// 按日期分組
TermsAggregationBuilder dateAggregation = AggregationBuilders.terms("by_date").field("date.keyword");// 在日期分組桶內按地區分組
TermsAggregationBuilder regionAggregation = AggregationBuilders.terms("by_region").field("region.keyword");// 在地區分組桶內按年齡段分組
TermsAggregationBuilder ageGroupAggregation = AggregationBuilders.terms("by_age_group").field("age_group.keyword");// 在年齡段分組桶內計算平均瀏覽時長
ageGroupAggregation.subAggregation(AggregationBuilders.avg("avg_browse_time").field("browse_time"));regionAggregation.subAggregation(ageGroupAggregation);
dateAggregation.subAggregation(regionAggregation);searchSourceBuilder.aggregation(dateAggregation);

通過這樣的多層次嵌套,可以深入了解不同時間、不同地區、不同年齡段用戶的行為模式,為產品優化和營銷策略制定提供有力的數據支持。

注意事項
  1. 性能問題:隨著嵌套層次的增加,聚合操作的性能開銷會顯著增大。因為每個桶聚合都需要對數據進行一次遍歷和分組。在設計嵌套聚合時,要充分考慮數據量和性能需求,避免不必要的嵌套。
  2. 內存使用:Elasticsearch 在進行聚合操作時會占用一定的內存來存儲中間結果。對于大規模數據的復雜嵌套聚合,可能會導致內存不足的問題。可以通過合理設置 shard_size 等參數來控制內存使用。
  3. 數據傾斜:如果某些桶中的數據量過大,會影響聚合的性能和結果的準確性。在進行嵌套聚合前,需要對數據分布有一定的了解,必要時可以通過數據預處理來平衡數據分布。

四、總結

Elasticsearch 的桶聚合功能為我們提供了強大的數據分組和分析能力,尤其是嵌套桶聚合能夠幫助我們深入挖掘數據的內在結構和分布規律。通過合理設計嵌套層次和聚合操作,結合實際業務需求,我們可以從海量數據中獲取有價值的信息,為決策提供有力支持。無論是在電商、金融、日志分析還是其他領域,桶聚合都有著廣泛的應用前景。

五、參考資料文獻

  1. Elasticsearch 官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
  2. 《Elasticsearch in Action》,作者:Jeff Markham
  3. Elasticsearch 官方博客:https://www.elastic.co/blog/ ,其中包含了許多關于 Elasticsearch 各種功能使用和優化的文章。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66678.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

tensorflow源碼編譯在C++環境使用

https://tensorflow.google.cn/install/source?hlzh-cn查看tensorflow和其他需要下載軟件對應的版本&#xff0c;最好一模一樣 1、下載TensorFlow源碼 https://github.com/tensorflow/tensorflow 2、安裝編譯protobuf&#xff08;3.9.2&#xff09; protobuf版本要和TensorFlo…

P8738 [藍橋杯 2020 國 C] 天干地支

兩種方法 #include<bits/stdc.h> using namespace std;int main(){int year;cin>>year;string tg[10] {"geng", "xin", "ren", "gui","jia", "yi", "bing", "ding", "wu&…

Python 常用運維模塊之OS模塊篇

Python 常用運維模塊之OS模塊篇 OS 模塊獲取當前工作目錄更改當前工作目錄返回當前目錄路徑返回上一級目錄路徑遞歸生成目錄路徑刪除目錄創建目錄刪除目錄列出特定目錄下文件和子目錄刪除某個特定文件重命名某個文件獲取某個文件/目錄的信息輸出目錄路徑分隔符輸出文件行終止符…

uniapps使用HTML5的io模塊拷貝文件目錄

最近在集成sqlite到uniapp的過程中&#xff0c;因為要將sqlite數據庫預加載&#xff0c;所以需要使用HTML5的plus.io模塊。使用過程中遇到了許多問題&#xff0c;比如文件路徑總是解析不到等。尤其是應用私有文檔目錄’_doc’。 根據官方文檔&#xff1a; 為了安全管理應用的…

使用 F12 查看 Network 及數據格式

在瀏覽器中&#xff0c;F12 開發者工具的 “Network” 面板是用于查看網頁在加載過程中發起的所有網絡請求&#xff0c;包括 API 請求&#xff0c;以及查看這些請求的詳細信息和響應數據的。以下以常見的 Chrome 瀏覽器為例&#xff0c;介紹如何使用 F12 控制臺查看 Network 里…

Redis 2.6.12在Win10系統上的安裝教程

諸神緘默不語-個人CSDN博文目錄 這個版本的安裝包是跟同事要的&#xff0c;em&#xff0c;如果真的需要這個版本的話可以跟我要&#xff1a; 解壓后雙擊第一個bat文件&#xff0c;即可掛起Redis服務&#xff1a;

分布式數據庫中間件(DDM)的使用場景

華為云分布式數據庫中間件&#xff08;DDM&#xff09;是一款專注于解決數據庫分布式擴展問題的中間件服務&#xff0c;突破了傳統數據庫的容量和性能瓶頸&#xff0c;能夠實現海量數據的高并發訪問。以下是九河云總結的DDM的典型使用場景&#xff1a; 1. 互聯網應用 在電商、…

Ubuntu16.04 安裝OpenCV4.5.4 避坑

Ubuntu16.04 安裝C版OpenCV4.5.4 Ubuntu16.04 VSCode下cmakeclanglldb調試c 文章目錄 Ubuntu16.04 安裝C版OpenCV4.5.41. 下載Opencv壓縮包2. 安裝Opencv-4.5.43. 配置OpenCV的編譯環境4.測試是否安裝成功 1. 下載Opencv壓縮包 下載Opencv壓縮包&#xff0c;選擇source版本。…

RabbitMQ集群安裝rabbitmq_delayed_message_exchange

1、單節點安裝rabbitmq安裝延遲隊列 安裝延遲隊列rabbitmq_delayed_message_exchange可以參考這個文章&#xff1a; rabbitmq安裝延遲隊列-CSDN博客 2、集群安裝rabbitmq_delayed_message_exchange 在第二個節點 join_cluster 之后&#xff0c;start_app 就會報錯了 (CaseC…

QT開發:事件循環與處理機制的概念和流程概括性總結

事件循環與處理機制的概念和流程 Qt 事件循環和事件處理機制是 Qt 框架的核心&#xff0c;負責管理和分發各種事件&#xff08;用戶交互、定時器事件、網絡事件等&#xff09;。以下是詳細透徹的概念解釋和流程講解。 1. 事件循環&#xff08;Event Loop&#xff09;的概念 …

博客搭建 — GitHub Pages 部署

關于 GitHub Pages GitHub Pages 是一項靜態站點托管服務&#xff0c;它直接從 GitHub 上的倉庫獲取 HTML、CSS 和 JavaScript 文件&#xff0c;通過構建過程運行文件&#xff0c;然后發布網站。 本文最終效果是搭建出一個域名為 https://<user>.github.io 的網站 創建…

網絡通信---MCU移植LWIP

使用的MCU型號為STM32F429IGT6&#xff0c;PHY為LAN7820A 目標是通過MCU的ETH給LWIP提供輸入輸出從而實現基本的Ping應答 OK廢話不多說我們直接開始 下載源碼 LWIP包源碼&#xff1a;lwip源碼 -在這里下載 ST官方支持的ETH包&#xff1a;ST-ETH支持包 這里下載 創建工程 …

【MySQL】存儲引擎有哪些?區別是什么?

頻率難度60%???? 這個問題其實難度并不是很大&#xff0c;只是涉及到的相關知識比較繁雜&#xff0c;比如事務、鎖機制等等&#xff0c;都和存儲引擎有關系。有時還會根據場景選擇不同的存儲引擎。 下面筆者將會根據幾個部分盡可能地講清楚 MySQL 中的存儲引擎&#xff0…

【系統環境丟失恢復】如何恢復和重建 Ubuntu 中的 .bashrc 文件

r如果你遇到這種情況&#xff0c;說明系統環境的.bashrc 文件丟失恢復&#xff1a; 要恢復 ~/.bashrc 文件&#xff0c;可以按照以下幾種方式操作&#xff1a; 恢復默認的 ~/.bashrc 文件 如果 ~/.bashrc 文件被刪除或修改&#xff0c;你可以恢復到默認的版本。可以參考以下…

人工智能丨智能化測試解決方案全面解析

智能化測試解決方案通過整合前沿的人工智能技術與自動化測試技術&#xff0c;為軟件產品的測試工作帶來了前所未有的高效與智能。 智能化測試解決方案主要內容 大語言模型私有部署&#xff1a;確保文檔理解、代碼分析和測試生成過程中的安全與隱私&#xff0c;讓你無后顧之憂…

Element修改表格結構樣式集合(后續實時更新)

場景 修改前端Element組件el-table樣式 實現 線表格 <div class"tablepro"><el-table:data"tableData":header-cell-style"{ textAlign:center}"class"tablepro-table"borderstyle"width: 100%;height:100%"&g…

C++語言的語法糖

C語言的語法糖 在現代編程語言的設計中&#xff0c;語法糖&#xff08;Syntactic Sugar&#xff09;是一個非常重要的概念。它指的是一種編程語言所提供的語法特性&#xff0c;使得代碼更加簡潔易讀&#xff0c;編寫更加方便&#xff0c;而不是增加語言的功能。C作為一種強大的…

基于Redis實現短信驗證碼登錄

目錄 1 基于Session實現短信驗證碼登錄 2 配置登錄攔截器 3 配置完攔截器還需將自定義攔截器添加到SpringMVC的攔截器列表中 才能生效 4 Session集群共享問題 5 基于Redis實現短信驗證碼登錄 6 Hash 結構與 String 結構類型的比較 7 Redis替代Session需要考慮的問題 8 …

c++入門----模板深入探究與仿函數

1.模板參數加入一個變量 一般只能是int&#xff0c;double要看c的版本&#xff0c;在最新的版本下是支持double模板參數的。 2.適配器的使用 template <class T,class containerdeque<T>> class stack { public:void push_back(const T& x) {_con.push_back…

【Vim Masterclass 筆記22】S09L40 + L41:同步練習11:Vim 的配置與 vimrc 文件的相關操作(含點評課內容)

文章目錄 S09L40 Exercise 11 - Vim Settings and the Vimrc File1 訓練目標2 操作指令2.1. 打開 vimrc-sample 文件2.2. 嘗試各種選項與設置2.3. 將更改內容保存到 vimrc-sample 文件2.4. 將文件 vimrc-sample 的內容復制到寄存器2.5. 創建專屬 vimrc 文件2.6. 對于 Mac、Linu…