ElasticSearch 7.4學習記錄(基礎概念和基礎操作)

若你之前從未了解過ES,本文將由淺入深的一步步帶你理解ES,簡單使用ES。作者本人就是此狀態,通過學習和梳理,產出本文,已對ES有個全面的了解和想法,不僅將知識點梳理,也涉及到自己的理解,初次學習踩的坑都匯總如下。

1 了解ElasticSearch

對于第一次接觸ES的讀者,該章節將直觀的帶你體驗ES的魅力。

1.1 為何使用ES

使用前

           案例:需模糊查詢帶有 **華為** 的商品信息

使用MySQL的查詢功能:select * from 表名 where name like “%華為%”
模糊查詢會導致索引失效,就會全表掃描,效率低

           案例:需模糊查詢帶有 **華為手機** 的商品信息

使用MySQL的查詢功能:select * from 表名 where name like “%華為手機%”
只能找到 華為手機 這樣的結果
無法找到 華為榮耀手機華為耳機手機這樣的結果,意思就是無法將華為+手機分開查詢。這也是MySQL查詢功能弱的缺點

使用后

輸入 ”華為手機
結果展示: 華為榮耀手機華為耳機手機華為手機,且查詢效率高

上述案例旨在告訴讀者,面對更復雜的業務場景和搜索需求,單純的SQL查詢遠遠不能滿足,MySQL是存儲數據的解決方案,ES則是面對海量數據執行搜索的解決方案。

現在簡單了解一下ES是怎么做到的上述優點

1.1 倒排索引

  • 在了解倒排索引概念之前,先看看正向索引

                   案例 :查找含有 明 這個字的詩句
    
數據庫信息是否匹配
鋤禾日當午x
忽如一夜春風來x
窗前明月光

結果:窗前明月光
缺點:得從第每首詩的第一行的第一個字找,這種正向操作的思想會導致查詢比較慢

  • 倒排索引

                 案例: 查找含有 是 這個字的詩句
    

內部操作:
ES內部會自動的窗前明月光這個數據進行分詞

拆分單詞結果
窗前窗前明月光
窗前明月光
窗前明月光
明月窗前明月光
窗前明月光
窗前明月光
窗前明月光

找到關鍵字 明,得到對應的結果,效率很快的。我們習慣性將這種不直接查詢的設計叫倒排索引

案例升級
此時需要在數據庫中再存儲一條數據”明月幾時有“,ES會如何操作?
當然是自動拆分這句話

拆分單詞結果
窗前窗前明月光
窗前明月光
窗前明月光
明月窗前明月光;明月幾時有
窗前明月光;明月幾時有
窗前明月光;明月幾時有
窗前明月光
幾時明月幾時有
明月幾時有

拆分的單詞若已經有了,直接存儲在后面就行;若拆分的單詞是新的,則續上。

  • 優化倒排索引

考慮一下這個情況,若拆分單詞是 的結果有很多很多,豈不是這個表就很大,如何處理?
可以這樣設計

拆分單詞結果(ID)
窗前《靜夜思》
《靜夜思》
《靜夜思》
明月《靜夜思》;《水調歌頭》
《靜夜思》;《水調歌頭》
《靜夜思》;《水調歌頭》
《靜夜思》
幾時《水調歌頭》
《水調歌頭》

根據拆分單詞找到詩詞名稱,再根據詩詞名稱去查對應的內容。這樣一個表就拆成兩個表,就不大了。此外,這里的詩詞名稱就是唯一標識,在ES引擎中用 ID 表示。

從這里我們才真正的進入ES引擎

  1. 我們的數據格式是Json,存在文檔中
{"id":"1","title":"華為折疊手機","price":"120.00"
}
-----------------------------------------
{"id":"2","title":"三星翻蓋手機","price":"40.00"
}
-----------------------------------------
{"id":"3","title":"華為移動翻蓋手機","price":"90.00"
}
  1. 自動拆分得到表
termvalue
華為1,3
折疊1
1,2,3
手機1,2,3
三星2
翻蓋2,3
移動3

