本篇內(nèi)容介紹了“什么是Elasticsearch組件庫(kù)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)公司是一家專業(yè)提供商洛企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、成都網(wǎng)站制作、html5、小程序制作等業(yè)務(wù)。10年已為商洛眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
在講解之前,我在這里再次提下全文檢索是什么:
全文檢索:指以全部文本信息作為檢索對(duì)象的一種信息檢索技術(shù)。而我們使用的數(shù)據(jù)庫(kù),如 MySQL,MongoDB 對(duì)文本信息檢索能力特別是中文檢索并沒(méi)有 ES 強(qiáng)大。所以我們來(lái)看下 ES 在項(xiàng)目中是如何來(lái)代替 SQL 來(lái)工作的。
我使用的 Elasticsearch 服務(wù)是 7.4.2 的版本,然后采用官方提供的 Elastiscsearch-Rest-Client 庫(kù)來(lái)操作 ES,而且官方庫(kù)的 API 上手簡(jiǎn)單。
該組件庫(kù)的官方文檔地址:
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html
另外這個(gè)組件庫(kù)是支持多種語(yǔ)言的:
支持多語(yǔ)言
注意:Elasticsearch Clients
就是指如何用 API 操作 ES 服務(wù)的組件庫(kù)。
可能有同學(xué)會(huì)提問(wèn),Elasticsearch 的組件庫(kù)中寫著 JavaScript API,是不是可以直接在前端訪問(wèn) ES 服務(wù)?可以是可以,但是會(huì)暴露 ES 服務(wù)的端口和 IP 地址,會(huì)非常不安全。所以我們還是用后端服務(wù)來(lái)訪問(wèn) ES 服務(wù)。
我們這個(gè)項(xiàng)目是 Java 項(xiàng)目,自然就是用上面的兩種:Java Rest Client
或者 Java API
。我們先看下 Java API,但是會(huì)發(fā)現(xiàn)已經(jīng)廢棄了。如下圖所示:
Java API 已經(jīng)廢棄了
所以我們只能用 Java REST Client 了。而它又分成兩種:高級(jí)和低級(jí)的。高級(jí)包含更多的功能,如果把高級(jí)比作MyBatis的話,那么低級(jí)就相當(dāng)于JDBC。所以我們用高級(jí)的 Client。
高級(jí)和低級(jí) Client
我們把檢索服務(wù)單獨(dú)作為一個(gè)服務(wù)。就稱作 passjava-search 模塊吧。
創(chuàng)建 passjava-search 模塊。
首先我們?cè)?PassJava-Platform 模塊創(chuàng)建一個(gè) 搜索服務(wù)模塊 passjava-search。然后勾選 spring web 服務(wù)。如下圖所示。
第一步:選擇 Spring Initializr,然后點(diǎn)擊 Next。
選擇 Spring Initializr
第二步:填寫模塊信息,然后點(diǎn)擊 Next。
passjava-search 服務(wù)模塊
第三步:選擇 Web->Spring Web 依賴,然后點(diǎn)擊 Next。
參照 ES 官網(wǎng)配置。
進(jìn)入到 ES 官方網(wǎng)站,可以看到有低級(jí)和高級(jí)的 Rest Client,我們選擇高階的(High Level Rest Client)。然后進(jìn)入到高階 Rest Client 的 Maven 倉(cāng)庫(kù)。官網(wǎng)地址如下所示:
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.9/index.html
Rest Client 官方文檔
加上 Maven 依賴。
對(duì)應(yīng)文件路徑:\passjava-search\pom.xml
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.4.2</version></dependency>
配置 elasticsearch 的版本為7.4.2
因加上 Maven 依賴后,elasticsearch 版本為 7.6.2,所以遇到這種版本不一致的情況時(shí),需要手動(dòng)改掉。
對(duì)應(yīng)文件路徑:\passjava-search\pom.xml
<properties> <elasticsearch.version>7.4.2</elasticsearch.version> </properties>
刷新 Maven Project 后,可以看到引入的 elasticsearch 都是 7.4.2 版本了,如下圖所示:
設(shè)置版本為 7.4.2
引入 PassJava 的 Common 模塊依賴。
Common 模塊是 PassJava 項(xiàng)目獨(dú)立的出來(lái)的公共模塊,引入了很多公共組件依賴,其他模塊引入 Common 模塊依賴后,就不需要單獨(dú)引入這些公共組件了,非常方便。
對(duì)應(yīng)文件路徑:\passjava-search\pom.xml
<dependency> <groupId>com.jackson0714.passjava</groupId> <artifactId>passjava-common</artifactId> <version>0.0.1-SNAPSHOT</version></dependency>
添加完依賴后,我們就可以將搜索服務(wù)注冊(cè)到 Nacos
注冊(cè)中心了。Nacos 注冊(cè)中心的用法在前面幾篇文章中也詳細(xì)講解過(guò),這里需要注意的是要先啟動(dòng) Nacos 注冊(cè)中心,才能正常注冊(cè) passjava-search 服務(wù)。
修改配置文件:src/main/resources/application.properties。配置應(yīng)用程序名、注冊(cè)中心地址、注冊(cè)中心的命名中間。
spring.application.name=passjava-search spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=passjava-search
給啟動(dòng)類
添加服務(wù)發(fā)現(xiàn)注解:@EnableDiscoveryClient
。這樣 passjava-search 服務(wù)就可以被注冊(cè)中心發(fā)現(xiàn)了。
因 Common 模塊依賴數(shù)據(jù)源,但 search 模塊不依賴數(shù)據(jù)源,所以 search 模塊需要移除數(shù)據(jù)源依賴:
exclude = DataSourceAutoConfiguration.class
以上的兩個(gè)注解如下所示:
@EnableDiscoveryClient@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)public class PassjavaSearchApplication { public static void main(String[] args) { SpringApplication.run(PassjavaSearchApplication.class, args); } }
接下來(lái)我們添加一個(gè) ES 服務(wù)的專屬配置類,主要目的是自動(dòng)加載一個(gè) ES Client 來(lái)供后續(xù) ES API 使用,不用每次都 new 一個(gè) ES Client。
配置類:PassJavaElasticsearchConfig.java
核心方法就是 RestClient.builder 方法,設(shè)置好 ES 服務(wù)的 IP 地址、端口號(hào)、傳輸協(xié)議就可以了。最后自動(dòng)加載了 RestHighLevelClient。
package com.jackson0714.passjava.search.config;import org.apache.http.HttpHost;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestHighLevelClient;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @Author: 公眾號(hào) | 悟空聊架構(gòu) * @Date: 2020/10/8 17:02 * @Site: www.passjava.cn * @Github: https://github.com/Jackson0714/PassJava-Platform */@Configurationpublic class PassJavaElasticsearchConfig { @Bean // 給容器注冊(cè)一個(gè) RestHighLevelClient,用來(lái)操作 ES // 參考官方文檔:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.9/java-rest-high-getting-started-initialization.html public RestHighLevelClient restHighLevelClient() { return new RestHighLevelClient( RestClient.builder( new HttpHost("192.168.56.10", 9200, "http"))); } }
接下來(lái)我們測(cè)試下 ES Client 是否自動(dòng)加載成功。
在測(cè)試類 PassjavaSearchApplicationTests 中編寫測(cè)試方法,打印出自動(dòng)加載的 ES Client。期望結(jié)果是一個(gè) RestHighLevelClient 對(duì)象。
package com.jackson0714.passjava.search;import org.elasticsearch.client.RestHighLevelClient;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestclass PassjavaSearchApplicationTests { @Qualifier("restHighLevelClient") @Autowired private RestHighLevelClient client; @Test public void contextLoads() { System.out.println(client); } }
運(yùn)行結(jié)果如下所示,打印出了 RestHighLevelClient。說(shuō)明自定義的 ES Client 自動(dòng)裝載成功。
ES 測(cè)試結(jié)果
測(cè)試方法 testIndexData,省略 User 類。users 索引在我的 ES 中是沒(méi)有記錄的,所以期望結(jié)果是 ES 中新增了一條 users 數(shù)據(jù)。
/** * 測(cè)試存儲(chǔ)數(shù)據(jù)到 ES。 * */@Testpublic void testIndexData() throws IOException { IndexRequest request = new IndexRequest("users"); request.id("1"); // 文檔的 id //構(gòu)造 User 對(duì)象 User user = new User(); user.setUserName("PassJava"); user.setAge("18"); user.setGender("Man"); //User 對(duì)象轉(zhuǎn)為 JSON 數(shù)據(jù) String jsonString = JSON.toJSONString(user); // JSON 數(shù)據(jù)放入 request 中 request.source(jsonString, XContentType.JSON); // 執(zhí)行插入操作 IndexResponse response = client.index(request, RequestOptions.DEFAULT); System.out.println(response); }
執(zhí)行 test 方法,我們可以看到控制臺(tái)輸出以下結(jié)果,說(shuō)明數(shù)據(jù)插入到 ES 成功。另外需要注意的是結(jié)果中的 result 字段為 updated,是因?yàn)槲冶镜貫榱私貓D,多執(zhí)行了幾次插入操作,但因?yàn)?id = 1,所以做的都是 updated 操作,而不是 created 操作。
控制臺(tái)輸出結(jié)果
我們?cè)賮?lái)到 ES 中看下 users 索引中數(shù)據(jù)。查詢 users 索引:
GET users/_search
結(jié)果如下所示:
查詢 users 索引結(jié)果
可以從圖中看到有一條記錄被查詢出來(lái),查詢出來(lái)的數(shù)據(jù)的 _id = 1,和插入的文檔 id 一致。另外幾個(gè)字段的值也是一致的。說(shuō)明插入的數(shù)據(jù)沒(méi)有問(wèn)題。
"age" : "18","gender" : "Man","userName" : "PassJava"
示例:搜索 bank 索引,address 字段中包含 big 的所有人的年齡分布 ( 前 10 條 ) 以及平均年齡,以及平均薪資。
我們可以參照官方文檔給出的示例來(lái)創(chuàng)建一個(gè) SearchRequest 對(duì)象,指定要查詢的索引為 bank,然后創(chuàng)建一個(gè) SearchSourceBuilder 來(lái)組裝查詢條件??偣灿腥N條件需要組裝:
address 中包含 road 的所有人。
按照年齡分布進(jìn)行聚合。
計(jì)算平均薪資。
代碼如下所示,需要源碼請(qǐng)到我的 Github/PassJava 上下載。
查詢復(fù)雜語(yǔ)句示例
將打印出來(lái)的檢索參數(shù)復(fù)制出來(lái),然后放到 JSON 格式化工具中格式化一下,再粘貼到 ES 控制臺(tái)執(zhí)行,發(fā)現(xiàn)執(zhí)行結(jié)果是正確的。
打印出檢索參數(shù)
用在線工具格式化 JSON 字符串,結(jié)果如下所示:
然后我們?nèi)サ羝渲械囊恍┠J(rèn)參數(shù),最后簡(jiǎn)化后的檢索參數(shù)放到 Kibana 中執(zhí)行。
Kibana Dev Tools 控制臺(tái)中執(zhí)行檢索語(yǔ)句如下圖所示,檢索結(jié)果如下圖所示:
控制臺(tái)中執(zhí)行檢索語(yǔ)句
找到總記錄數(shù):29 條。
第一條命中記錄的詳情如下:
平均 balance:13136。
平均年齡:26。
地址中包含 Road 的:263 Aviation Road。
和 IDEA 中執(zhí)行的測(cè)試結(jié)果一致,說(shuō)明復(fù)雜檢索的功能已經(jīng)成功實(shí)現(xiàn)。
而獲取命中記錄的詳情數(shù)據(jù),則需要通過(guò)兩次 getHists() 方法拿到,如下所示:
// 3.1)獲取查到的數(shù)據(jù)。 SearchHits hits = response.getHits(); // 3.2)獲取真正命中的結(jié)果 SearchHit[] searchHits = hits.getHits();
我們可以通過(guò)遍歷 searchHits 的方式打印出所有命中結(jié)果的詳情。
// 3.3)、遍歷命中結(jié)果for (SearchHit hit: searchHits) { String hitStr = hit.getSourceAsString(); BankMember bankMember = JSON.parseObject(hitStr, BankMember.class); }
拿到每條記錄的 hitStr 是個(gè) JSON 數(shù)據(jù),如下所示:
{ "account_number": 431, "balance": 13136, "firstname": "Laurie", "lastname": "Shaw", "age": 26, "gender": "F", "address": "263 Aviation Road", "employer": "Zillanet", "email": "laurieshaw@zillanet.com", "city": "Harmon", "state": "WV"}
而 BankMember 是根據(jù)返回的結(jié)果詳情定義的的 JavaBean。可以通過(guò)工具自動(dòng)生成。在線生成 JavaBean 的網(wǎng)站如下:
https://www.bejson.com/json2javapojo/new/
把這個(gè) JavaBean 加到 PassjavaSearchApplicationTests 類中:
@ToString@Datastatic class BankMember { private int account_number; private int balance; private String firstname; private String lastname; private int age; private String gender; private String address; private String employer; private String email; private String city; private String state; }
然后將 bankMember 打印出來(lái):
System.out.println(bankMember);
bankMember
得到的結(jié)果確實(shí)是我們封裝的 BankMember 對(duì)象,而且里面的屬性值也都拿到了。
ES 返回的 response 中,年齡分布的數(shù)據(jù)是按照 ES 的格式返回的,如果想按照我們自己的格式來(lái)返回,就需要將 response 進(jìn)行處理。
如下圖所示,這個(gè)是查詢到的年齡分布結(jié)果,我們需要將其中某些字段取出來(lái),比如 buckets,它代表了分布在 21 歲的有 4 個(gè)。
ES 返回的年齡分布信息
下面是代碼實(shí)現(xiàn):
Aggregations aggregations = response.getAggregations(); Terms ageAgg1 = aggregations.get("ageAgg");for (Terms.Bucket bucket : ageAgg1.getBuckets()) { String keyAsString = bucket.getKeyAsString(); System.out.println("用戶年齡: " + keyAsString + " 人數(shù):" + bucket.getDocCount()); }
最后打印的結(jié)果如下,21 歲的有 4 人,26 歲的有 4 人,等等。
打印結(jié)果:用戶年齡分布
現(xiàn)在來(lái)看看平均薪資如何按照所需的格式返回,ES 返回的結(jié)果如下圖所示,我們需要獲取 balanceAvg 字段的 value 值。
ES 返回的平均薪資信息
代碼實(shí)現(xiàn):
Avg balanceAvg1 = aggregations.get("balanceAvg"); System.out.println("平均薪資:" + balanceAvg1.getValue());
打印結(jié)果如下,平均薪資 28578 元。
打印結(jié)果:平均薪資
PassJava 這個(gè)項(xiàng)目可以用來(lái)配置題庫(kù),如果我們想通過(guò)關(guān)鍵字來(lái)搜索題庫(kù),該怎么做呢?
類似于百度搜索,輸入幾個(gè)關(guān)鍵字就可以搜到關(guān)聯(lián)的結(jié)果,我們這個(gè)功能也是類似,通過(guò) Elasticsearch 做檢索引擎,后臺(tái)管理界面和小程序作為搜索入口,只需要在小程序上輸入關(guān)鍵字,就可以檢索相關(guān)的題目和答案。
首先我們需要把題目和答案保存到 ES 中,在存之前,第一步是定義索引的模型,如下所示,模型中有 title
和 answer
字段,表示題目和答案。
"id": { "type": "long"},"title": { "type": "text", "analyzer": "ik_smart"},"answer": { "type": "text", "analyzer": "ik_smart"},"typeName": { "type": "keyword"}
上面我們已經(jīng)定義了索引結(jié)構(gòu),接著就是在 ES 中創(chuàng)建索引。
在 Kibana 控制臺(tái)中執(zhí)行以下語(yǔ)句:
PUT question { "mappings" : { "properties": { "id": { "type": "long" }, "title": { "type": "text", "analyzer": "ik_smart" }, "answer": { "type": "text", "analyzer": "ik_smart" }, "typeName": { "type": "keyword" } } } }
執(zhí)行結(jié)果如下所示:
創(chuàng)建 question 索引
我們可以通過(guò)以下命令來(lái)查看 question 索引是否在 ES 中:
GET _cat/indices
執(zhí)行結(jié)果如下圖所示:
查看 ES 中所有的索引
上面我們定義 ES 的索引,接著就是定義索引對(duì)應(yīng)的模型,將數(shù)據(jù)存到這個(gè)模型中,然后再存到 ES 中。
ES 模型如下,共四個(gè)字段:id、title、answer、typeName。和 ES 索引是相互對(duì)應(yīng)的。
@Datapublic class QuestionEsModel { private Long id; private String title; private String answer; private String typeName; }
當(dāng)我們?cè)诤笈_(tái)創(chuàng)建題目或保存題目時(shí),先將數(shù)據(jù)保存到 mysql 數(shù)據(jù)庫(kù),然后再保存到 ES 中。
如下圖所示,在管理后臺(tái)創(chuàng)建題目時(shí),觸發(fā)保存數(shù)據(jù)到 ES 。
第一步,保存數(shù)據(jù)到 mysql 中,項(xiàng)目中已經(jīng)包含此功能,就不再講解了,直接進(jìn)入第二步:保存數(shù)據(jù)到 ES 中。
而保存數(shù)據(jù)到 ES 中,需要將數(shù)據(jù)組裝成 ES 索引對(duì)應(yīng)的數(shù)據(jù),所以我用了一個(gè) ES model,先將數(shù)據(jù)保存到 ES model 中。
這里的關(guān)鍵代碼時(shí) copyProperties
,可以將 question
對(duì)象的數(shù)據(jù)取出,然后賦值到 ES model 中。不過(guò) ES model 中還有些字段是 question 中沒(méi)有的,所以需要單獨(dú)拎出來(lái)賦值,比如 typeName 字段,question 對(duì)象中沒(méi)有這個(gè)字段,它對(duì)應(yīng)的字段是 question.type,所以我們把 type 取出來(lái)賦值到 ES model 的 typeName 字段上。如下圖所示:
用 model 來(lái)組裝數(shù)據(jù)
我在 passjava-search 微服務(wù)中寫了一個(gè)保存題目的 api 用來(lái)保存數(shù)據(jù)到 ES 中。
保存數(shù)據(jù)到 ES
然后在 passjava-question 微服務(wù)中調(diào)用 search 微服務(wù)的保存 ES 的方法就可以了。
// 調(diào)用 passjava-search 服務(wù),將數(shù)據(jù)發(fā)送到 ES 中保存。searchFeignService.saveQuestion(esModel);
我們可以通過(guò) kibana 的控制臺(tái)來(lái)查看 question 索引中的文檔。通過(guò)以下命令來(lái)查看:
GET question/_search
執(zhí)行結(jié)果如下圖所示,有一條記錄:
另外大家有沒(méi)有疑問(wèn):可以重復(fù)更新題目嗎?
答案是可以的,保存到 ES 的數(shù)據(jù)是冪等的,因?yàn)楸4娴臅r(shí)候帶了一個(gè)類似數(shù)據(jù)庫(kù)主鍵的 id。
我們已經(jīng)將數(shù)據(jù)同步到了 ES 中,現(xiàn)在就是前端怎么去查詢 ES 數(shù)據(jù)中,這里我們還是使用 Postman 來(lái)模擬前端查詢請(qǐng)求。
請(qǐng)求參數(shù)我定義了三個(gè):
keyword:用來(lái)匹配問(wèn)題或者答案。
id:用來(lái)匹配題目 id。
pageNum:用來(lái)分頁(yè)查詢數(shù)據(jù)。
這里我將這三個(gè)參數(shù)定義為一個(gè)類:
@Datapublic class SearchParam { private String keyword; // 全文匹配的關(guān)鍵字 private String id; // 題目 id private Integer pageNum; // 查詢第幾頁(yè)數(shù)據(jù)}
返回的 response 我也定義了四個(gè)字段:
questionList:查詢到的題目列表。
pageNum:第幾頁(yè)數(shù)據(jù)。
total:查詢到的總條數(shù)。
totalPages:總頁(yè)數(shù)。
定義的類如下所示:
@Datapublic class SearchQuestionResponse { private List<QuestionEsModel> questionList; // 題目列表 private Integer pageNum; // 查詢第幾頁(yè)數(shù)據(jù) private Long total; // 總條數(shù) private Integer totalPages; // 總頁(yè)數(shù)}
調(diào)用 ES 的查詢 API 時(shí),需要構(gòu)建查詢參數(shù)。
組裝查詢參數(shù)的核心代碼如下所示:
組裝查詢參數(shù)
第一步:創(chuàng)建檢索請(qǐng)求。
第二步:設(shè)置哪些字段需要模糊匹配。這里有三個(gè)字段:title,answer,typeName。
第三步:設(shè)置如何分頁(yè)。這里分頁(yè)大小是 5 個(gè)。
第四步:調(diào)用查詢 api。
ES 返回的數(shù)據(jù)是 ES 定義的格式,真正的數(shù)據(jù)被嵌套在 ES 的 response 中,所以需要格式化返回的數(shù)據(jù)。
核心代碼如下圖所示:
格式化 ES 返回結(jié)果
第一步:獲取查到的數(shù)據(jù)。
第二步:獲取真正命中的結(jié)果。
第三步:格式化返回的數(shù)據(jù)。
第四步:組裝分頁(yè)參數(shù)。
我們現(xiàn)在想要驗(yàn)證 title 字段是否能匹配到,傳的請(qǐng)求參數(shù) keyword = 111,匹配到了 title = 111 的數(shù)據(jù),且只有一條。頁(yè)碼 pageNum 我傳的 1,表示返回第一頁(yè)數(shù)據(jù)。如下圖所示:
測(cè)試匹配 title
我們現(xiàn)在想要驗(yàn)證 answer 字段是否能匹配到,傳的請(qǐng)求參數(shù) keyword = 測(cè)試答案,匹配到了 title = 測(cè)試答案的數(shù)據(jù),且只有一條,說(shuō)明查詢成功。如下圖所示:
測(cè)試匹配 answer
我們現(xiàn)在想要匹配題目 id 的話,需要傳請(qǐng)求參數(shù) id,而且 id 是精確匹配。另外 id 和 keyword 是取并集,所以不能傳 keyword 字段。
請(qǐng)求參數(shù) id = 5,返回結(jié)果也是 id =5 的數(shù)據(jù),說(shuō)明查詢成功。如下圖所示:
測(cè)試 id 匹配
“什么是Elasticsearch組件庫(kù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
文章題目:什么是Elasticsearch組件庫(kù)
鏈接地址:http://aaarwkj.com/article38/pdeipp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、面包屑導(dǎo)航、外貿(mào)建站、企業(yè)建站、App設(shè)計(jì)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)