Elasticsearch5.2.2进行数据聚合测试

《再也不怕elasticsearch》es聚合使用与原理剖析 还不会es的复杂查询?点进来! 阅读详情

我们将学习各种聚合以及它们的语法,但是最好的学习方法还是通过例子。一旦你了解了如何思考聚合以及如何对它们进行合适的嵌套,那么语法本身是不难的。

让我们从一个例子开始。我们会建立一个也许对汽车交易商有所用处的聚合。数据是关于汽车交易的:汽车型号,制造商,销售价格,销售时间以及一些其他的相关数据。

首先,通过批量索引(Bulk-Index)来添加一些数据:

POST /cars/transactions/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }

现在我们有了一些数据,来创建一个聚合吧。一个汽车交易商也许希望知道哪种颜色的车卖的最好。这可以通过一个简单的聚合完成。使用terms桶:

GET  /cars/transactions/_search
{
    "aggs": {
        "colors": {
            "terms": {
                "field": "color"
            }
        }
    },
    "size": 0
}

因为我们并不关心搜索结果,使用的"size": 0。聚合工作在顶层的aggs参数下(当然你也可以使用更长的aggregations)。 然后给这个聚合起了一个名字:colors。 最后,我们定义了一个terms类型的桶,它针对color字段。

聚合是以搜索结果为上下文而执行的,这意味着它是搜索请求(比如,使用/_search端点)中的另一个顶层参数(Top-level Parameter)。聚合可以和查询同时使用,这一点我们在后续的范围聚合(Scoping Aggregations)中介绍。

接下来我们为聚合起一个名字。命名规则是有你决定的; 聚合的响应会被该名字标记,因此在应用中你就能够根据名字来得到聚合结果,并对它们进行操作了。

然后,我们开始定义聚合本身。比如,我们定义了一个terms类型的桶。terms桶会动态地为每一个它遇到的不重复的词条创建一个新的桶。因为我们针对的是color字段,那么terms桶会动态地为每种颜色创建一个新桶。

如果执行出现报错,搜了一下应该是5.x后对排序,聚合这些操作用单独的数据结构(fielddata)缓存到内存里了,需要单独开启,简单来说就是在聚合前执行如下操作

