day77-全文检索-ElasticSearch-整合-测试复杂检索

Elasticsearch源码(二):scroll原理 问题 scroll查询指定_doc排序要比不指定sort或者指定某个字段sort要快很多。 scroll查询每次依然要进行collect及计算打分,并非是第一次查询之后会缓存命中结果。 源码分析 首先看一下Elasticsearch的Collector,主要以下几个 这里主要介绍一下TopDocsCollector,TopDocsCollector类在收集完文档后,会返回一个TopDocs对象。TopDocs对象是收集后的文档信息按照某种规则有序的存放在TopDocs对象中,该对象是搜索结果的返回值。 阅读详情

1.本文主要参考链接

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-search.html

2.代码

    @Test
    public  void searchData() throws IOException {
//        SearchRequest searchRequest = new SearchRequest();
//        searchRequest.indices("users");
        //创建执行请求并指定索引
        SearchRequest searchRequest = new SearchRequest("bank");

        //指定DSL检索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchRequest.source(searchSourceBuilder);


        //添加聚合
        TermsAggregationBuilder countGender = AggregationBuilders.terms("countGender").field("gender.keyword").size(10);
        AvgAggregationBuilder avgAge = AggregationBuilders.avg("avgAge").field("age");

        searchSourceBuilder.aggregation(countGender);
        searchSourceBuilder.aggregation(avgAge);

        //执行检索
        SearchResponse searchResponse =  client.search(searchRequest, ElasticConfiguration.COMMON_OPTIONS);

        //响应
        System.out.println("searchResponse:"+searchResponse);

        //分析结果
        //检索状态
        RestStatus status = searchResponse.status();
        //花费时间
        TimeValue took = searchResponse.getTook();

        //是否未检索完就提前终止
        Boolean terminatedEarly = searchResponse.isTerminatedEarly();
        //是否超时
        boolean timedOut = searchResponse.isTimedOut();

        //命中记录对象
        SearchHits hits = searchResponse.getHits();
        //命中记录数
        TotalHits totalHits = hits.getTotalHits();
        long numHits = totalHits.value;
        //最大相关性得分
        TotalHits.Relation relation = totalHits.relation;
        float maxScore = hits.getMaxScore();

        //获取记录数
        SearchHit[] searchHits = hits.getHits();
        List<BankEntity> bankEntityList  = new ArrayList<>();
        for (SearchHit hit : searchHits) {
            String sourceAsString = hit.getSourceAsString();
            BankEntity bankEntity = JSON.parseObject(sourceAsString, BankEntity.class);
            bankEntityList.add(bankEntity);
        }
        System.out.println("bankEntityList:"+bankEntityList);

    }

上面的BankEntity是通过https://www.bejson.com/json2javapojo/new/   根据source内的json串生成的

3.控制台打印结果 

如下为searchResponse 可以从中看到花费时间,是否超时,分片信息,记录详情

