国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Elasticsearch:使用 Elasticsearch 和 BERT 構(gòu)建搜索引擎 - TensorFlow

這篇具有很好參考價(jià)值的文章主要介紹了Elasticsearch:使用 Elasticsearch 和 BERT 構(gòu)建搜索引擎 - TensorFlow。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在本文中,我們使用預(yù)訓(xùn)練的 BERT 模型和 Elasticsearch 來構(gòu)建搜索引擎。 Elasticsearch 最近發(fā)布了帶有向量場(chǎng)的文本相似性(text similarity search with vector field)搜索。 另一方面,你可以使用 BERT 將文本轉(zhuǎn)換為固定長(zhǎng)度的向量。 因此,一旦我們將文檔通過 BERT 轉(zhuǎn)換為向量并存儲(chǔ)到 Elasticsearch 中,我們就可以使用 Elasticsearch 和 BERT 搜索相似的文檔。

這篇文章通過以下架構(gòu)實(shí)現(xiàn)了一個(gè)帶有 Elasticsearch 和 BERT 的搜索引擎。 在這里,我們使用 Docker 將整個(gè)系統(tǒng)分為三個(gè)部分:應(yīng)用程序、BERT 和 Elasticsearch。 目的是使擴(kuò)展每個(gè)服務(wù)更容易。

bert 搜索,Elasticsearch,Elastic,AI,搜索引擎,elasticsearch,bert,大數(shù)據(jù),全文檢索

?整個(gè)系統(tǒng)是在 docker-compose.yamlin 中編寫的,位于以下 GitHub 存儲(chǔ)庫(kù)中。 請(qǐng)查看存儲(chǔ)庫(kù):GitHub - liu-xiao-guo/bertsearch: Elasticsearch with BERT for advanced document search.

$ pwd
/Users/liuxg/python/bertsearch
$ tree -L 3
.
├── LICENSE
├── README.md
├── bertserving
│?? ├── Dockerfile
│?? └── entrypoint.sh
├── docker-compose.yaml
├── docs
│?? ├── architecture.png
│?? ├── diagram.key
│?? └── example.png
├── example
│?? ├── __init__.py
│?? ├── create_documents.py
│?? ├── create_index.py
│?? ├── example.csv
│?? ├── index.json
│?? ├── index_documents.py
│?? └── requirements.txt
└── web
    ├── Dockerfile
    ├── app.py
    ├── requirements.txt
    └── templates
        └── index.html

請(qǐng)注意:在本文的展示中,我使用 TensorFlow 來進(jìn)行展示。更對(duì)關(guān)于 Pytorch 的展示,請(qǐng)參閱我之前的文章 “Elastic:開發(fā)者上手指南” 中的 “NLP - 自然語言處理” 部分。另外,由于 TensorFlow 里的指令限制,該展示不支持 Apple chipset 的電腦。你需要在 Intel 運(yùn)行的機(jī)器上運(yùn)行。

這篇文章的計(jì)劃是:

  • 下載預(yù)訓(xùn)練的 BERT 模型
  • 設(shè)置環(huán)境變量
  • 啟動(dòng) Docker 容器
  • 創(chuàng)建 Elasticsearch 索引
  • 創(chuàng)建文件
  • 索引文件

安裝

你需要安裝好自己的 Docker 環(huán)境。你需要安裝自己的 Python。需要在版本 3.0 及以上。另外,為了能夠讓項(xiàng)目里的 Python 能夠正常運(yùn)行,你需要按照如下的命令來安裝如下的庫(kù):

pip install bert_serving_server
pip install bert_serving_client

你需要確保這里安裝的庫(kù)和 docker-compose.yml 里的所定義的庫(kù)的版本是一致的。

web/requirements.txt

bert-serving-client==1.10.0
elasticsearch==8.6.1
Flask==2.2.2

bertserving/Dockerfile

FROM tensorflow/tensorflow:1.12.0-py3
RUN pip install -U pip
RUN pip install --no-cache-dir bert-serving-server==1.10.0
COPY ./ /app
COPY ./entrypoint.sh /app
WORKDIR /app
ENTRYPOINT ["/app/entrypoint.sh"]
CMD []

example/requirements.txt

bert-serving-client==1.10.0
elasticsearch==7.0.4
pandas==0.25.1

如上所示,我們選擇的 bert-serving-client 及 bert-serving-server 的版本都是 1.10.0。

在本展示中,我將使用最新的 Elastic Stack 8.6.1 來進(jìn)行展示,但是在 Elasticsearch 的配置中,我不使用安全配置。

docker-compose.yml