若term列數據很多,那直接從上往下一個個匹配也是會很慢的,因此ES引擎對詞條term列做了優化。
在生成倒排索引(此表)后,詞條會排序,形成一顆樹形結構(又稱為:字典樹),提升詞條的查詢速度。

ES的定位:mysql的數據只要一更新,就將索引同步給ES,保證數據一致性
在這里插入圖片描述

2 安裝ES

2.1 環境

CentOS 7
elasticsearch-7.4.0-linux-x86_64.tar.gz

2.2 將安裝包解壓在opt目錄下

在這里插入圖片描述

2.3 解壓

tar -zxvf elasticsearch-7.4.0-linux-x86_64.tar.gz -C /opt

在這里插入圖片描述

2.3 修改elasticsearch.yml文件

在這里插入圖片描述

cluster.name: my-application  //默認名稱是elasticserach
node.name: node-1 
network.host: 0.0.0.0  //保證在windows上可以訪問安裝在centos上的ES引擎
http.port: 9200 
cluster.initial_master_nodes: ["node-1"]

2.4 啟動報錯

在這里插入圖片描述
這是因為ES不推薦以root身份啟動,而是推薦以用戶身份啟動
我們已經有用戶zjh,只需要給其賦予啟動權限就好
在這里插入圖片描述

2.5 修改用戶配置文件

  1. vim /etc/security/limits.conf
添加此信息
zjh soft nofile 65536
zjh hard nofile 65536
  1. vim /etc/security/limits.d/20-nproc.conf
添加此信息
zjh soft nofile 65536
zjh hard nofile 65536
*   hard nproc  4096

在這里插入圖片描述
3. vim /etc/sysctl.conf

添加此信息vm.max_map_count=655360
  1. sysctl -p

2.6 切換用戶重啟ES

啟動前先暫時關閉防火墻
在這里插入圖片描述
再啟動
在這里插入圖片描述
輸入自己的虛擬機IP:9200
在這里插入圖片描述

3 安裝Kibana

Kibana版本必須和ES版本對應,避免出現不兼容的問題。

鏈接: Kibana下載

  1. 解壓 tar -xzf kibana-7.4.0-linux-x86_64.tar.gz -C /opt
    在這里插入圖片描述

2.修改配置文件vim /opt/kibana-7.4.0-linux-x86_64/config/kibana.yml

# 添加如下內容
server.port: 5601
server.hosts: "0.0.0.0"
server.name: "kibana-itcast"
elasticsearch.hosts: ["http://127.0.0.1:9200"]
elasticsearch.requestTimeout: 99999

在這里插入圖片描述

3.執行報錯,需切換身份
在這里插入圖片描述
4.切換身份執行

4 ES核心概念

本章節講述如下幾個概念:索引、映射、文檔、倒排索引

這是一個mysql數據庫處理數據的過程:創建表,將數據存儲到對應字段(創建Movice表,Animal表結構)

在這里插入圖片描述
這里我們也是創建表,不過在ES中不這樣稱呼,而是稱之為建立索引。(創建Movice與Animal索引,并給索引Movice,索引Animla創建映射),然后存儲數據,最后將相關字段進行分詞。

在這里插入圖片描述

5-8章節主要介紹在Kibana的可視化環境中,使用腳本進行相關操作,幫助熟悉ES

5 索引–基礎操作

不能修改索引

5.1 創建索引

在這里插入圖片描述

5.2 查詢索引

在這里插入圖片描述

5.3 添加映射

在這里插入圖片描述

5.4 查詢索引映射

在這里插入圖片描述

在這里插入圖片描述

5.5 刪除索引

在這里插入圖片描述

5.6 創建索引并添加映射

在這里插入圖片描述

5.7 添加字段

在這里插入圖片描述

6 文檔–基礎操作

6.1 添加文檔,指定id

在這里插入圖片描述

6.2 添加文檔,不指定id

在這里插入圖片描述

6.3 修改文檔

在這里插入圖片描述

6.4 查詢所有文檔

在這里插入圖片描述

6.5 刪除文檔,根據id

在這里插入圖片描述

7 分詞器(analyze)