searchResponse: {
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1000,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [{
            "_index": "bank",
            "_type": "account",
            "_id": "1",
            "_score": 1.0,
            "_source": {
                "account_number": 1,
                "balance": 39225,
                "firstname": "Amber",
                "lastname": "Duke",
                "age": 32,
                "gender": "M",
                "address": "880 Holmes Lane",
                "employer": "Pyrami",
                "email": "amberduke@pyrami.com",
                "city": "Brogan",
                "state": "IL"
            }
        }, {
            "_index": "bank",
            "_type": "account",
            "_id": "6",
            "_score": 1.0,
            "_source": {
                "account_number": 6,
                "balance": 5686,
                "firstname": "Hattie",
                "lastname": "Bond",
                "age": 36,
                "gender": "M",
                "address": "671 Bristol Street",
                "employer": "Netagy",
                "email": "hattiebond@netagy.com",
                "city": "Dante",
                "state": "TN"
            }
        }, {
            "_index": "bank",
            "_type": "account",
            "_id": "13",
            "_score": 1.0,
            "_source": {
                "account_number": 13,
                "balance": 32838,
                "firstname": "Nanette",
                "lastname": "Bates",
                "age": 28,
                "gender": "F",
                "address": "789 Madison Street",
                "employer": "Quility",
                "email": "nanettebates@quility.com",
                "city": "Nogal",
                "state": "VA"
            }
        }, {
            "_index": "bank",
            "_type": "account",
            "_id": "18",
            "_score": 1.0,
            "_source": {
                "account_number": 18,
                "balance": 4180,
                "firstname": "Dale",
                "lastname": "Adams",
                "age": 33,
                "gender": "M",
                "address": "467 Hutchinson Court",
                "employer": "Boink",
                "email": "daleadams@boink.com",
                "city": "Orick",
                "state": "MD"
            }
        }, {
            "_index": "bank",
            "_type": "account",
            "_id": "20",
            "_score": 1.0,
            "_source": {
                "account_number": 20,
                "balance": 16418,
                "firstname": "Elinor",
                "lastname": "Ratliff",
                "age": 36,
                "gender": "M",
                "address": "282 Kings Place",
                "employer": "Scentric",
                "email": "elinorratliff@scentric.com",
                "city": "Ribera",
                "state": "WA"
            }
        }, {
            "_index": "bank",
            "_type": "account",
            "_id": "25",
            "_score": 1.0,
            "_source": {
                "account_number": 25,
                "balance": 40540,
                "firstname": "Virginia",
                "lastname": "Ayala",
                "age": 39,
                "gender": "F",
                "address": "171 Putnam Avenue",
                "employer": "Filodyne",
                "email": "virginiaayala@filodyne.com",
                "city": "Nicholson",
                "state": "PA"
            }
        }, {
            "_index": "bank",
            "_type": "account",
            "_id": "32",
            "_score": 1.0,
            "_source": {
                "account_number": 32,
                "balance": 48086,
                "firstname": "Dillard",
                "lastname": "Mcpherson",
                "age": 34,
                "gender": "F",
                "address": "702 Quentin Street",
                "employer": "Quailcom",
                "email": "dillardmcpherson@quailcom.com",
                "city": "Veguita",
                "state": "IN"
            }
        }, {
            "_index": "bank",
            "_type": "account",
            "_id": "37",
            "_score": 1.0,
            "_source": {
                "account_number": 37,
                "balance": 18612,
                "firstname": "Mcgee",
                "lastname": "Mooney",
                "age": 39,
                "gender": "M",
                "address": "826 Fillmore Place",
                "employer": "Reversus",
                "email": "mcgeemooney@reversus.com",
                "city": "Tooleville",
                "state": "OK"
            }
        }, {
            "_index": "bank",
            "_type": "account",
            "_id": "44",
            "_score": 1.0,
            "_source": {
                "account_number": 44,
                "balance": 34487,
                "firstname": "Aurelia",
                "lastname": "Harding",
                "age": 37,
                "gender": "M",
                "address": "502 Baycliff Terrace",
                "employer": "Orbalix",
                "email": "aureliaharding@orbalix.com",
                "city": "Yardville",
                "state": "DE"
            }
        }, {
            "_index": "bank",
            "_type": "account",
            "_id": "49",
            "_score": 1.0,
            "_source": {
                "account_number": 49,
                "balance": 29104,
                "firstname": "Fulton",
                "lastname": "Holt",
                "age": 23,
                "gender": "F",
                "address": "451 Humboldt Street",
                "employer": "Anocha",
                "email": "fultonholt@anocha.com",
                "city": "Sunriver",
                "state": "RI"
            }
        }]
    },
    "aggregations": {
        "avg#avgAge": {
            "value": 30.171
        },
        "sterms#countGender": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [{
                "key": "M",
                "doc_count": 507
            }, {
                "key": "F",
                "doc_count": 493
            }]
        }
    }
}

可以看到  获取到的source内的hit对象们成功封装到对象数组内

