数据库修仙化神篇四——搭建自己的搜索引擎

搜索引擎项目索引构建(二) 系统性的讲解项目创建的各种细节 阅读详情

搭建自己的搜索引擎——oh-my-search使用

使用elasticsearch和search-ui搭建自己的搜索引擎,快速查找资源和文件。如果对代码感兴趣,相关代码已在github上开源,欢迎fork代码。

搭建elasticsearch

先搭建eleasticsearch再搭建kibana

搭建elasticsearch
mkdir elasticsarch
cd elasticsarch
mkdir -p /es/plugins
mkdir -p /es/data
mkdir -p /es/logs
mkdir -p /es/config
vim docker-compose.yml

编辑docker-compose.yml文件,内容如下:

version: '3'
services:
  elasticsearch:
    image: elasticsearch:8.9.0
    container_name: elasticsearch
    privileged: true
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms512m -Xmx1096m" #设置使用jvm内存大小
      - bootstrap.memory_lock=true
    volumes:
      - ./es/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - ./es/data:/usr/share/elasticsearch/data:rw #数据文件挂载
      - ./es/logs:/usr/share/elasticsearch/logs:rw
      - ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 9200:9200
      - 9300:9300
    deploy:
     resources:
        limits:
           cpus: "2"
           memory: 1000M
        reservations:
           memory: 200M

其中./es/config/elasticsearch.yml的内容如下,可按需修改:

cluster.name: "elasticsearch"
network.host: 0.0.0.0
  • 启动elasticsearch

配置完成后,启动elasticsearch。

docker-compose --compatibility up -d

同时进入elasticsearch容器内部,修改密码。

# 进入容器内部
docker exec -it elasticsearch bash
# 修改密码
elasticsearch@4c37fcfb6f13:~$ ls
LICENSE.txt  NOTICE.txt  README.asciidoc  bin  config  data  jdk  lib  logs  modules  plugins
elasticsearch@4c37fcfb6f13:~$ bin/elasticsearch-reset-password --username elastic -i
bin/elasticsearch-reset-password --username kibana -i
搭建kibana
mkdir kibana
cd kibana
vim docker-compose.yml

docker-compose.yml的内容如下:

version: '3'
services:
  kibana:
    image: kibana:8.9.0
    container_name: kibana
    volumes:
      - ./kibana.yml:/usr/share/kibana/config/kibana.yml
    ports:
      - 5601:5601
    deploy:
     resources:
        limits:
           cpus: "1"
           memory: 1000M
        reservations:
           memory: 200M

kibana.yml的文件内容如下,可按需修改:

elasticsearch.hosts: http://elasticsearch:9200
elasticsearch.username: kibana
elasticsearch.password: kibana
server.host: "0.0.0.0"
server.name: kibana
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: zh-CN

启动kibana,

docker-compose --compatibility up -d

同时搭建eleasticsearch和kibana

  • 使用docker-compose启动elasticsearch

编辑docker-compose.yml文件,内容如下:

version: '3'
services:
  elasticsearch:
    image: elasticsearch:8.9.0
    container_name: elasticsearch
    privileged: true
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms512m -Xmx1096m" #设置使用jvm内存大小
      - bootstrap.memory_lock=true
    volumes:
      - ./es/plugins:/usr/local/dockercompose/elasticsearch/plugins #插件文件挂载
      - ./es/data:/usr/local/dockercompose/elasticsearch/data:rw #数据文件挂载
      - ./es/logs:/usr/local/dockercompose/elasticsearch/logs:rw
    ports:
      - 9200:9200
      - 9300:9300
    deploy:
     resources:
        limits:
           cpus: "2"
           memory: 1000M
        reservations:
           memory: 200M
  kibana:
    image: kibana:8.9.0
    container_name: kibana
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    volumes:
      - ./es/config/kibana:/usr/share/kibana/config/kibana.yaml
    ports:
      - 5601:5601

其中kibana.yaml的内容如下:

elasticsearch.hosts: http://elasticsearch:9200
server.host: "0.0.0.0"
server.name: kibana
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: zh-CN
  • 进入elasticsearch终端,修改elasticsearch密码
# 进入容器内部
docker exec -it elasticsearch bash
# 修改密码
elasticsearch@4c37fcfb6f13:~$ ls
LICENSE.txt  NOTICE.txt  README.asciidoc  bin  config  data  jdk  lib  logs  modules  plugins
elasticsearch@4c37fcfb6f13:~$ bin/elasticsearch-reset-password --username elastic -i
WARNING: Owner of file [/usr/share/elasticsearch/config/users] used to be [root], but now is [elasticsearch]
WARNING: Owner of file [/usr/share/elasticsearch/config/users_roles] used to be [root], but now is [elasticsearch]
This tool will reset the password of the [elastic] user.
You will be prompted to enter the password.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]: 
Re-enter password for [elastic]: 
Password for the [elastic] user successfully reset.
elasticsearch@4c37fcfb6f13:~$
  • 生成kibana的token