version: '3.9'
services:
  web:
    build: ./web
    ports:
      - "5100:5100"
    environment:
      - INDEX_NAME
    depends_on:
      - elasticsearch
      - bertserving
    networks:
      - elastic   
 
  elasticsearch:
    container_name: elasticsearch
    image: elasticsearch:8.6.1
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
      - xpack.security.enabled=false
    volumes:
      - es_data:/usr/share/elasticsearch/data
    ports:
       - target: 9200
         published: 9200
    networks:
      - elastic   
 
  kibana:
    container_name: kibana
    image: kibana:8.6.1
    ports:
      - target: 5601
        published: 5601
    depends_on:
      - elasticsearch
    networks:
      - elastic   
  bertserving:
    container_name: bertserving
    build: ./bertserving
    ports:
      - "5555:5555"
      - "5556:5556"
    environment:
      - PATH_MODEL=${PATH_MODEL}
    volumes:
      - "${PATH_MODEL}:/model"
    networks:
      - elastic
volumes:
  es_data:
    driver: local

networks:
  elastic:
    name: elastic
    driver: bridge   

下載 pre-trained BERT 模型

首先,下載預(yù)訓(xùn)練的 BERT 模型。 以下命令是下載英文模型的示例:

wget https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip
unzip cased_L-12_H-768_A-12.zip
$ pwd
/Users/liuxg/python/bertsearch
$ wget https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip
--2023-02-27 09:40:16--  https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip
Resolving storage.googleapis.com (storage.googleapis.com)... 142.251.36.16
Connecting to storage.googleapis.com (storage.googleapis.com)|142.251.36.16|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 404261442 (386M) [application/zip]
Saving to: ‘cased_L-12_H-768_A-12.zip’

cased_L-12_H-768_A- 100%[===================>] 385.53M  16.0MB/s    in 24s     

2023-02-27 09:40:41 (16.0 MB/s) - ‘cased_L-12_H-768_A-12.zip’ saved [404261442/404261442]

$ unzip cased_L-12_H-768_A-12.zip
Archive:  cased_L-12_H-768_A-12.zip
   creating: cased_L-12_H-768_A-12/
  inflating: cased_L-12_H-768_A-12/bert_model.ckpt.meta  
  inflating: cased_L-12_H-768_A-12/bert_model.ckpt.data-00000-of-00001  
  inflating: cased_L-12_H-768_A-12/vocab.txt  
  inflating: cased_L-12_H-768_A-12/bert_model.ckpt.index  
  inflating: cased_L-12_H-768_A-12/bert_config.json  
$ ls
LICENSE                   cased_L-12_H-768_A-12     docs
README.md                 cased_L-12_H-768_A-12.zip example
bertserving               docker-compose.yaml       web

從上面,我們可以看出來在當(dāng)前的目錄里創(chuàng)建了一個(gè)叫做?cased_L-12_H-768_A-12 的子目錄。它將在下面的 bertserving 容器中被使用到。

設(shè)置環(huán)境變量

你需要將預(yù)訓(xùn)練的 BERT 模型和 Elasticsearch 的索引名稱設(shè)置為環(huán)境變量。 這些變量在 Docker 容器中使用。 下面是一個(gè)將 jobsearch 指定為索引名稱并將 ./cased_L-12_H-768_A-12 指定為模型路徑的示例:?

export PATH_MODEL=./cased_L-12_H-768_A-12
export INDEX_NAME=jobsearch

啟動(dòng) docker

現(xiàn)在,讓我們使用 Docker compose 啟動(dòng) Docker 容器。 這里要啟動(dòng)三個(gè)容器:應(yīng)用程序容器、BERT 容器和 Elasticsearch 容器。我們按照如下的命令來啟動(dòng)所有的容器:

docker-compose up

bert 搜索,Elasticsearch,Elastic,AI,搜索引擎,elasticsearch,bert,大數(shù)據(jù),全文檢索

一旦成功啟動(dòng)完畢后,我們可以用在 http://localhost:9200 來訪問 Elasticsearch,并在地址 http://localhost:5601 訪問 Kibana。