在這里插入圖片描述
但是其對中文很不友好,使用ES的內置分詞器,中文只會被分成一個一個字,中英文分別演示一下
中文徹底被拆分成了一個個字
在這里插入圖片描述
英文是按照單詞拆分的,并不是按照字母拆分。
在這里插入圖片描述
因此若想要更好的中文分詞效果,需要安裝其他的分詞器(如IK分詞器),這里不介紹了。

8 文檔查詢

8.1 term

term:查詢的條件字符串和詞條完全匹配
例:查詢與“美”相關的title
在這里插入圖片描述
需要注意的是,ES默認使用的standard分詞器,因此僅支持單獨的漢字匹配,例如這樣
在這里插入圖片描述

若想要更改分詞器,只能重新建立索引映射,同時設置分詞器
在這里插入圖片描述

8.2 match

會先對查詢的字符串進行分詞,再去查詢,得到并集
例:將“美國”按照standard的分詞器進行拆分,得到“美” “國”,分別查詢,求并集。
在這里插入圖片描述

9 與springboot的整合

在springboot中,我們一般只操作文檔。在kibana使用腳本建立索引。這一章節介紹一下如何使用代碼操作ES中的文檔

9.1 簡單獲取cilent對象

ES將相關的操作都封裝成在RestHighLevelClient 中,因此我們需要獲取其對象才能進行相關操作
創建一個springboot項目,導入依賴

        <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.9.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.9.0</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.9.0</version></dependency>

測試 獲取ES客戶端對象

@SpringBootTest
class EsDemoApplicationTests {/*** HttpHost的三個參數* 	1. 192.168.xx.xx:5601 地址是Kibana的地址和端口號* 	2. 9002 是ES的端口* 	3. scheme:http*/@Testvoid test01() {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("ipxxxx:5601",9002,"http")));System.out.println(client);}}

成功獲取client對象
在這里插入圖片描述
獲取了client就可以操作ES的文檔

9.2 使用依賴注入方式優化獲取Client

可以發現,我們直接將HttpHost的三個參數寫死了,項目中不這樣建議。

  1. 創建elasticsearch.yml文件
elasticsearch:host: 192.168.67.18:5601port: 9200
  1. 創建配置類(獲取Client)
@Configuration
// 獲取elasticsearch.yml文件信息,自動將elasticsearch.yml文件中elasticsearch開頭的字段和ESconfig 類中的字段匹配并賦值
@ConfigurationProperties(prefix = "elasticsearch")
public class ESconfig {private String host;private int port;public String getHost() {return host;}public void setHost(String host) {this.host = host;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}@Beanpublic RestHighLevelClient client(){//1. 創建ES客戶端對象RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(host, port, "http")));return client;}
}
  1. 測試
@SpringBootTest
class EsDemoApplicationTests {@Autowiredprivate RestHighLevelClient client;@Testvoid test01() {/* RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("ipxxxx:5601",9002,"http")));*/System.out.println(client);}}

9.3 索引相關(了解)

9.3.1 創建索引