# 重启容器然后进入容器内部生成kibana的token
docker exec -it elasticsearch bash
elasticsearch@4c37fcfb6f13:~$ bin/elasticsearch-create-enrollment-token -s kibana
  • 获取kibana验证码
# 在浏览器打开http://ip:5601,粘贴kibana的token,然后进入kibana容器内部获取验证码
sudo docker exec -it kibana bash       
kibana@fce2ab8aec1e:~$ ls
LICENSE.txt  NOTICE.txt  README.txt  bin  config  data  logs  node  node_modules  package.json  packages  plugins  src  x-pack
kibana@fce2ab8aec1e:~$ bin/kibana-verification-code 
Your verification code is:  042 943 

搭建search-ui

  • 创建search-ui项目
npm install -g  create-react-app
# 创建名为doc_index的项目
create-react-app doc_index --use-npm
cd doc_index
npm install --save @elastic/react-search-ui @elastic/search-ui-app-search-connector @elastic/search-ui-elasticsearch-connector
  • 启动search-ui项目
npm start
  • 创建api_key

登录kibana,进入到/app/management/security/api_keys/,创建一个api_key并记录api_key.

  • 创建索引

登录kibana的dev_tools创建和设置索引:

# 创建索引
PUT /doc_index

# 设置索引属性
PUT /doc_index/_mapping
{
  "properties":{
    "title":{
      "type":"text",
      "fields":{
        "suggest": {
          "type": "search_as_you_type"
        }
      }
    },
    "category":{
      "type":"text"
    },
    "url":{
      "type":"text"
    }
  }
}

# 设置查询返回的最大条数
PUT /doc_index/_settings
{
  "index" : {
    "max_result_window": 500000
  }
}
  • 导入数据
# 插入单条数据
POST /doc_index/_bulk
{"index":{}}
{"title":"test","category":"test","url":"http://localhost:3000"}

## 批量插入
POST /doc_index/_bulk
{"index":{}}
{"title":"test2","category":"test","url":"http://localhost:3001"}
{"index":{}}
{"title":"dir","category":"test","url":"http://localhost:3002"}
{"index":{}}
{"title":"ddssd","category":"test","url":"http://localhost:3003"}
{"index":{}}
{"title":"测试","category":"test","url":"http://localhost:3004"}

当然也可以用命令行插入,如使用curl命令:

curl --username username:password -H "Content-Type: application/json" -XPOST  192.168.56.130:9200/bank/account/_bulk?pretty --data-binary "@test.json"

其中–username指定elasticsearch的用户名和密码,test.json的内容如下:

{"index":{}}
{"title":"test2","category":"test","url":"http://localhost:3001"}
{"index":{}}
{"title":"dir","category":"test","url":"http://localhost:3002"}
{"index":{}}
{"title":"ddssd","category":"test","url":"http://localhost:3003"}
{"index":{}}
{"title":"测试","category":"test","url":"http://localhost:3004"}

完整数据插入命令如下:


PUT /doc_index/_mapping
{
  "properties":{
    "title":{
      "type":"text",
      "fields":{
        "suggest": {
          "type": "search_as_you_type"
        }
      }
    },
    "category":{
      "type":"text"
    },
    "url":{
      "type":"text"
    }
  }
}

PUT /doc_index/_settings
{
  "index" : {
    "max_result_window": 500000
  }
}

GET /doc_index/_search

POST /doc_index/_bulk
{"index":{}}
{"title":"test2","category":"test","url":"http://localhost:3001"}
{"index":{}}
{"title":"dir","category":"test","url":"http://localhost:3002"}
{"index":{}}
{"title":"ddssd","category":"test","url":"http://localhost:3003"}
{"index":{}}
{"title":"测试","category":"test","url":"http://localhost:3004"}

完善search-ui

search-ui下载下来之后,还没有绑定数据,此时还需要修改app.js来进行适配。

app.js需更改成:

// Step #1, import statements
import React from "react";
// 这里需要注意app和网页的接口名称不一样
import ElasticsearchAPIConnector from "@elastic/search-ui-elasticsearch-connector";
import {
  PagingInfo,
  ResultsPerPage,
  Paging,
  SearchProvider,
  Results,
  SearchBox,
  Sorting
} from "@elastic/react-search-ui";
import { Layout } from "@elastic/react-search-ui-views";
import "@elastic/react-search-ui-views/lib/styles/styles.css";