bankEntityList:[BankEntity(account_number=1, balance=39225, firstname=Amber, lastname=Duke, age=32, gender=M, address=880 Holmes Lane, employer=Pyrami, email=amberduke@pyrami.com, city=Brogan, state=IL), BankEntity(account_number=6, balance=5686, firstname=Hattie, lastname=Bond, age=36, gender=M, address=671 Bristol Street, employer=Netagy, email=hattiebond@netagy.com, city=Dante, state=TN), BankEntity(account_number=13, balance=32838, firstname=Nanette, lastname=Bates, age=28, gender=F, address=789 Madison Street, employer=Quility, email=nanettebates@quility.com, city=Nogal, state=VA), BankEntity(account_number=18, balance=4180, firstname=Dale, lastname=Adams, age=33, gender=M, address=467 Hutchinson Court, employer=Boink, email=daleadams@boink.com, city=Orick, state=MD), BankEntity(account_number=20, balance=16418, firstname=Elinor, lastname=Ratliff, age=36, gender=M, address=282 Kings Place, employer=Scentric, email=elinorratliff@scentric.com, city=Ribera, state=WA), BankEntity(account_number=25, balance=40540, firstname=Virginia, lastname=Ayala, age=39, gender=F, address=171 Putnam Avenue, employer=Filodyne, email=virginiaayala@filodyne.com, city=Nicholson, state=PA), BankEntity(account_number=32, balance=48086, firstname=Dillard, lastname=Mcpherson, age=34, gender=F, address=702 Quentin Street, employer=Quailcom, email=dillardmcpherson@quailcom.com, city=Veguita, state=IN), BankEntity(account_number=37, balance=18612, firstname=Mcgee, lastname=Mooney, age=39, gender=M, address=826 Fillmore Place, employer=Reversus, email=mcgeemooney@reversus.com, city=Tooleville, state=OK), BankEntity(account_number=44, balance=34487, firstname=Aurelia, lastname=Harding, age=37, gender=M, address=502 Baycliff Terrace, employer=Orbalix, email=aureliaharding@orbalix.com, city=Yardville, state=DE), BankEntity(account_number=49, balance=29104, firstname=Fulton, lastname=Holt, age=23, gender=F, address=451 Humboldt Street, employer=Anocha, email=fultonholt@anocha.com, city=Sunriver, state=RI)]
 

ES_记一次分页查询(getHits().getTotalHits() 获取总条目)为0的问题 文章目录问题描述问题原因解决办法查找总结 问题描述 ES分页查询的代码如下: SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT); long totalNum = searchResponse.getHits().getTotalHits(); //返回的是l... 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第八十六篇 各类应用上云计算 01

数字孪生:核心是实时性不等式(Δ<Δt)与带宽-精度权衡。数学上归结为带约束的非线性优化。预测性维护:从物理退化方程(Paris 定律)出发,结合贝叶斯推断,云端训练用深度时序模型,边缘推理用轻量模型。机器人协同:本质是多商品流 + 动态障碍物,需用图论(冲突检测)+ 最优控制(轨迹平滑)。工业视觉:延迟由四个环节组成,需用排队论分析流水线瓶颈,量化感知是降低延迟的关键。液压/气动系统上云(涉及流体力学、热力学、控制)机械臂力控/阻抗控制上云(涉及动力学、力/位混合控制)

weixin_49199313的博客 201

springboot集成elasticsearch 8.0以上版本

【代码】springboot集成elasticsearch 8.0以上版本。

qq_36594703的博客 676

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 12 公有云里的“多Region + 多AZ“ 02 运营算法01

算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)云厂商提高闲置资源利用率。算法复杂度为O(N),N为实例数量。

weixin_49199313的博客 282

ES查询时,通过response.getHits().getTotalHits()获取总条目结果始终为0

ES客户端与服务端版本

hdn_kb的博客 7305

【信息科学与工程学】计算机科学与技术——第七十七篇 系统架构设计02