    /*** 創建索引*/@Testvoid addIndex() throws IOException {//獲取操作索引的對象IndicesClient indices = client.indices();//創建索引,獲取返回值CreateIndexRequest createIndexRequest = new CreateIndexRequest("movice");//設置映射mappingsString mapping = "{\n" +"      \"properties\" : {\n" +"        \"addres\" : {\n" +"          \"type\" : \"text\"\n" +"        },\n" +"        \"id\" : {\n" +"          \"type\" : \"integer\"\n" +"        },\n" +"        \"price\" : {\n" +"          \"type\" : \"integer\"\n" +"        },\n" +"        \"title\" : {\n" +"          \"type\" : \"text\"\n" +"        }\n" +"      }";createIndexRequest.mapping(mapping, XContentType.JSON);CreateIndexResponse response = indices.create(createIndexRequest, RequestOptions.DEFAULT);//根據返回值判斷結構:成功了返回trueSystem.out.println(response.isAcknowledged());}

也就是這效果
在這里插入圖片描述

9.3.2 查詢索引

/*** 查詢索引*/@Testvoid queryIndex() throws IOException {//獲取操作索引的對象IndicesClient indices = client.indices();//根據索引名稱查詢GetIndexRequest getIndexRequest = new GetIndexRequest("movice");GetIndexResponse response = indices.get(getIndexRequest, RequestOptions.DEFAULT);//獲取映射信息Map<String, MappingMetadata> mappings = response.getMappings();for (String key: mappings.keySet()){System.out.println(key + ":" + mappings.get(key).getSourceAsMap());}}

最后獲得的結果是這一部分
在這里插入圖片描述
解釋代碼
key:索引名稱
mappings.get(key):索引對象
mappings.get(key).getSourceAsMap():將數據轉換為map集合

9.3.3 刪除索引

    /*** 刪除索引*/@Testvoid deleteIndex() throws IOException {//獲取操作索引的對象IndicesClient indices = client.indices();//根據索引名稱刪除DeleteIndexRequest request = new DeleteIndexRequest("movice");AcknowledgedResponse response = indices.delete(request, RequestOptions.DEFAULT);//成功返回trueboolean acknowledged = response.isAcknowledged();System.out.println(acknowledged);}

9.3.4 判斷索引是否存在

 /*** 判斷索引是否存在*/@Testvoid existsIndex() throws IOException {//獲取操作索引的對象IndicesClient indices = client.indices();//根據索引名稱刪除GetIndexRequest request = new GetIndexRequest("movice");boolean exists = indices.exists(request, RequestOptions.DEFAULT);System.out.println(exists);}

9.4 文檔相關(重點)

9.4.1 添加文檔

按照這樣的思路去撰寫
在這里插入圖片描述

在這里插入圖片描述

但是一般我們不這樣存入數據,不會一個個put,而是從數據庫中拉取數據,封裝成對象,存入文檔

升級改造

  1. 創建索引的類(movice類)
public class movice {private Integer  id;private String title;private Integer price;private String address;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public Integer getPrice() {return price;}public void setPrice(Integer price) {this.price = price;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "movice{" +"id=" + id +", title='" + title + '\'' +", price=" + price +", address='" + address + '\'' +'}';}
}
  1. 使用類傳入數據
 /*** 添加文檔(升級改造):使用對象作為數據*/@Testvoid addDoc2() throws IOException {movice movice = new movice();movice.setId(1); //此為索引IDmovice.setTitle("國產動作電影(我被修改了)");movice.setPrice(40);movice.setAddress("香港");//將對象轉換為jsonString data = JSON.toJSONString(movice);// 獲取操作文檔的對象:文檔的ID設置為1IndexRequest request = new IndexRequest("movice").id("1").source(data,XContentType.JSON);IndexResponse response = client.index(request, RequestOptions.DEFAULT);//索引IDSystem.out.println(response.getId());}

9.4.2 修改文檔

還是添加相關的操作,只不過若添加的時候,ID已經存在了,就會被修改。不存在就會創建新的

9.4.3 根據ID查詢文檔

    /*** 查詢文檔:根據ID查詢*/@Testvoid queryDoc2() throws IOException {//GetRequest getrequest = new GetRequest("movice"); //指定索引名稱GetRequest getrequest = new GetRequest("1"); //指定索引IDGetResponse response = client.get(getrequest, RequestOptions.DEFAULT);//將對象的source部分數據以字符串的形式處理,前面是以map形式處理System.out.println(response.getSourceAsString());}

response相應也就是這一部分數據。
在這里插入圖片描述

9.4.4 刪除文檔

 /*** 根據ID刪除文檔*/@Testvoid deleteDoc2() throws IOException {DeleteRequest request = new DeleteRequest("1");DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);//獲取數據中的_id,注意不是_source中的id哦System.out.println(response.getId());}

我們可能會疑惑,這個response到底是什么數據,這就是response全部數據,我們可以獲取_id,_source,_index等等,但是直接
在這里插入圖片描述

總結:其實可以發現,使用代碼進行索引,文檔的操作時候。一定要了解5-8章節的細節:如何指定ID查詢,增刪查操作返回的數據。然后再去看代碼,一一對照。
在代碼中

  1. 先獲得RestHighLevelClient對象 client(熟記如何獲取)
  2. 上述所操作的類梳理在這里插入圖片描述
    非常清晰的看到如何使用代碼操作ES。

在下一篇文章將會介紹更高級的操作,熟悉企業開發。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/34709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34709.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

行業追蹤,2023-08-09

自動復盤 2023-08-09 凡所有相&#xff0c;皆是虛妄。若見諸相非相&#xff0c;即見如來。 k 線圖是最好的老師&#xff0c;每天持續發布板塊的rps排名&#xff0c;追蹤板塊&#xff0c;板塊來開倉&#xff0c;板塊去清倉&#xff0c;丟棄自以為是的想法&#xff0c;板塊去留讓…

linux學習——Redis基礎

目錄 一、noSQL 類型 特點及應用場景 二、Redis 三、安裝方式 編譯安裝 rpm安裝 四、目錄結構 /etc/redis.conf 五、Redis命令 六、本地登錄和遠程登錄 本地登錄 遠程登錄 七、數據庫操作 幫助信息 庫操作 數據操作 八、Redis持久化 一、RDB類型 二、AOF模式 一…

2023河南萌新聯賽第(四)場:河南大學 F - 小富的idea

2023河南萌新聯賽第&#xff08;四&#xff09;場&#xff1a;河南大學 F - 小富的idea 時間限制&#xff1a;C/C 1秒&#xff0c;其他語言2秒 空間限制&#xff1a;C/C 262144K&#xff0c;其他語言524288K 64bit IO Format: %lld 題目描述 要注意節約 卷王小富最近又在內卷&a…

密碼檢查-C語言/Java

描述 小明同學最近開發了一個網站&#xff0c;在用戶注冊賬戶的時候&#xff0c;需要設置賬戶的密碼&#xff0c;為了加強賬戶的安全性&#xff0c;小明對密碼強度有一定要求&#xff1a; 1. 密碼只能由大寫字母&#xff0c;小寫字母&#xff0c;數字構成&#xff1b; 2. 密碼不…

偽類和偽元素有何區別?

聚沙成塔每天進步一點點 ? 專欄簡介? 偽類&#xff08;Pseudo-class&#xff09;? 偽元素&#xff08;Pseudo-element&#xff09;? 區別總結? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前…

信號調制原理演示,模擬和數字調制技術大比拼

【中英雙語字幕】信號調制原理演示&#xff0c;模擬和數字調制技術大比拼&#xff01;_嗶哩嗶哩_bilibili

騰訊云輕量應用服務器Typecho應用模板搭建博客流程

騰訊云百科分享使用騰訊云輕量應用服務器Typecho應用模板搭建博客流程&#xff0c;Typecho 是開源的博客建站平臺&#xff0c;具有輕量、高效、穩定等特點&#xff0c;操作界面簡潔友好。該鏡像基于 CentOS 7.6 64 位操作系統&#xff0c;并已預置 Nginx、PHP、MariaDB 軟件。您…

4.0 Python 變量與作用域

在python中&#xff0c;變量的作用域決定了變量在哪些位置可以被訪問。一個程序中的變量并不是所有的地方都可以訪問的&#xff0c;其訪問權限決定于變量的賦值位置。python中有兩種最基本的變量作用域&#xff1a;局部作用域和全局作用域。局部變量是在函數內部定義的變量&…

day24-106.從中序與后序遍歷序列構造二叉樹

106.從中序與后序遍歷序列構造二叉樹 力扣題目鏈接(opens new window) 根據一棵樹的中序遍歷與后序遍歷構造二叉樹。 注意: 你可以假設樹中沒有重復的元素。 例如&#xff0c;給出 中序遍歷 inorder [9,3,15,20,7]后序遍歷 postorder [9,15,7,20,3] 返回如下的二叉樹&am…

前端跨域問題解決方法

跨域是WEB瀏覽器專有的同源限制訪問策略。(后臺接口調用和postman等工具會出現) 跨源資源共享&#xff08;CORS&#xff0c;或通俗地譯為跨域資源共享&#xff09;是一種基于 HTTP 頭的機制&#xff0c;該機制通過允許服務器標示除了它自己以外的其他源&#xff08;域、協議或端…

java項目打包運行報異常:Demo-1.0-SNAPSHOT.jar中沒有主清單屬性

檢查后發現pom文件中有錯誤&#xff0c;需要添加build內容才能恢復正常。 添加下面文件后再次啟動恢復正常。 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactI…

C語言atoi函數將字符串類型轉換為整型

atoi() 是C標準庫中的一個函數&#xff0c;用于將字符串轉換為整數。函數原型如下&#xff1a; int atoi(const char *str); 參數 str 是一個指向要轉換的字符串的指針。atoi() 函數會嘗試將字符串中的數字部分轉換為整數&#xff0c;并返回轉換后的整數值。如果字符串中不僅包…

Add-in Express for Microsoft Office and Delphi Crack

Add-in Express for Microsoft Office and Delphi Crack 適用于Microsoft Office和Delphi VCL的Add-in Express使您能夠在幾次點擊中為Microsoft Office開發專業插件。它生成基于COM的項目&#xff0c;這些項目包含Microsoft Office外接程序或智能標記的所有必要功能&#xff0…

CTFshow web93-104關

這周要學習的是php代碼審計 根據師兄的作業 來做web入門的93-104關 93關 看代碼 進行分析 他的主函數 include("flag.php"); highlight_file(__FILE__); if(isset($_GET[num])){ $num $_GET[num]; if($num4476){ die("no no no!"); …

認識http的方法、Header、狀態碼以及簡單實現一個http的業務邏輯

文章目錄 http的方法http狀態碼http重定向http常見Header實現簡單業務邏輯Protocol.hppUtil.hppServer.hppServer.cc 效果 http的方法 方法說明支持的HTTP版本GET獲取資源1.0/1.1POST傳輸實體主體1.0/1.1PUT傳輸文件1.0/1.1HEAD獲得報文首部1.0/1.1DELETE刪除文件1.0/1.1OPTIO…

【ts】【cocos creator】excel表格轉JSON

需要將表格導出為text格式放到項目resources/text文件夾下 新建場景&#xff0c;掛載到Canvas上運行 表格文件格式&#xff1a; 保存格式選text tableToJson : import CryptoJS require(./FileSaver);const { ccclass, property } cc._decorator;ccclass export default c…

SpringBoot案例-部門管理-新增

根據頁面原型&#xff0c;明確需求 頁面原型 需求 閱讀接口文檔 接口文檔鏈接如下&#xff1a; 【騰訊文檔】SpringBoot案例所需文檔 https://docs.qq.com/doc/DUkRiTWVaUmFVck9N 思路分析 前端在輸入要新增的部門名稱后&#xff0c;會以JSON格式將數據傳入至后端&#xf…

SpringBoot 3.x整合Fluent Mybatis極簡流程

此為基礎配置&#xff0c;不包括其他高級配置&#xff0c;需要其他高級配置請查閱官方文檔&#xff1a;[fluent mybatis特性總覽 - Wiki - Gitee.com](https://gitee.com/fluent-mybatis/fluent-mybatis/wikis/fluent mybatis特性總覽) 版本信息 Spring Boot 版本&#xff1a…

C語言創建目錄(文件夾)之mkdir

一、mkdir 說明&#xff1a;創建目錄。 頭文件庫&#xff1a; #include <sys/stat.h> #include <sys/types.h>函數原型&#xff1a; int mkdir(const char *pathname, mode_t mode);mode方式&#xff1a;可多個權限相或&#xff0c;如0755表示S_IRWXU | S_IRGRP…

undefined reference to `dlopen‘ ‘SSL_library_init‘ `X509_certificate_type‘

使用Crow的時候需要注意crow依賴asio依賴OpenSSL&#xff0c;asio要求1.22以上版本&#xff0c;我使用的是1.26.0&#xff1b; 這個版本的asio要求OpenSSL是1.0.2&#xff0c;其他版本我得機器上編不過&#xff0c;ubuntu上默認帶的OpenSSL是1.1.1; 所以我下載了OPENSSL1.2.0重…