// Step #2, The connector
const connector = new ElasticsearchAPIConnector({
  host: "http://elasticsearch:9200", // elasticsearch的地址
  apiKey: "WjUxNVpZc0JTb3pYN2J6cEdqRHQ6R3Y0all0R1dTai1LSjhqMGc5THFVdw==", // elasticsearch 的登录秘钥,在kibana上生成
  index: "doc_index" // 要访问的索引的地址
});
 
// Step #3: Configuration options
const configurationOptions = {
  searchQuery: {
    search_fields: {
      title: {
        weight: 3
      },
      url: {},
      category: {}
    },
    result_fields: {
      title: {
        snippet: {}
      },
      url: {
        snippet: {}
      },
      category: {
        snippet: {}
      }
    }
  },
  apiConnector: connector,
  alwaysSearchOnInitialLoad: true
};

// step4 show result 
export default function App() {
  return (
    <SearchProvider config={configurationOptions}>
      <div className="App">
        <Layout
          header={<SearchBox />}
          // 要展示的标题和标题对应的连接
          bodyContent={<Results titleField="title" urlField="url" />}
          bodyHeader={
            <>
              <PagingInfo />
              <ResultsPerPage />
            </>
          }
          bodyFooter={<Paging />}
        />
      </div>
    </SearchProvider>
  );
}

还可以修改一下public下面的title标签,修改成自己的项目标签。如:

<title>doc_index</title>
Unity-Chan Toon Shader卡通渲染学习 2.0 (UTS2)是一款用于图像和视频的卡通着色器,旨在满足从事卡通着色 3DCG 动画的创作者的需求。二、从0-1复刻UTS21.漫反射UTS2的漫反射部分主要有三个层组成,分别是基本颜色、第一阴影色和第二阴影色,分别对应着美术理论中的白、灰、黑。 阅读详情

相关推荐

保姆级教程:用Docker快速部署mpromonet/webrtc-streamer实现WebRTC直播(附常见问题解决)

本文提供了一份详细的Docker部署mpromonet/webrtc-streamer的实战指南,帮助用户快速搭建WebRTC直播服务。内容涵盖从环境准备、基础部署到进阶配置与性能调优的全过程,并针对容器网络、视频流配置、跨网访问等常见问题提供了解决方案,旨在实现低延迟的流媒体传输。

dell8的博客 177

手动写一个搜索引擎(超详细)

搜索引擎是现代设备中被广泛利用的一种系统软件,诸如百度、谷歌、搜索、bing等,或者抖音、快手、b站、小红书,甚至软件应用市场,Windows(操作系统)中的各类提供搜索功能的背后都有搜索引擎的影子。

weixin_61567666的博客 1万+

LabVIEW专栏九、类的继承与多态实践

本文深入探讨了LabVIEW中面向对象编程的核心概念——类的继承与多态。通过构建仪器参数父类与设备基类,并以网口设备为例创建子类,详细演示了如何利用继承实现代码复用,并通过多态机制实现统一接口调用不同仪器类型,从而构建灵活、可扩展的自动化测试与仪器控制系统。

weixin_29235525的博客 251

ELK - docker

版本:ELK 8.0.1 一、安装elasticsearch:8.0.1 https://hub.docker.com/_/elasticsearch docker pull elasticsearch:8.0.1 docker images docker network create elknetwork #创建自定义的网络(用于连接到连接到同一网络的其他服务 docker run -d --name elasticsearch --net elknetwork -p 9200:9200 -p 93

疯飙的蜗牛 3674

电脑主板开机12步流程全解析:从按下电源键到BIOS启动的完整过程

本文深入解析了电脑主板从按下电源键到BIOS启动的完整12步流程,详细阐述了待机电路、主供电上电、CPU供电建立、时钟信号分发及复位链等关键硬件协同工作原理。通过剖析电脑主板的电路结构与芯片协作时序,帮助读者构建系统性的硬件故障诊断思维,精准定位开机故障。

weixin_29290963的博客 269

Claude Skills 深度讲解

阶段 1:Function Call(2023)├─ 大模型可以调用外部工具├─ 问题:缺乏对任务的深度理解└─ 局限:工具调用简单线性阶段 2:MCP 上下文工程(2024)├─ 大模型有了更丰富的上下文和工具├─ 问题:仍然需要手动编写复杂的 Prompt└─ 局限:每次对话都需要重新加载上下文阶段 3:Claude Skills(2025)├─ 大模型有了「能力模块」的概念├─ 可以动态加载、组合、执行专门的工作流├─ 真正实现了「知识的模块化和复用」