编号类型模型配方企业资本运作的方法/规则/条件/依据及所有的步骤(​风险处理/异常处理/危机应对关联知识法律法规和裁决依据​​由发起人(通常是知名投资人、投行或产业资本)先设立一个只有现金、无实际业务的特殊目的收购公司(SPAC),通过IPO募集资金并在交易所上市。然后在规定时间内(通常24个月)寻找一家非上市公司进行合并(De-SPAC),使目标公司迅速实现上市,规避传统IPO的复杂流程和不确定性。1.:在开曼或特拉华注册空壳公司,注入少量种子资金。2.

weixin_49199313的博客 313

java连接elasticsearch将搜索结果高亮显示并分页。

java连接elasticsearch实现全文检索,并且高亮显示结果,实现分页。项目基于elasticsearch5.6.1可根据自己实际情况调整版本。最近项目需要所以学习了一下,项目很简单可以根据你的实际情况更改接口。我本地的搜索是可以拼音和分词(需要插件可以看我另一个资源),你们搜索的时候可以先将elasticsearch配置完善,java使用的时候会顺心很多。

es查询-统计总数以及深度分页

如果你的业务需求在超过 10000 这个阈值之后就不需要精准的计算的话,就不需要设置该值,毕竟匹配大量的文档是一个成本较高的操作,同样的如果你并不需要统计数量,那么将该值设置为 false "track_total_hits": false 也是一种优化检索效率的操作。根据官方文档的说法,scroll的搜索上下文会在scroll的保留时间截止后自动清除,但是我们知道scroll是非常消耗资源的,所以一个建议就是当不需要了scroll数据的时候,尽可能快的把scroll_id显式删除掉。

jggnice的博客 1940

ST-Link使用教程

关于使用ST-Link烧录.hex文件教程。以及报错解决!适合刷ARM,使用STM32的教程!

qq_42977675的博客 1万+

Elasticsearch 查询10000条限制与totalhits值最大10000的解决

今天测试写的ES查询接口发现total值最大为10000,而且查询出的值也只有10000条多一条就报错,那怎么能行呢,必须的全查出来,于是根据报错进行了以下操作 然后进行了测试发现查询出的数据条数限制已经没有了,但是获取到的totalHits值还是10000,这样可不行,在进行了资料检索(百度)之后发现之前有人遇到过而且已经解决了,并且有源码的具体对应方法的截图 参考链接:https://ela...

weixin_43876919的博客 1万+

数字设计实验:RISC-V指令单周期CPU

本文旨在介绍RISC-V指令单周期CPU的设计思路和仿真实现(含代码)

2401_83740084的博客 2713

802.11ax 的OFDMA资源分配详解

802.11ax 引入的最重要的技术就是OFDMA。OFDMA中引入了RU(资源块)概念,也就是20Mhz/40Mhz/80Mhz/160Mhz的带宽可以切割成不同尺寸的RU,分配给不同的用户使用,这样就大大提高了频谱资源的利用率。 常见的RU尺寸有26/52/102/242/484/996,单位是子载波,每个子载波是78.125Khz,这样20Mhz的带宽可以划分为如下图所示的不同RU大小。 按照11ax规范的要求,上下行的数据传输都可以由AP来统一调度,这样上下行的OFDM...

weixin_43408952的博客 1万+

elasticsearch篇:RestClient查询

实体类有两个,一个是前端的请求参数实体,一个是服务端应该返回的响应结果实体。1)请求参数"key": "搜索关键字","page": 1,"size": 3,因此,我们在@Data2)返回值total:总条数:当前页的数据因此,我们在@Data定义一个HotelController,声明查询接口,满足下列要求:请求方式:Post请求路径:/hotel/list请求参数:对象,类型为RequestParam返回值:PageResult,包含两个属性。

viperd的博客 3134

ITK-snap医学图像标注方法(超级详细)——保姆级

医学3D图像标注方法,非常详细,保姆级

jialiyk的博客 3万+

Elasticsearch教程— Java API Client[8.6] 开发入门2(官方原版)

Elasticsearch Java API Client 使用指南

深圳市多克创新科技有限公司 3247

Oracle 11g RAC 节点通信故障排查与修复指南

本文详细介绍了Oracle 11g RAC集群发生节点通信故障时的系统性排查与修复方法。当出现节点异常重启时,核心问题往往源于心跳网络中断。文章提供了从快速诊断、日志分析到六层深度检查的完整指南,并给出了针对网络配置、内核参数及Oracle已知Bug等常见根因的实战解决方案,帮助DBA快速恢复集群稳定。

weixin_29246195的博客 273

VirtualBox 7.0.8 + Android-x86 9.0 保姆级安装教程(附图形界面卡顿解决方案)

本文提供VirtualBox 7.0.8与Android-x86 9.0的详细安装教程及性能优化方案,帮助开发者解决图形界面卡顿问题。从环境准备到高级配置,涵盖硬件要求、安装步骤、显存优化及ADB调试等实用技巧,显著提升虚拟机流畅度,适用于应用测试和开发调试。

weixin_29224309的博客 524

ElasticSearch入门安装与SpringBoot集成实战

Elasticsearch 是一个实时分布式搜索和分析引擎,一般用于全文搜索、结构化搜索,分析或者三者混用。 它的底层是基于Apache Lucene(TM)的开源搜索引擎,但是lucene只是一个库,需要java开发然后集成到应用。 修改config/elasticsearch.yml windows安装 启动 https://github.com/mobz/elasticsearch-head 下载解压。安装node8+ cd根目录, https://blog.youkuaiyun.com/qq_34254090

老徐的博客只有干货 1136

Halcon 3D点云匹配实战:从预处理到模板创建的完整流程(附代码)