$ curl http://localhost:9200
{
  "name" : "d996f0e69e91",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "KiXF66HWSw2RSEXTiHKP2Q",
  "version" : {
    "number" : "8.6.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "180c9830da956993e59e2cd70eb32b5e383ea42c",
    "build_date" : "2023-01-24T21:35:11.506992272Z",
    "build_snapshot" : false,
    "lucene_version" : "9.4.2",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

我們可以通過如下的命令來查看所有的真正運(yùn)行的容器:

docker ps
$ docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
a043a2b1cabc   bertsearch_web           "python app.py"          3 minutes ago    Up 3 minutes    0.0.0.0:5100->5100/tcp                                 bertsearch_web_1
2c1e20206eff   bertsearch_bertserving   "/app/entrypoint.sh"     3 minutes ago    Up 3 minutes    6006/tcp, 0.0.0.0:5555-5556->5555-5556/tcp, 8888/tcp   bertserving
7eb3a9422c50   kibana:8.6.1             "/bin/tini -- /usr/l…"   16 minutes ago   Up 16 minutes   0.0.0.0:5601->5601/tcp                                 kibana
d996f0e69e91   elasticsearch:8.6.1      "/bin/tini -- /usr/l…"   16 minutes ago   Up 16 minutes   0.0.0.0:9200->9200/tcp, 9300/tcp                       elasticsearch

從上面,我們可以看出來有四個(gè)正在運(yùn)行的容器。請(qǐng)注意,我建議你為 Docker 分配更多內(nèi)存(超過 8GB)。 因?yàn)?BERT 容器需要大內(nèi)存。

我們的 bertserving 服務(wù)運(yùn)行于 http://localhost:5555,而 web 服務(wù)運(yùn)行于 http://localhost:5100。我們可以在 docker-compose.yml 里進(jìn)行查看。

創(chuàng)建 Elasticsearch 索引

你可以使用創(chuàng)建索引 API 將新索引添加到 Elasticsearch 集群。 創(chuàng)建索引時(shí),你可以指定以下內(nèi)容:

  • 索引的設(shè)置
  • 索引中字段的映射
  • 索引別名

例如,如果要?jiǎng)?chuàng)建包含 title、text 和 text_vector 字段的 jobsearch 索引,可以通過以下命令創(chuàng)建索引:

python example/create_index.py --index_file=example/index.json --index_name=jobsearch

上面書命令在 Elasticsearch 中創(chuàng)建了具有如下配置的一個(gè)叫做 jobsearch 的索引:

{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
  },
  "mappings": {
    "dynamic": "true",
    "_source": {
      "enabled": "true"
    },
    "properties": {
      "title": {
        "type": "text"
      },
      "text": {
        "type": "text"
      },
      "text_vector": {
        "type": "dense_vector",
        "dims": 768
      }
    }
  }
}

我們可以通過如下的命令來查看:

GET jobsearch

注意:text_vector 的 dims 值必須與預(yù)訓(xùn)練的 BERT 模型的 dims 相匹配。

創(chuàng)建文檔

創(chuàng)建索引后,你就可以為一些文檔編制索引了。 這里的重點(diǎn)是使用 BERT 將你的文檔轉(zhuǎn)換為向量。 結(jié)果向量存儲(chǔ)在 text_vector 字段中。 讓我們將你的數(shù)據(jù)轉(zhuǎn)換為 JSON 文檔。在本示例中,我們是用了一個(gè)簡(jiǎn)單的 example.csv 文件:

example/example.csv

"Title","Description"
"Saleswoman","a woman whose job is to sell a product or service in a given territory, in a store, or by telephone"
"Software Developer","Hire Expert Software Engineers and Developers With Crowdbotics"
"Chief Financial Officer","a senior executive responsible for managing the financial actions of a company. "
"General Manager","esponsible for improving efficiency and increasing departmental profits while managing the company’s overall operations."
"Network Administrator","installing, monitoring, troubleshooting, and upgrading network infrastructure, including both hardware and software components"

如上所示,我們的 csv 文件中,含有兩個(gè)字段:Title 及 Description。我們將把 Description 這個(gè)部分向量化,以方便我們下面的搜索。

python example/create_documents.py --data=example/example.csv --index_name=jobsearch

完成腳本后,你可以得到如下的 JSON 文檔:

$ pwd
/Users/liuxg/python/bertsearch
$ ls
LICENSE                   cased_L-12_H-768_A-12     docs
README.md                 cased_L-12_H-768_A-12.zip example
bertserving               docker-compose.yaml       web
$ python example/create_documents.py --data=example/example.csv --index_name=jobsearch
$ ls
LICENSE                   cased_L-12_H-768_A-12.zip example
README.md                 docker-compose.yaml       web
bertserving               docs
cased_L-12_H-768_A-12     documents.jsonl

從上面的輸出中,我們可以看出來,運(yùn)行命令后,當(dāng)前目錄下多了一個(gè)文件??documents.jsonl。它的文件格式如下:

bert 搜索,Elasticsearch,Elastic,AI,搜索引擎,elasticsearch,bert,大數(shù)據(jù),全文檢索