u013134676的博客 1465

docker项目-搭建个人搜索引擎SearXNG

SearXNG是一个免费的互联网元搜索引擎,它汇总了来自更多 超过 70 个搜索服务。

ltong3155的专栏 1万+

从 Chat 提示词到可运行 Fiori 应用,ADT for VS Code 正在把 RAP 开发带进 Agent 时代

本文探讨了在VS Code中使用AI辅助进行ABAP RAP开发的新模式。文章指出,传统RAP开发需要手工创建数据库表、CDS视图、行为定义等十多个关联对象,命名和关联关系容易出错。现在通过GitHub Copilot Agent Mode配合ADT MCP Server,开发者可用自然语言描述业务场景直接生成完整的RAP业务对象。这种生成式开发的核心价值在于:1)通过标准化工具接口(MCP)连接ABAP后端,确保生成符合规范的RAP对象;2)能正确处理多实体组合场景下的命名一致性和关联关系;3)保持生成结

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 89

【造轮子】从零开始搭建一个搜索引擎,数据结构和架构实现

文章目录1 前端 & 用户界面2 服务层 & 功能实现3 数据层 & 考虑持久化 1 前端 & 用户界面 最终效果 参考Baidu & Google的界面 关于功能 需要实现的内容有 (4) 搜索框+结果列表+关键词推荐+页面跳转 关键词直接调用专属API返回的JSON 结果列表和页面跳转,考虑在调用API中引入参数第x页,返回1~20条,21~40条的内容。 不理解的功能? 支持纯文本信息的存储? 存储什么信息呢,是否是用户检索了xx信息,点击了y

小哈里的博客 2901

KEPServerEX 6 之 EX 6.11.718.0 发布说明

KEPServerEX 6.11.718.0 发布说明

-雲飛兄-博客 2882

SO_KEEPALIVE、TCP_KEEPIDLE、TCP_KEEPINTVL、保活包

是一个套接字选项,用于设置是否启用 keepalive 机制。在这段代码中没有涉及到选项的设置。当被设置为非零值时,表示启用 keepalive 机制。keepalive 是一种用于检测连接是否仍然有效的机制。通过定期发送一些特定的探测数据,可以检测到网络连接的异常中断或对端应用程序的崩溃退出。为了避免以上情况,可以启用 keepalive 机制,即使在无数据传输的情况下也定期发送探测数据。如果在一定时间内没有收到对端的响应,就认为连接已经失效,并进行相应的处理。要启用选项,需要使用函数。其中,fd。

m0_46376834的博客 4817

Java修仙传之神奇的ES(基础使用)

ES是什么:一款强大的搜索引擎ES拓展:elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)kibana:可视化ES:搜索引起Logstash:数据抓取,数据同步ES为什么搜索快:核心:倒排索引ES的底层:Java语言的搜索引擎类库LuceneES的竞品:solr,splunk等什么是elasticsearch?一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能。

weixin_50914566的博客 932

人工智能技术基础系列之:迁移学习

作者:禅与计算机程序设计艺术 1.背景介绍 随着深度学习和神经网络的快速发展,越来越多的应用场景需要处理大量的数据和复杂的任务。然而,由于计算资源、存储空间等条件的限制,传统的人工智能方法往往不能满足实际需求。因此,为了提高效率和降低成本,研究人员提出了迁移学习的概念。本篇文章将详细介绍迁移学习的基

AI天才研究院 700

数据库修仙筑基篇四——zookeeper主备集群demo

使用zookeeper搭建主备集群,要求实现如下功能:搭建好zookeeper后,需要使用zookeeper 客户端来连接zookeeper,并在zookeeper中写入相关信息。

growdu的网络博客 693

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

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

传统数据库out啦!KINGBASE ES V9R1C10 开启国产数据库“修仙”新纪元!

比如说,有家企业升级信息化系统,要从 Oracle 换成国产数据库,因为 KingbaseES 对 Oracle 语法很熟悉,开发团队就改了改少量代码,系统就顺利迁移过去了,项目时间一下子缩短了不少。金仓数据库的代码都是自己写的,100% 自主,还通过了国家权威机构的严格认证,好几次通过中国信息安全测评中心、国家保密科技测评中心联合发布的《安全可靠测评结果》,还有国家信息安全产品认证、信息技术产品安全分级评估证书(EAL4+)这些资质。而且它的集群架构多样,企业业务发展了,能随时扩展。

