【Elasticsearch 】 聚合分析:桶聚合

news2025/1/22 20:30:16

🧑 博主简介: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.coloradmin.cn/o/2280548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Skyeye 云 VUE 版本 v3.15.5 发布

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

TCP如何保证安全可靠?

TCP如何保证安全可靠&#xff1f; TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。为了保证数据传输的安全性和可靠性&#xff0c;TCP 采用了多种机制&#xff0c;包括确认和重传、数据校验、数据分片和排序、流量控制以及拥塞控制。 1. 确认和…

高等数学学习笔记 ☞ 定积分的积分方法

1. 定积分的换元积分法 1. 换元积分公式&#xff1a;设函数在闭区间上连续&#xff0c;令&#xff0c;若满足&#xff1a; ①&#xff1a;当时&#xff0c;&#xff1b;当时&#xff0c;。 此时的大小关系不一定&#xff0c;但与最好对应着写&#xff0c;否则就要留意变号的问…

Alluxio 联手 Solidigm 推出针对 AI 工作负载的高级缓存解决方案

作者&#xff1a;Wayne Gao, Yi Wang, Jie Chen, Sarika Mehta Alluxio 作为全球领先的 AI 缓存解决方案供应商&#xff0c; 提供针对 GPU 驱动 AI 负载的高速缓存。其可扩展架构支持数万个节点&#xff0c;能显著降低存储带宽的消耗。Alluxio 在解决 AI 存储挑战方面的前沿技…

Docker Load后存储的镜像及更改镜像存储目录的方法

Docker Load后存储的镜像及更改镜像存储目录的方法 Docker Load后存储的镜像更改镜像存储目录的方法脚本说明注意事项Docker作为一种开源的应用容器引擎,已经广泛应用于软件开发、测试和生产环境中。通过Docker,开发者可以将应用打包成镜像,轻松地进行分发和运行。而在某些场…

爬虫基础之爬取某站视频

目标网址:为了1/4螺口买小米SU7&#xff0c;开了一个月&#xff0c;它值吗&#xff1f;_哔哩哔哩_bilibili 本案例所使用到的模块 requests (发送HTTP请求)subprocess(执行系统命令)re (正则表达式操作)json (处理JSON数据) 需求分析: 视频的名称 F12 打开开发者工具 or 右击…

可视化-numpy实现线性回归和梯度下降法

代码如下&#xff1a; import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.patches import Patch# 生成二维输入数据 np.random.seed(0) X1 2 * np.random.rand(100, 1) # 第一个特征 X2 3 * np.random.rand(10…

计算机网络 (53)互联网使用的安全协议

一、SSL/TLS协议 概述&#xff1a; SSL&#xff08;Secure Sockets Layer&#xff09;安全套接层和TLS&#xff08;Transport Layer Security&#xff09;传输层安全协议是工作在OSI模型应用层的安全协议。SSL由Netscape于1994年开发&#xff0c;广泛应用于基于万维网的各种网络…

在视频汇聚平台EasyNVR平台中使用RTSP拉流的具体步骤

之前有用户反馈&#xff0c;在EasyNVR平台中添加Pull时使用海康设备的RTSP流地址无法播放。经过研发的优化及一系列严谨的验证流程&#xff0c;我们已确认优化后的EasyNVR平台&#xff0c;通过Pull方式添加海康设备的RTSP流已经能够正常播放。以下是具体的操作步骤&#xff1a;…

在Linux环境中使用Qt访问USB摄像头的解决方法

一、Cheese方法 1、将虚拟机关机&#xff0c;点击左上角的虚拟机设置&#xff0c;将显示所有USB输入设备选上&#xff0c;点击确定。 2、 打开虚拟机&#xff0c;在终端输入以下命令安装所需的软件包&#xff1a; sudo apt update sudo apt install cheese v4l-utils 确保摄…

Qt——网络编程

和多线程类似, Qt 为了支持跨平台, 对网络编程的 API 也进行了重新封装。 在进行网络编程之前, 需要在项目中的 .pro 文件中添加 network 模块&#xff0c;添加之后运行一下&#xff0c;使其包含的头文件能够被加载进Qt Creator。 Qt本身是一个非常庞大&#xff0c;包罗万象的…

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…

no persistent volumes available for this claim and no storage class is set

目录标题 问题1问题描述**问题原因****解决步骤****1. 检查 PVC 的配置****2. 设置 StorageClass****创建默认 StorageClass****修改 PVC 的 StorageClass** **3. 创建匹配的 PV****4. 验证 PVC 是否绑定成功** **最佳实践** 问题2问题描述**问题原因****解决方案****1. 删除现…

2024微短剧行业生态洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39072 本报告合集洞察从多个维度全面解读微短剧行业。在行业发展层面&#xff0c;市场规模与用户规模双增长&#xff0c;创造大量高收入就业岗位并带动产业链升级。内容创作上&#xff0c;精品化、品牌化趋势凸显&#xff0c;题材走…

【22】Word:小李-高新技术企业政策❗

目录 题目​ NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在删除空白行等要求&#xff0c;可以到最后来完成。注意最后一定要检查此部分&#xff01;注意&#xff1a;大多是和事例一样即可&#xff0c;不用一摸一样&#xff0c;但也不要差太多。 题目 NO1.2 F12Fn&a…

SQLmap 自动注入 -02

1: 如果想获得SQL 数据库的信息&#xff0c;可以加入参数: -dbs sqlmap -u "http://192.168.56.133/mutillidae/index.php?pageuser-info.php&usernamexiaosheng&passwordabc&user-info-php-submit-buttonViewAccountDetails" --batch -p username -dbs…

视频m3u8形式播放 -- python and html

hls hls官网地址 创建项目 ts为视频片段 m3u8文件内容 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" …

C#中的语句

C#提供了各式各样的语句&#xff0c;大多数是由C和C发展而来&#xff0c;当然&#xff0c;在C#中做了相应修改。语句和表达式一样&#xff0c;都是C#程序的基本组成部分&#xff0c;在本文我们来一起学习C#语句。 1.语句 语句是构造所有C#程序的过程构造块。在语句中可以声明…

【2024年CSDN平台总结:新生与成长之路】

&#x1f4ab;引言 2024年已经过去&#xff0c;回顾这一年&#xff0c;所有的经历依然历历在目。以“经验”为动力&#xff0c;我正迈向2025年。回顾自己在CSDN平台上的创作之路&#xff0c;收获满满、成长颇多&#xff0c;也有许多宝贵的感悟。接下来&#xff0c;我将分享这一…

架构思考与实践:从通用到场景的转变

在当今复杂多变的商业环境中&#xff0c;企业架构的设计与优化成为了一个关键议题。本文通过一系列随笔&#xff0c;探讨了业务架构的价值、从通用架构到场景架构的转变、恰如其分的架构设计以及如何避免盲目低效等问题。通过对多个实际案例的分析&#xff0c;笔者揭示了架构设…