本文详细介绍了Halcon在3D点云匹配中的实战应用,涵盖从预处理到模板创建的完整流程。通过代码示例和实用技巧,帮助开发者掌握点云采样、降噪、三角化等关键技术,并优化匹配参数以提高精度和效率。适用于工业检测、机器人引导等领域。

weixin_33670786的博客 433

重磅来袭!!!Elasticsearch7.14.1(ES 7.14.1)与Springboot2.5.4的整合

目录 1. 概述 2. Springboot 与Elasticsearch(ES)的版本对应问题 3.Elasticsearch(ES )与 Springboot 的整合 4. 综述 1. 概述 前面我们聊了 Elasticsearch(ES)集群的搭建,今天我们来聊一下,Elasticsearch(ES)集群如何与 Springboot 进行整合。 Elasticsearch(ES)集群的搭建可参见我的另一篇文章《Elasticsearch(ES)集群的搭建》。 Elastic...

追风人的博客 1115

Misc-RAR隐写

题目来自于:XCTF的SimpleRAR,由于涉及到许多新知识,所以写篇小文子记录一下。 一、下载完后是一个压缩包。 里面就有一个flag.txt,打开之后发现有一串字符是flag is not here,而且我们查看他的文件大小,只要十六字节,绝对不可能再藏着什么信息了。 然后把压缩包拉到010editor里面,发现一下子出来好多新的内容,很明显是有夹杂着的附加文件。 二、rar文件头信息。 rar 是由一个一个 block 组成的,每个 block 有以下几个部分 ...

admin的博客 1361

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ES升级后_分页查询getHits().getTotalHits() 获取总条目一直为0的问题

如果改造不是很大,建议ES client版本随着ES升级,简单粗暴。另外,高版本的ES无法升级解决时,可以使用参数来让totalHits字段,仍然以int格式返回(即:使用es client 6.8以上版本)。ES更新很快,一定要注意版本问题带来的坑,最好让集群和客户端使用官方推荐的匹配版本。

qq_31107685的博客 2089

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ElasticsearchRestTemplate totalhits 测试

测试的目的: 想确认用ElasticsearchRestTemplate search的时候每次最大的返回值数量是多少. 测试场景1: 默认es最大返回值为10000, 取5000个数据,结论 命中>=10000, 实际获取数量5000个 2. 测试场景2: 默认es max_result_windows = 10000, 获取15000个数据. 结论: 直接报错:Result window is too large, from + size must be less than or..

点点滴滴 943

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Elasticsearch:如何在搜索时得到精确的总 hits 数

从Elasticsearch 7.0之后,为了提高搜索的性能,在hits字段中返回的文档数有时不是最精确的数值。Elasticsearch限制了最多的数值为10000。 当文档的数值大于10000时,返回的total数值为10000,并在relation中指出gte。 我们可以做如下的一个实验。启动Kibana: 然后选中“Add data”: 这样我们就把Sample ...

Elastic 中国社区官方博客 9622

错误解决:ElasticSearch SearchResponse的Hits[]总是比totalHits少一条记录

错误解决:ElasticSearch SearchResponse的Hits[]总是比totalHits少一条记录

1544

Elasticsearch:使用最新的 Elasticsearch Java client 8.0 来创建索引并搜索

这篇文章,我来详细地描述如何使用最新的 Elasticsearch Java client 8.0 来创建索引并进行搜索。最新的 Elasticsearch Java client API 和之前的不同。在之前的一些教程中,我们使用 High Level API来进行操作。在官方文档中,已经显示为 deprecated。 前提条件 Java 8 及以后的版本 一个 JSON 对象映射库,允许你的应用程序类与 Elasticsearch API 无缝集成。 Java 客户端支持 Jackson 或像

Elastic 中国社区官方博客 1万+

深入理解查准率与查全率

欢迎关注鄙人公众号,技术干货随时看! 查准率与查全率(召回率)是在信息检索与机器学习领域常用的衡量指标,书籍或网络上有非常多的定义,敝人在重温周志华先生《机器学习》一书时,发现书中的定义是非常科学的,而且把这两个指标根据混淆矩阵进行了数学化! 在信息检索领域的定义:检索出的n个文档中正确结果(m个结果是正确的)的比率即是查准率,即p=n/m;假设在所有的数据中正确结果有n个,一次检索...

zhaojianting的博客 2万+
上一篇: day76-全文检索-ElasticSearch-整合-测试保存
下一篇: 根据json字符串自动生成对应java实体类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我才是真的封不觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值