程序边界 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

数据库修仙金丹篇四——vpp vector指北

vpp vector指北 版权声明:本文为优快云博主「成王君」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.youkuaiyun.com/weixin_45429253/article/details/97020110 vectors 的本质 外在表现 很简单,实际上就是一个动态的可变大小数组。这个数组: 每个元素的大小可以变化,数组大小可以变化。从而使得其可以作为任何数据结构的存储结构,事实上,VPP就是这样做的,所有数据结构的存储结构就是

growdu的网络博客 607

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数据库修仙秘境篇九——autoconf使用

autoconf使用

growdu的网络博客 1936

数据库修仙炼气篇二——postgresql基本操作与基本对象

postgresql是一个C/S架构的大型软件,提供数据存储索引和查询的功能。postgresql分为客户端和服务端,客户端叫作psql,或者其他语言基于odbc,jdbc,libpq开发的客户端程序,服务端叫作postgres,需要监听ip和端口,通过tcp网络协议与客户端进行通信。在网络通信之上,采用sql作为数据通信协议,支持增删改查。sql针对的是结构化数据,因而要先有数据结构,这里其实就是表。为了对表进行隔离,由将表划分到不同的数据库里。客户端和服务端通信需要验证,验证采用用户名和密码的方式。

growdu的网络博客 588

数据库修仙金丹篇十——vpp使用kni

vpp使用kni

growdu的网络博客 976

数据库修仙筑基篇九——corosync-qdevice详解

corosync-qdevice详解

growdu的网络博客 1324

《异步编程之美》— 全栈修仙《Java 8 CompletableFuture 对比 ES6 Promise 以及Spring @Async》

在平常开发过程中会遇到许多意想不到的坑,本篇文章就记录在开发过程中遇到一些常见的问题,看了许多博主的异步编程,我只能说一言难尽。在Promise返回给调用者的时候,操作往往还没有完成,但Promise对象可以让我们操作最终完成时对其进行处理(无论成功还是失败)Promise是现代JavaScript中异步编程的基础,是一个由异步函数返回的可以向我们指示当前操作所处的状态的对象。类似与前端Promise代表异步对象,类似Java中的CompletableFuture。

m0_68921558的博客 1060

ES聚合之Bucket聚合语法讲解

{“id”:2,“type”:“玄幻”,“name”:“诛仙前传:蛮荒行”,“words_num”:30,“chapter_num”:67,“completion_time”:“2020-09-01”,“author”:“萧鼎”,“prices”:23.12}{“id”:5,“type”:“武侠”,“name”:“神雕侠侣”,“words_num”:75,“chapter_num”:76,“completion_time”:“2000-01-01”,“author”:“金庸”,“prices”:32.8}

zl5186888的博客 775

数据库修仙金丹篇九——vlan使用指北

vlan使用指北 vlan详细内容请参考博客。 VLAN(Virtual Local Area Network)的中文名为"虚拟局域网"。 LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。 简单来说,同一个VLAN中的用户间通信就和在一个局域网内一样,同一个VLAN中的广播只有VLAN中的 成员才能听到,而不会传输到其他的VLAN中去,从而控制不必要的广播风暴的产生。同时, 若没有路由,不同VLAN之间不

growdu的网络博客 816

Elasticsearch语法知多少之基础语法

熟练使用ES基础语法,通过基础语法实现常见的业务功能。后续会在其他博文中补充高级语法,包括聚合、通配符,高亮等操作。

前者已逝,后者未至。 1446

ChromaDB实战:用Python打造游戏资源搜索引擎(附完整代码)

本文通过一个完整的实战案例,详细介绍了如何使用Python和ChromaDB向量数据库构建一个游戏资源搜索引擎。文章提供了从环境搭建、数据向量化存储,到实现语义搜索、个性化推荐和数据分析的完整代码,帮助开发者快速掌握基于语义相似度的搜索技术,解决传统关键词匹配的局限性。

tequila的博客 423

Elasticsearch语法知多少之mappings详解

了解mappings常用属性,通过设置mappings属性约束文档。本文介绍会一些常用的静态映射方法,包括:约束文档中字段的数量和名称,实现字段合并检索,字段禁止被搜索等。 了解部分settings属性,这些属性和mappings属性关联较大,官网文档也将这些属性和mapping放在一起分析,所以本文也会做一些案例讲解。............

前者已逝,后者未至。 2374
上一篇: 数据库修化神篇七——游标
下一篇: 数据库修化神篇二——使用flex和bison编写程序
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

我在数据库世界里修仙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值