PUT cars/_mapping/transactions
{
  "properties": {
    "color": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

PUT cars/_mapping/transactions
{
  "properties": {
    "make": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

让我们执行该聚合来看看其结果:
这里写图片描述

因为我们使用的"size": 0,所以没有搜索结果被返回。 每个桶中的key对应的是在color字段中找到的不重复的词条。它同时也包含了一个doc_count,用来表示包含了该词条的文档数量。

响应包含了一个桶列表,每个桶都对应着一个不重复的颜色(比如,红色或者绿色)。每个桶也包含了“掉入”该桶中的文档数量。比如,有4辆红色的车。

前面的例子是完全实时(Real-Time)的:如果文档是可搜索的,那么它们就能够被聚合。这意味着你能够将拿到的聚合结果置入到一个图形库中来生成实时的仪表板(Dashboard)。一旦你卖出了一台银色汽车,在图形上关于银色汽车的统计数据就会被动态地更新。


添加一个指标(Metric)

从前面的例子中,我们可以知道每个桶中的文档数量。但是,通常我们的应用会需要基于那些文档的更加复杂的指标(Metric)。比如,每个桶中的汽车的平均价格是多少?

为了得到该信息,我们得告诉ES需要为哪些字段计算哪些指标。这需要将指标嵌套到桶中。指标会基于桶中的文档的值来计算相应的统计信息。

让我们添加一个计算平均值的指标:

GET /cars/transactions/_search
{
   "aggs": 
   {
      "colors": 
      {
         "terms": 
         {
            "field": "color"
         },
         "aggs": 
         { 
            "avg_price": 
            { 
               "avg": {
                  "field": "price" 
               }
            }
         }
      }
   },
   "size": 0
}

我们添加了一个新的aggs层级来包含该指标。然后给该指标起了一个名字:avg_price。最后定义了该指标作用的字段为price。.

正如你所看到的,我们向前面的例子中添加了一个新的aggs层级。这个新的聚合层级能够让我们将avg指标嵌套在terms桶中。这意味着我们能为每种颜色都计算一个平均值。

同样的,我们需要给指标起一个名(avg_price)来让我们能够在将来得到其值。最后,我们指定了指标本身(avg)以及该指标作用的字段(price):
这里写图片描述

现在,在响应中多了一个avg_price元素。

尽管得到的响应只是稍稍有些变化,但是获得的数据增加的了许多。之前我们只知道有4辆红色汽车。现在我们知道了红色汽车的平均价格是32500刀。这些数据你可以直接插入到报表中。

桶中的桶(Buckets inside Buckets)

当你开始使用不同的嵌套模式时,聚合强大的能力才会显现出来。在前面的例子中,我们已经知道了如何将一个指标嵌套进一个桶的,它的功能已经十分强大了。

但是真正激动人心的分析功能来源于嵌套在其它桶中的桶。现在,让我们来看看如何找到每种颜色的汽车的制造商分布信息:

GET /cars/transactions/_search
{
   "aggs": 
   {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": 
         {
            "avg_price": { 
               "avg": {
                  "field": "price"
               }
            },
            "make": { 
                "terms": {
                    "field": "make" 
                }
            }
         } 
      }
   },
   "size": 0
}

此时发生了一些有意思的事情。首先,你会注意到前面的avg_price指标完全没有变化。一个聚合的每个层级都能够拥有多个指标或者桶。avg_price指标告诉了我们每种汽车颜色的平均价格。为每种颜色创建的桶和指标是各自独立的。

这个性质对你的应用而言是很重要的,因为你经常需要收集一些互相关联却又完全不同的指标。聚合能够让你对数据遍历一次就得到所有需要的信息。

另外一件重要的事情是添加了新聚合make,它是一个terms类型的桶(嵌套在名为colors的terms桶中)。这意味着我们会根据数据集创建不重复的(color, make)组合。

让我们来看看得到的响应:

{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 8,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "colors": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "red",
          "doc_count": 4,
          "avg_price": {
            "value": 32500
          },
          "make": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "honda",
                "doc_count": 3
              },
              {
                "key": "bmw",
                "doc_count": 1
              }
            ]
          }
        },
        {
          "key": "blue",
          "doc_count": 2,
          "avg_price": {
            "value": 20000
          },
          "make": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "ford",
                "doc_count": 1
              },
              {
                "key": "toyota",
                "doc_count": 1
              }
            ]
          }
        },
        {
          "key": "green",
          "doc_count": 2,
          "avg_price": {
            "value": 21000
          },
          "make": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "ford",
                "doc_count": 1
              },
              {
                "key": "toyota",
                "doc_count": 1
              }
            ]
          }
        }
      ]
    }
  }
}

该响应告诉了我们如下信息:

有4辆红色汽车。
红色汽车的平均价格是32500美刀。
红色汽车中的3辆是Honda,1辆是BMW。

最后的一个修改(One Final Modification)

在继续讨论新的话题前,为了把问题讲清楚让我们对该例子进行最后一个修改。为每个制造商添加两个指标来计算最低和最高价格:

GET /cars/transactions/_search
{
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": {
            "avg_price": { "avg": { "field": "price" }
            },
            "make" : {
                "terms" : {
                    "field" : "make"
                },
                "aggs" : { 
                    "min_price" : { "min": { "field": "price"} }, 
                    "max_price" : { "max": { "field": "price"} } 
                }
            }
         }
      }
   },
   "size": 0
}

我们需要添加另一个aggs层级来进行对min和max的嵌套。
得到的响应如下:

{
  "took": 23,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 8,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "colors": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "red",
          "doc_count": 4,
          "avg_price": {
            "value": 32500
          },
          "make": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "honda",
                "doc_count": 3,
                "max_price": {
                  "value": 20000
                },
                "min_price": {
                  "value": 10000
                }
              },
              {
                "key": "bmw",
                "doc_count": 1,
                "max_price": {
                  "value": 80000
                },
                "min_price": {
                  "value": 80000
                }
              }
            ]
          }
        },
        {
          "key": "blue",
          "doc_count": 2,
          "avg_price": {
            "value": 20000
          },
          "make": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "ford",
                "doc_count": 1,
                "max_price": {
                  "value": 25000
                },
                "min_price": {
                  "value": 25000
                }
              },
              {
                "key": "toyota",
                "doc_count": 1,
                "max_price": {
                  "value": 15000
                },
                "min_price": {
                  "value": 15000
                }
              }
            ]
          }
        },
        {
          "key": "green",
          "doc_count": 2,
          "avg_price": {
            "value": 21000
          },
          "make": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "ford",
                "doc_count": 1,
                "max_price": {
                  "value": 30000
                },
                "min_price": {
                  "value": 30000
                }
              },
              {
                "key": "toyota",
                "doc_count": 1,
                "max_price": {
                  "value": 12000
                },
                "min_price": {
                  "value": 12000
                }
              }
            ]
          }
        }
      ]
    }
  }
}

在每个make桶下,多了min和max的指标。

此时,我们可以得到如下信息:

有4辆红色汽车。
红色汽车的平均价格是32500美刀。
红色汽车中的3辆是Honda,1辆是BMW。
红色Honda汽车中,最便宜的价格为10000美刀。
最贵的红色Honda汽车为20000美刀。
springboot+elasticsearch实现一个搜索引擎的功能 springboot+elasticsearch实现一个搜索引擎的功能 一、elasticsearch的安装 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。(如何安装elasticsearc... 阅读详情

相关推荐

【elasticsearch】ES的JAVA工具类完整版(已完成,已测试)

当你制作好一个java类,并且把属性的类型都规范好,这时候可直接通过该方法创建索引,如果该类中有数组类型的属性,则需要指定 nestedFields 参数的属性名,否则在插入数据后悔发现,该数组类型的es中的type不是 nested类型。solution 便是数组类型,无论List的泛型是基本类型,还是包装类型,在es中都需要指定该字段是【nested】。通过es控制台或者postman都可以进行索引操作,类型mysql可视化工具对mysql数据库表结构操作类型,只不过,不解释了,没啥好说的。

Timeguys的专栏 2888

mock junit test elasticsearch SearchResponse

mock 测试 elasticsearch SearchResponse searchResponse = mock(SearchResponse.class); SearchResponse scrollResponse = mock(SearchResponse.class); when(analysisRestClient.search(any(), Mockito.any(RequestOptions.class))).thenReturn(searchResponse); SearchHits s

极客编程的专栏 2220

ElasticSearch 数据聚合与运算

ElasticSearch 数据聚合与运算

Jason World 1220

[Elasticsearch] 聚合的测试数据

本章翻译自Elasticsearch官方指南的Aggregation Test-Drive一章。 聚合的测试数据(Aggregation Test-Drive) 我们将学习各种聚合以及它们的语法,但是最好的学习方法还是通过例子。一旦你了解了如何思考聚合以及如何对它们进行合适的嵌套,那么语法本身是不难的。 让我们从一个例子开始。我们会建立一个也许对汽车交易商有所用处

不忘初心,好好沉淀 4万+

【Elasticsearch】es脚本编程使用详解

es脚本编程使用详解

congge 6513

elasticmock:用于测试目的的Python Elasticsearch Mock

弹性模拟 用于测试目的的Python Elasticsearch Mock 安装 pip install ElasticMock 用法 要使用ElasticMock,请使用@elasticmock装饰器装饰您的测试方法: from unittest import TestCase from elasticmock import elasticmock class TestClass ( TestCase ): @ elasticmock def test_should_return_something_from_elasticsearch ( self ): self . assertIsNotNone ( some_function_that_uses_elasticsearch ()) 自定义行为 您还可以通过导入elasticmock.behavio

ElasticMock 开源项目安装与使用教程

ElasticMock 开源项目安装与使用教程 1. 项目目录结构及介绍 ElasticMock 是一个用于测试目的的 Python Elasticsearch 模拟器。下面是其基本的目录结构和关键文件介绍: elasticmock/ ├── elasticmock/ <- 主要代码库 │ ├── __init__.py <- 初始化模块,定义主要类和函数 │...

gitblog_00061的博客 378

Windows 10 下 Nacos 3.0.2 单机版保姆级安装教程(含JDK 17配置与MySQL 8.0连接避坑)

本文提供Windows 10下Nacos 3.0.2单机版的详细安装教程,涵盖JDK 17配置、MySQL 8.0连接优化及生产级安全设置。通过步骤详解和常见问题解决方案,帮助开发者快速完成Nacos的安装与配置,确保服务发现与配置管理的高效运行。

weixin_29237635的博客 318

elasticsearch-mocksolrplugin编译测试

https://github.com/mattweber/elasticsearch-mocksolrplugin 下载源码,通过eclipse导入maven工程。maven库更新后 co.diji.rest.SolrUpdateHandlerRestAction 类有错误,可能是r...

chenggua8561的博客 266

频偏估计技术:从原理到5G应用的实战解析

本文深入解析了5G通信中的频偏问题及其核心技术。频偏如同调不准的旋钮,会导致信号失真与载波间干扰。文章详细拆解了整数倍与小数倍频偏估计两大核心方法,重点剖析了基于循环前缀和基于同步信号块的算法原理与优劣,并结合eMBB、mMTC、URLLC三大5G应用场景,提供了实战算法选择策略与参数调优避坑指南。

weixin_29218963的博客 261

Cesium+Three.js融合实战:从零构建GIS与BIM一体化大场景

本文详细介绍了Cesium与Three.js融合技术在GIS与BIM一体化大场景中的应用实践。通过坐标系转换、双引擎协同渲染等核心技术,实现宏观地理信息与微观建筑细节的完美结合,为智慧城市、数字孪生等项目提供高效解决方案。文章包含环境配置、性能优化等实战经验,助力开发者快速掌握三维可视化开发技巧。

weixin_42563415的博客 259

ES7SpringDataElasticsearch配置 最完整的springboot2.2.x.RELEASE整合springDataElasticsearch Elasticsea

本文使用内容 springBoot2.2.5.RELEASE版本 Elasticsearch7.6.2 linux版本的 SpringDataElasticSearch与Springboot版本对应 一、操作准备 1、导入依赖 此处版本 2.2.5.RELEASE <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr...

BaldHead`s 1478

卡门涡街可视化实战:从网格加密策略到动画后处理技巧

本文详细介绍了利用ANSYS Fluent进行卡门涡街可视化模拟的全流程,包括网格加密策略、求解器设置、涡街捕捉及动画后处理技巧。通过计算流体力学(CFD)方法,帮助工程师和研究人员高效模拟圆柱绕流现象,优化工程设计。

weixin_29309785的博客 414

ClickHouse 填平 Elasticsearch 护城河?日志分析新选择!

ClickHouse 现已集成全文搜索功能,结合其强大的分析引擎,一站式解决日志搜索与聚合需求。Elasticsearch 在日志分析领域的“护城河”已然消失。

ClickHouseDB的博客 340

【汽车ECU电控数据管理篇】A2L文件在ECU标定中的关键作用与实战解析

本文深入解析A2L文件在汽车ECU标定中的关键作用,详细介绍了其作为'数据字典'的核心功能与实战应用。通过剖析A2L文件的结构、关键标签及常见问题,帮助工程师高效管理电控数据,提升ECU标定效率与准确性。文章特别强调了ASAP2标准下的A2L文件在汽车电控系统中的重要性。

a3b4c5的博客 786

【tio-websocket】15、学习tio的第1步—tio-study

tio-study 是用于学习 t-io 的示范工程,tio-study 是入门 t-io 最好的方式!tio-study 工程演示的是一个典型的 TCP 长连接应用工程,分为 server(服务端) 和 client(客户端) 工程,server 和 client 共用 common(公共模块) 工程

JACKAL 1万+

ElasticSearch分布式搜索引擎

elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域: 而elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。elasticsearch底层是基于lucene来实现的。Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址:https://lucene.apache.org/ 。elasticse

我的博客 2452

金三银四!风控建模岗面试题库大全:从理论到实战避坑指南

风控建模面试大全

阿黎逸阳的博客 767

elasticsearch(ES)分布式搜索引擎04——(数据聚合,自动补全,数据同步,ES集群)

默认的拼音分词器会将每个汉字单独分为拼音,而我们希望的是每个词条形成一组拼音,需要对拼音分词器做个性化定制,形成自定义分词器。character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smarttokenizer filter:将tokenizer输出的词条做进一步处理。

qq_59708493的博客 2124

基于STM32、HAL库的ZMOD4510AI4R气体传感器驱动程序设计

ZMOD4510AI4R是Renesas公司推出的一款数字空气质量传感器,主要用于检测臭氧(O₃)和总挥发性有机化合物(TVOC)浓度。(status & 0x80)) // 检查数据就绪位。// 等待测量完成 (实际应用中应该使用非阻塞方式)// 转换为ppb (简化转换,实际应根据传感器文档校准)* @param hzmod: ZMOD4510句柄。* @param tvoc: TVOC浓度(ppb)* @param ozone: 臭氧浓度(ppb)* @param hi2c: I2C句柄。

corlin6688的博客 311

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

实战精讲:如何在Elasticsearch中进行数据的聚合分析

Elasticsearch聚合分析:是ES除搜索外最核心的能力,指对检索到的数据进行分组、统计、计算、求和、平均值、最大值、最小值、百分位等分析操作,等价于MySQL中的GROUP BY+聚合函数,但性能远超传统数据库,千万级数据可秒级出统计结果。搜索是找数据,聚合是算数据。对字段进行数值计算,不分组,直接输出统计结果。按照字段值、范围、日期、关键词对数据分组。先分组(Bucket),再对每组数据计算指标(Metric),是工作中最常用的聚合方式。聚合类型关键字作用场景指标聚合sum求和。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3307

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ElasticSearch内容分享(四):ES搜索引擎

但是elasticsearch将来一定是集群,例如我集群有5个节点,我要查询TOP1000的数据,并不是每个节点查询200条就可以了。那每个节点都要查询10000条?因此要想获取整个集群的TOP1000,必须先查询出每个节点的TOP1000,汇总结果后,重新排名,重新截取TOP1000。可以看到,API与其它查询的差别同样是在查询条件的构建,QueryBuilders,结果解析等其他代码完全不变。每一个不同的字段,其查询的条件、方式都不一样,必须是多个不同的查询,而要组合这些查询,就必须用bool查询了。

之乎者也·的博客 1367

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Elasticsearch教程(32) ES 聚合查询后过滤 Distinct Group By Having功能

一、之前写的关于ES聚合的博客 Elasticsearch教程(3) ES聚合查询DSL Elasticsearch教程(4) High Level REST Client API 查询 聚合 分组 Elasticsearch教程(5) 指标聚合 SQL DSL JavaAPI Elasticsearch教程(6) 桶聚合Query DSL-Terms Aggregation Elasticsearch教程(10) ES term terms prefix 搜索 聚合查询 详细总结 Elasticsearc

Java Spring Elasticsearch 1万+

ES聚合查询在基本语法

以下代码均在Kibana的dev tools下执行 1、创造数据 POST /test_aggs/infos/1?pretty { "title":"test class 01", "price": 20, "desc": ["good","very","handsome"] } POST /test_aggs/infos/2?pretty { "title":"tes...

数据与算法架构提升之路专栏 5678

Elasticsearch7.x DSL语法之聚合查询

1.前言 聚合查询是开发中常见的场景,一般包含。求和、最大值、最小值、平均值、总记录数等。 注意事项:text类型是不支持聚合的。 1.1.初始测试数据 学习SQL中常用的案例,老师信息表 字段信息:name(姓名) | age(年龄) | job(工作岗位) | sex(性别1-男,2-女) | salary(薪资) #老师信息 #注:每个岗位都是神圣的,以下测试数据,纯属虚构,仅测试需要 PUT /teacher_info/_bulk { "index" : { "_id" : "101" } } {

程序员小强的博客 9409

Elasticsearch 7.X 聚合查询 及 ElasticsearchRestTemplate 操作

Elasticsearch 7.X 聚合查询

小毕超博客 4599
上一篇: ElasticSearch5.2.2 基本概念和集群配置详解
下一篇: Elasticsearch常用操作命令大全
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值