目錄
ElasticSearch
介紹
安裝
安裝kibana
ES客戶端安裝
頭文件包含和編譯時鏈接庫
ES核心概念
索引(Index)
類型(Type)
字段(Field)
映射(mapping)
文檔(document)
ES對比MySQL
Kibana訪問ES測試
創建索引庫
新增數據
查看并搜索數據
刪除索引
ES客戶端接口介紹
ES二次封裝(elasticSearch.hpp)
Json序列化
Json反序列化
創建索引(庫)
插入數據
刪除數據
數據搜索(查詢)
二次封裝測試
ES客戶端操作句柄獲取封裝
cpp-httplib
介紹
安裝
頭文件和鏈接庫
類于接口介紹
HTTP請求類
HTTP應答類
HTTP服務器類
HTTP客戶端類
使用樣例
websocketpp
Websocket協議介紹
Websocketpp介紹
WebSocketpp安裝
類與接口
日志等級
狀態碼
數據幀類型
消息緩沖區
HTTP請求解析
connect連接后的相關操作(對請求進行響應)
服務器
endpoint(服務端/客戶端的管理)
redis
介紹
安裝
頭文件包含和編譯時鏈接庫
接口介紹
Redis++客戶端操作句柄獲取封裝
本章主要是學習和使用本項目中所需使用到的一些框架。
ElasticSearch
介紹
ElasticSearch,簡稱ES,是一個開源分布式搜索引擎。
它的特點有:分布式、零配置、自動發現、索引自動分片、索引副本機制、restful風格接口、多數據源、自動搜索負載等。
ES是面向文檔的,意味著它可以存儲整個對象或文檔。
它不僅僅是存儲,還會索引每個文檔的內容,使之可以被搜索。
在ES中,可以對文檔進行索引、搜索、排序、過濾。
安裝
# 添加倉庫秘鑰
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -# 添加鏡像源倉庫
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elasticsearch.list # 更新軟件包列表
sudo apt update # 安裝es
sudo apt-get install elasticsearch=7.17.21 # 啟動es
sudo systemctl start elasticsearch # 安裝ik分詞器插件
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install
https://get.infini.cloud/elasticsearch/analysis-ik/7.17.21
啟動ES報錯:
解決辦法:
調整ES虛擬內存,虛擬內存默認最大映射數為65530,無法滿足ES系統要求, 需要調整為262144以上。
sudo sysctl -w vm.max_map_count=262144
在 /etc/elasticsearch/jvm.options中新增:
再次啟動ES:成功。
但是我自己重新弄的時候,一直啟動失敗,后續查看日志發現:
sudo vim /var/log/elasticsearch/elasticsearch.log
前面下載的分詞器,和當前版本不兼容(我的ES升級了,所以不兼容),于是尋找解決方案:刪除舊版本分詞器,下載與當前elasticsearch匹配的分詞器:
sudo rm -rf /usr/share/elasticsearch/plugins/analysis-iksudo /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.25/elasticsearch-analysis-ik-7.17.25.zipsudo systemctl restart elasticsearch.service
此時才完美解決。
驗證ES是否安裝啟動成功:
curl -X GET "http://localhost:9200/"
設置外網訪問,如果新配置完成的話,默認只能在本機進行訪問:
sudo vim /etc/elasticsearch/elasticsearch.yml
此時用瀏覽器訪問 "localhost:9200":
安裝kibana
Kibana 是一個開源的數據可視化工具,專門為 Elasticsearch 設計。它提供了一個用戶友好的界面,用于搜索、查看和分析存儲在 Elasticsearch 中的數據。Kibana 通常與 Elasticsearch 一起使用,是 Elastic Stack(以前稱為 ELK Stack,包括 Elasticsearch、Logstash 和 Kibana)的核心組件之一。
在瀏覽器上訪問:"localhost:5601"。
命令安裝:
sudo apt install kibana配置 Kibana(可選):
根據需要配置 Kibana。配置文件通常位于 /etc/kibana/kibana.yml。可能需要
設置如服務器地址、端口、Elasticsearch URL 等。
sudo vim /etc/kibana/kibana.yml
例如,你可能需要設置 Elasticsearch 服務的 URL: 大概32行左右
elasticsearch.host: "http://localhost:9200"
ES客戶端安裝
sudo apt-get install libmicrohttpd-dev # 克隆代碼
git clone https://github.com/seznam/elasticlient # 切換目錄
cd elasticlient # 更新子模塊
git submodule update --init --recursive # 編譯代碼
mkdir build
cd build
cmake ..
make # 安裝
make install # make的時候編譯出錯,這是子模塊googletest沒有編譯安裝
# 解決: 手動安裝子模塊
cd ../external/googletest/
mkdir cmake && cd cmake/
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make && sudo make install # 安裝好了 再次 cmake即可
頭文件包含和編譯時鏈接庫
頭文件
#include <cpr/response.h>
#include <elasticlient/client.h>
庫:
-lcpr -lelasticlient
ES核心概念
索引(Index)
一個索引就是一個擁有幾分相似特征的文檔的集合。
比如說,你可以有一個客戶數據 的索引,一個產品目錄的索引,還有一個訂單數據的索引。
一個索引由一個名字來標 識(必須全部是小寫字母的),并且當我們要對應于這個索引中的文檔進行索引、搜索、 更新和刪除的時候,都要使用到這個名字。
類型(Type)
在一個索引中,你可以定義一種或多種類型。
一個類型是你的索引的一個邏輯上的分 類/分區,其語義完全由你來定。
通常,會為具有一組共同字段的文檔定義一個類型。
比如說,我們假設你運營一個博客平臺并且將你所有的數據存儲到一個索引中。在這 個索引中,你可以為用戶數據定義一個類型,為博客數據定義另一個類型,為評論數 據定義另一個類型......
字段(Field)
分類 | 類型 | 備注 |
字符串 | text、keyword | text會被分詞生成索引。 keyword不會被分詞生成索引,只能精確搜索。 |
整形 | integer、long、short、byte | |
浮點 | double、float | |
邏輯 | boolean | true 或者 false |
日期 | date、date_nanos | “2018-01-13” 或 “2018-01-13 12:10:30” 或者時間戳,即1970到現在的秒數/毫秒數 |
二進制 | binary | 二進制通常只存儲,不索引。 |
范圍 | range |
映射(mapping)
映射是在處理數據的方式和規則方面做一些限制,如某個字段的數據類型、默認值、 分析器、是否被索引等等。
其它就是處理es里面數據 的一些使用規則設置也叫做映射,按著最優規則處理數據對性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能對性能更好。
名稱 | 數值 | 備注 |
enabled | true(默認)、false | 是否僅作存儲,不做搜索和分析。 |
index | true(默認)、false | 是否構建倒排鎖芯(決定了是否分詞,是否被索引)。 |
index_option | ||
dynamic | true(默認)、false | 控制mapping的自動更新。 |
doc_value | true(默認)、false | 是否開啟doc_value,用戶聚合和排序分析,分詞字段不能使用。 |
fielddata | "fielddata" : {"format" : "disabled"} | 是否為text類型啟動fielddata,實現排序和 聚合分析。 針對分詞字段,參與排序或聚合時能提高性 能。 不分詞字段統一建議使用doc_value。 |
store | true、false(默認) | 是否單獨設置此字段的是否存儲,儲而從 _source 字段中分離。 只能搜索,不能獲取值。 |
coerce | true(默認)、false | 是否開啟自動數據類型轉換功能。 比如:字符串轉數字,浮點轉整型 |
analyzer | "analyzer" : "ik" | 指定分詞器,默認分詞器是standard analyzer |
boost | "boost" : 1.23 | 字段級別的分數加權,默認值是1.0 |
fields | "fields" : { "raw" : { "type": "text", "index": "not_analyzed", } } | 對一個字段提供多種索引模式。 同一個字段的值,一個分詞,一個不分詞。 |
data_detection | true(默認)、false | 是否自動識別日期類型 |
文檔(document)
一個文檔是一個可被索引的基礎信息單元。
比如,你可以擁有某一個客戶的文檔,某 一個產品的一個文檔或者某個訂單的一個文檔。
文檔以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯網數據交互格式。
在一個 index/type 里面,你可以存儲任意多的文檔。
一個文檔必須被索引或者賦予一個索引 的type。
ES對比MySQL
MySQL | ES | 說明 |
Database | Index | 最頂層的邏輯容器。 |
Table | Type (ES 7.x之后) | 存儲結構化數據的單元。 |
Row | Document | 一條記錄。 |
Column | Field | 數據字段。 |
Schema | Mapping | 定義數據結構。 |
Index(索引) | Inverted Index | 加速查詢的數據結構。 |
SQL | Query DSL | 查詢語言。 |
Primary Key | _id | 唯一標識符。 |
分庫分表 | Shard | 數據分片。 |
主從復制 | Replica Shard | 數據復制和高可用性。 |
事務 | 版本控制 | 數據一致性機制。 |
全文搜索 | 核心功能 | ES 專為全文搜索設計,功能更強大。 |
Kibana訪問ES測試
創建索引庫
POST /user/_doc
{ "settings" : { "analysis" : { "analyzer" : { "ik" : { "tokenizer" : "ik_max_word" } } } }, "mappings" : { "dynamic" : true, "properties" : { "nickname" : { "type" : "text","analyzer" : "ik_max_word" }, "user_id" : { "type" : "keyword", "analyzer" : "standard" }, "phone" : { "type" : "keyword", "analyzer" : "standard" }, "description" : { "type" : "text", "enabled" : false }, "avatar_id" : { "type" : "keyword" ,"enabled" : false } } }
}
新增數據
POST /user/_doc/_bulk
{"index":{"_id":"1"}}
{"user_id" : "USER4b862aaa-2df8654a-7eb4bb65e3507f66","nickname" : "昵稱1","phone" : "手機號1","description" : "簽名1","avatar_id" : "頭像1"}
{"index":{"_id":"2"}}
{"user_id" : "USER14eeeaa5-442771b9-0262e455e4663d1d","nickname" : "昵稱2","phone" : "手機號2","description" : "簽名2","avatar_id" : "頭像2"}
{"index":{"_id":"3"}}
{"user_id" : "USER484a6734-03a124f0-996c169dd05c1869","nickname" : "昵稱3","phone" : "手機號3","description" : "簽名3","avatar_id" : "頭像3"}
{"index":{"_id":"4"}}
{"user_id" : "USER186ade83-4460d4a6-8c08068f83127b5d","nickname" : "昵稱4","phone" : "手機號4","des