ElasticSearch - 1 概述 & 指令碼操作
ElasticSearch - 1 概述 & 指令碼操作
1.1 基於資料庫查詢的問題
-
效能低 最左匹配原則
-
功能弱
-
- 查詢“華為手機”
資料結構和演算法演示網站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
1.2 倒排索引 (重點)
倒排索引:將文件進行分詞,形成詞條和id的對應關係即為反向索引
以唐詩為例,所處包含“前”的詩句 正向索引:由《靜夜思》-->窗前明月光--->“前”字 反向索引:“前”字-->窗前明月光-->《靜夜思》 反向索引的實現就是對詩句進行分詞,分成單個的詞,由詞推據,即為反向索引 “床前明月光”--> 分詞 將一段文字按照一定的規則,拆分為不同的詞條(term)
1.3 ES儲存和查詢的原理 (重點)
空間換時間
**
**
生成的倒排索引中,詞條會排序,形成一顆樹形結構,提升詞條的查詢速度
1. 使用“華為”作為關鍵字查詢
華為:1,3
2. 使用“華為手機”作為關鍵字查詢
華為:1,3
手機:1,2,3
1.4 ES概念詳解
-
ElasticSearch是一個基於Lucene的搜尋伺服器
-
-
是一個分散式、高擴充套件、高實時的搜尋與資料分析引擎
-
基於RESTful web介面
-
Elasticsearch是用Java語言開發的,並作為Apache許可條款下的開放原始碼釋出,是一種流行的企業級搜尋引擎
-
應用場景
-
- 搜尋:海量資料的查詢
- 日誌資料分析 ELK
- 實時資料分析
-
ES和MySql分工不同
2 ES及輔助工具的安裝
2.1 ES的安裝
2.1.1 方案一:原生的安裝方式
參見安裝文件
2.1.2 方案二:使用提供的虛擬機器
- 安裝ES
開啟ES服務
docker start elasticsearch
如果啟動等一會(兩分鐘)後沒有反應,重啟docker後再次啟動es
# 重啟docker服務 systemctl restart docker # 重啟ES服務 docker start elasticsearch
測試地址:http://192.168.31.130:9200/
- 安裝Kibana
注意:一定要等ES啟動完成之後,再啟動kibana
啟動kibana
docker start kibana
測試地址:http://192.168.31.130:5601/
3 ElasticSearch核心概念(重點)
-
索引(index)
-
- ElasticSearch儲存資料的地方,可以理解成關係型資料庫中的資料庫概念。
-
對映(mapping)
-
- mapping定義了每個欄位的名稱、型別、欄位所使用的分詞器等。相當於關係型資料庫中的表結構。
-
文件(document)
-
- Elasticsearch中的最小資料單元,常以json格式顯示。一個document相當於關係型資料庫中的一行資料。
-
倒排索引
-
- 一個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,對應一個包含它的文件id列表。
-
型別(type) (瞭解)
-
- 一種type就像一類表。如使用者表、角色表等。在Elasticsearch7.X預設type為_doc
- ES 5.x中一個index可以有多種type
- ES 6.x中一個index只能有一種type
- ES 7.x以後,將逐步移除type這個概念,現在的操作已經不再使用,預設_doc
4 指令碼操作ES
4.1 RESTful風格介紹
-
REST(Representational State Transfer),表述性狀態轉移,是一組架構約束條件和原則。滿足這些約束條件和原則的應用程式或設計就是RESTful。就是一種定義介面的規範。
-
基於HTTP。
-
使用XML格式定義或JSON格式定義。
-
每一個URI代表1種資源。
-
客戶端使用GET、POST、PUT、DELETE 4個表示操作方式的動詞對服務端資源進行操作:
-
- GET:用來獲取資源
- POST:用來新建資源(也可以用於更新資源)
- PUT:用來更新資源
- DELETE:用來刪除資源
4.2 操作索引
PUT
http://ip:埠/索引名稱
查詢
GET http://ip:埠/索引名稱 # 查詢單個索引資訊
GET http://ip:埠/索引名稱1,索引名稱2... # 查詢多個索引資訊
GET http://ip:埠/_all # 查詢所有索引資訊
刪除索引
DELETE http://ip:埠/索引名稱
關閉、開啟索引
POST http://ip:埠/索引名稱/_close
POST http://ip:埠/索引名稱/_open
4.3 ES資料型別
簡單資料型別
-
字串
-
- text:會分詞,不支援聚合
- keyword:不會分詞,將全部內容作為一個詞條,支援聚合
聚合:相當於mysql 中的sum(求和)
-
數值
-
-
布林:boolean
-
二進位制:binary
-
範圍型別
-
- integer_range, float_range, long_range, double_range, date_range
-
日期:date
複雜資料型別
- 陣列:[ ] Nested:
nested
(for arrays of JSON objects 陣列型別的JSON物件) - 物件:{ } Object: object(for single JSON objects 單個JSON物件)
4.4 操作對映(熟練)
新增對映
PUT person
GET person
#新增對映
PUT /person/_mapping
{
"properties":{
"name":{
"type":"text"
},
"age":{
"type":"integer"
}
}
}
建立索引並新增對映
#建立索引並新增對映
PUT /person1
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}
GET person1/_mapping
新增欄位
#新增欄位
PUT /person1/_mapping
{
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
4.5 操作文件(熟練)
查詢所有文件
#查詢所有文件
GET /person1/_search
根據id查詢文件
GET /person1/_doc/1
新增文件,指定id
# POST 和 PUT 均可
POST /person1/_doc/2
{
"name":"張三",
"age":18,
"address":"北京"
}
新增文件,不指定id
#新增文件,不指定id
POST /person1/_doc/
{
"name":"張三",
"age":18,
"address":"北京"
}
刪除指定id文件
#刪除指定id文件
DELETE /person1/_doc/1