上述格式顯然是易于我們使用 bulk 命令來進(jìn)行批寫入的格式。?

寫入文檔到 Elasticsearch

將數(shù)據(jù)轉(zhuǎn)換為 JSON 后,你可以將 JSON 文檔添加到指定索引并使其可搜索。

python example/index_documents.py

執(zhí)行完上面的命令后,我們可以在 Kibana 中進(jìn)行查看:

GET jobsearch/_search

bert 搜索,Elasticsearch,Elastic,AI,搜索引擎,elasticsearch,bert,大數(shù)據(jù),全文檢索

打開瀏覽器

轉(zhuǎn)到 http://localhost:5100。 下面是一些搜索的例子。

bert 搜索,Elasticsearch,Elastic,AI,搜索引擎,elasticsearch,bert,大數(shù)據(jù),全文檢索

bert 搜索,Elasticsearch,Elastic,AI,搜索引擎,elasticsearch,bert,大數(shù)據(jù),全文檢索

bert 搜索,Elasticsearch,Elastic,AI,搜索引擎,elasticsearch,bert,大數(shù)據(jù),全文檢索

從上面的搜索結(jié)果中,我們可以看出來,盡管我們輸入的詞并不完全匹配文字中的描述,但是它還是給了我們最想要的最為相關(guān)的結(jié)果。這些結(jié)果是按照相關(guān)性進(jìn)行排列顯示的。

上面的搜索,其實(shí)在 web 里是使用了如下的搜索命令:

GET jobsearch/_search
{
  "_source": ["text", "title"], 
  "query": {
    "script_score": {
      "script": {
        "source": "cosineSimilarity(params.query_vector, 'text_vector')",
        "params": {
          "query_vector": [
            0.480839341878891,
            -0.3990676701068878,
            -0.1494527906179428,
            -0.6091867685317993,
            -0.014144758693873882,
            -0.053846489638090134,
            0.727445125579834,
            -0.009675377979874611,
            -0.29119399189949036,
            0.14104360342025757,
            0.2982104420661926,
            0.5848511457443237,
           ...
          ]
        }
     } 
  }
}

bert 搜索,Elasticsearch,Elastic,AI,搜索引擎,elasticsearch,bert,大數(shù)據(jù),全文檢索

特別值得指出的是:在最新的 Elasticsearch 發(fā)布版中,我們可以使用 knn 搜索。具體例子可以參考文章 “Elasticsearch:運(yùn)用 Python 實(shí)現(xiàn)在 Elasticsearch 上的向量搜索”。你可以嘗試修改 web 里的搜索部分來完成這個(gè)練習(xí)。這里就不再展示了。文章來源地址http://www.zghlxwxcb.cn/news/detail-729042.html

到了這里,關(guān)于Elasticsearch:使用 Elasticsearch 和 BERT 構(gòu)建搜索引擎 - TensorFlow的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

    [golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

    ElasticSearch 是一個(gè)基于 Lucene 的 搜索服務(wù)器 ,它提供了一個(gè) 分布式多用戶 能力的 全文搜索引擎 ,基于 RESTful web 接口,Elasticsearch 是用 Java 開發(fā)的,并作為 Apache 許可條款下的開放源碼發(fā)布,是當(dāng)前流行的企業(yè)級(jí)搜索引擎,設(shè)計(jì)用于云計(jì)算中,能夠達(dá)到 實(shí)時(shí)搜索 , 穩(wěn)定 , 可靠

    2024年02月11日
    瀏覽(21)
  • 使用 Transformer 和 Amazon OpenSearch Service 構(gòu)建基于列的語義搜索引擎

    使用 Transformer 和 Amazon OpenSearch Service 構(gòu)建基于列的語義搜索引擎

    在數(shù)據(jù)湖中,對(duì)于數(shù)據(jù)清理和注釋、架構(gòu)匹配、數(shù)據(jù)發(fā)現(xiàn)和跨多個(gè)數(shù)據(jù)來源進(jìn)行分析等許多操作,查找相似的列有著重要的應(yīng)用。如果不能從多個(gè)不同的來源準(zhǔn)確查找和分析數(shù)據(jù),就會(huì)嚴(yán)重拉低效率,不論是數(shù)據(jù)科學(xué)家、醫(yī)學(xué)研究人員、學(xué)者,還是金融和政府分析師,所有人

    2024年02月11日
    瀏覽(28)
  • 【ChatGPT】使用 LangChain 和 Ray 實(shí)現(xiàn) 100 行代碼構(gòu)建 LLM 開源搜索引擎【1】

    目錄 Introduction Building the index?構(gòu)建索引 Accelerating indexing using Ray?使用 Ray 加速索引編制 Serving

    2024年02月08日
    瀏覽(17)
  • 如何使用內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)Java遠(yuǎn)程連接本地Elasticsearch搜索分析引擎

    如何使用內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)Java遠(yuǎn)程連接本地Elasticsearch搜索分析引擎

    簡(jiǎn)單幾步,結(jié)合Cpolar 內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)Java 遠(yuǎn)程連接操作本地分布式搜索和數(shù)據(jù)分析引擎Elasticsearch。 Cpolar內(nèi)網(wǎng)穿透提供了更高的安全性和隱私保護(hù),通過使用加密通信通道,Cpolar技術(shù)可以確保數(shù)據(jù)傳輸?shù)陌踩裕@為用戶和團(tuán)隊(duì)提供了更可靠的保護(hù),使他們能夠放心地處理和

    2024年02月04日
    瀏覽(30)
  • 分布式搜索引擎——elasticsearch搜索功能

    分布式搜索引擎——elasticsearch搜索功能

    Elasticsearch提供了基于JSON的DSL (Domain Specific Language)來定義查詢。常見的查詢類型包括: 查詢所有:查詢出所有數(shù)據(jù),一般測(cè)試用。例如:match_all 全文檢索(full text)查詢:利用分詞器對(duì)用戶輸入內(nèi)容分詞,然后去倒排索引庫(kù)中匹配。例如: match_query multi_match_query 精確查詢:根據(jù)精確詞條

    2024年02月05日
    瀏覽(35)
  • 分布式搜索引擎ElasticSearch——搜索功能

    分布式搜索引擎ElasticSearch——搜索功能

    DSL查詢分類 DSL官方文檔 全文檢索查詢 精確查詢 地理查詢 復(fù)合查詢 Function Score Query function score query Boolean Query 排序 分頁(yè) 官方文檔 高亮 快速入門 match,term,range,bool查詢 排序和分頁(yè) 高亮顯示 就是在前面抽取的解析代碼中進(jìn)一步添加關(guān)于高亮的解析部分,因?yàn)閔ighlight和so

    2024年02月01日
    瀏覽(28)
  • Elasticsearch 搜索引擎

    Elasticsearch 搜索引擎

    一、創(chuàng)建索引庫(kù) *put* *http://localhost:9200/* *索引庫(kù)名稱* PUT http://localhost:9200/xc_course number_of_shards:設(shè)置分片的數(shù)量,在集群中通常設(shè)置多個(gè)分片,表示一個(gè)索引庫(kù)將拆分成多片分別存儲(chǔ)不同 的結(jié)點(diǎn),提高了ES的處理能力和高可用性,入門程序使用單機(jī)環(huán)境,這里設(shè)置為1。 numb

    2024年02月01日
    瀏覽(21)
  • Elasticsearch全文搜索引擎

    Elasticsearch全文搜索引擎 Elasticsearch簡(jiǎn)介 windows平臺(tái)下安裝ES 學(xué)習(xí)ES的預(yù)備知識(shí) ES索引操作 ES文檔操作 ES高級(jí)查詢 Golang操作ES起步 Golang操作ES索引 Golang操作ES文檔 Golang ES高級(jí)查詢 Gin集成ES

    2024年02月09日
    瀏覽(22)
  • Elasticsearch:什么是搜索引擎?

    Elasticsearch:什么是搜索引擎?

    搜索引擎是一種軟件程序或系統(tǒng),旨在幫助用戶查找存儲(chǔ)在互聯(lián)網(wǎng)或特定數(shù)據(jù)庫(kù)中的信息。 搜索引擎的工作原理是對(duì)各種來源的內(nèi)容進(jìn)行索引和編目,然后根據(jù)用戶的搜索查詢向用戶提供相關(guān)結(jié)果列表。 搜索引擎對(duì)于希望快速有效地查找特定信息的用戶來說是有用的工具。

    2024年02月21日
    瀏覽(25)
  • 關(guān)于Elasticsearch全文搜索引擎

    關(guān)于Elasticsearch全文搜索引擎

    我們可以把它簡(jiǎn)稱為ES,但是搜索它的資料時(shí)(例如百度)還是使用Elasticsearch進(jìn)行搜索更準(zhǔn)確, 這個(gè)軟件不再是SpringCloud提供的,它也不針對(duì)微服務(wù)環(huán)境的項(xiàng)目來開發(fā) Elasticsearch和redismysql一樣,不僅服務(wù)于java語言,其它語言也可以使用,它的功能也類似一個(gè)數(shù)據(jù)庫(kù),能高效的從

    2024年02月05日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包