原文鏈接:https://ropledata.blog.csdn.net/article/details/106423578
一、前言
本文版本說明:
- ElasticSearch版本:7.7 (目前最新版)
- Kibana版本:7.7(目前最新版)
ElasticSearch在實際生產里通常和LogStash,Kibana,FileBeat一起構成Elastic Stack來使用,它是這些組件里面最核心的一個。因此學好ElasticSearch的必要性不言而喻,但是由於ElasticSearch官方更新太過頻繁且文檔陳舊,同時在Linux下安裝配置的過程較繁雜,不利於入門使用。
為了幫助大家快速入門ElasticSearch,並掌握ElasticSearch和Kibana的使用。本文會把最新版的ElasticSearch的知識點用通俗易懂的語言來展現,並會在核心概念上和MySql對比,同時給大家介紹百分百成功的極速安裝配置方法,讓大家可以把時間更多的用在技術研究上。
注意:下文咱們把ElasticSearch簡稱為ES,對可能出現的疑問進行標紅並解釋。
二、ES的概念及使用場景
ElasticSearch是一個分布式,高性能、高可用、可伸縮、RESTful 風格的搜索和數據分析引擎。通常作為Elastic Stack的核心來使用,Elastic Stack大致是如下這樣組成的:
ES是一個近實時(NRT)的搜索引擎,一般從添加數據到能被搜索到只有很少的延遲(大約是1s),而查詢數據是實時的。一般我們可以把ES配合logstash,kibana來做日志分析系統,或者是搜索方面的系統功能,比如在網上商城系統里實現搜索商品的功能也會用到ES。
疑問一:搜索商品的時候為啥要用ES呢?用sql的like進行模糊查詢,它不香嗎?
我們假設一個場景:我們要買蘋果吃,咱們想買天水特產的花牛蘋果,然后在搜索框輸入
天水花牛蘋果
,這時候咱們希望搜索到所有的售賣天水花牛蘋果的商家,但是如果咱們技術上根據這個天水花牛蘋果
使用sql的like模糊查詢,是不能匹配到諸如天水特產花牛蘋果
,天水正宗,果園直送精品花牛蘋果
這類的不連續的店鋪的。所以sql的like進行模糊查詢來搜索商品還真不香!
三、基本概念
很多人第一次學習ES,看到基本概念后瞬間懵逼了,這是啥玩意呀,亂七八糟!別急,我整理了一下ES和mysql相關的基本概念的對比表格,先看一下:
ES | MySql |
---|---|
字段 | 列 |
文檔 | 一行數據 |
類型(已廢棄) | 表 |
索引 | 數據庫 |
看完這個表格后,建議像背單詞那樣蓋住右半部分的MySql,通過左邊的概念來聯想在MySql里的概念,加深記憶!
然后我們組合起來,所謂ES里的數據其實就是指索引下的類型里面的JSON格式的數據。
下面我們對這些概念分別進行詳細的解釋:
3.1、文檔(Document)
-
我們知道Java是面向對象的,而Elasticsearch是面向文檔的,也就是說文檔是所有可搜索數據的最小單元。ES的文檔就像MySql中的一條記錄,只是ES的文檔會被序列化成json格式,保存在Elasticsearch中;
-
這個json對象是由字段組成,字段就相當於Mysql的列,每個字段都有自己的類型(字符串、數值、布爾、二進制、日期范圍類型);
-
當我們創建文檔時,如果不指定字段的類型,Elasticsearch會幫我們自動匹配類型;
-
每個文檔都有一個ID,類似MySql的主鍵,咱們可以自己指定,也可以讓Elasticsearch自動生成;
-
文檔的json格式支持數組/嵌套,在一個索引(數據庫)或類型(表)里面,你可以存儲任意多的文檔。
注意:雖然在實際存儲上,文檔存在於某個索引里,但是文檔必須被賦予一個索引下的類型才可以。
3.2、類型(Type)
類型就相當於MySql里的表,我們知道MySql里一個庫下可以有很多表,最原始的時候ES也是這樣,一個索引下可以有很多類型,但是從6.0版本開始,type已經被逐漸廢棄,但是這時候一個索引仍然可以設置多個類型,一直到7.0版本開始,一個索引就只能創建一個類型了(_doc)。這一點,大家要注意,網上很多資料都是舊版本的,沒有對這點進行說明。
3.3、索引(Index)
- 索引就相當於MySql里的數據庫,它是具有某種相似特性的文檔集合。反過來說不同特性的文檔一般都放在不同的索引里;
- 索引的名稱必須全部是小寫;
- 在單個集群中,可以定義任意多個索引;
- 索引具有mapping和setting的概念,mapping用來定義文檔字段的類型,setting用來定義不同數據的分布。
除了這些常用的概念,我們還需要知道節點概念的作用,因此咱們接着往下看!
3.4、節點(node)
- 一個節點就是一個ES實例,其實本質上就是一個java進程;
- 節點的名稱可以通過配置文件配置,或者在啟動的時候使用
-E node.name=ropledata
指定,默認是隨機分配的。建議咱們自己指定,因為節點名稱對於管理目的很重要,咱們可以通過節點名稱確定網絡中的哪些服務器對應於ES集群中的哪些節點; - ES的節點類型主要分為如下幾種:
- Master Eligible節點:每個節點啟動后,默認就是Master Eligible節點,可以通過設置
node.master: false
來禁止。Master Eligible可以參加選主流程,並成為Master節點(當第一個節點啟動后,它會將自己選為Master節點);注意:每個節點都保存了集群的狀態,只有Master節點才能修改集群的狀態信息。 - Data節點:可以保存數據的節點。主要負責保存分片數據,利於數據擴展。
- Coordinating 節點:負責接收客戶端請求,將請求發送到合適的節點,最終把結果匯集到一起
- Master Eligible節點:每個節點啟動后,默認就是Master Eligible節點,可以通過設置
- 注意:每個節點默認都起到了Coordinating node的職責。一般在開發環境中一個節點可以承擔多個角色,但是在生產環境中,還是設置單一的角色比較好,因為有助於提高性能。
3.5、分片(shard)
了解分布式或者學過mysql分庫分表的應該對分片的概念比較熟悉,ES里面的索引可能存儲大量數據,這些數據可能會超出單個節點的硬件限制。
為了解決這個問題,ES提供了將索引細分為多個碎片的功能,這就是分片。這里咱們可以簡單去理解,在創建索引時,只需要咱們定義所需的碎片數量就可以了,其實每個分片都可以看作是一個完全功能性和獨立的索引,可以托管在集群中的任何節點上。
疑問二:分片有什么好處和注意事項呢?
- 通過分片技術,咱們可以水平拆分數據量,同時它還支持跨碎片(可能在多個節點上)分布和並行操作,從而提高性能/吞吐量;
- ES可以完全自動管理分片的分配和文檔的聚合來完成搜索請求,並且對用戶完全透明;
- 主分片數在索引創建時指定,后續只能通過Reindex修改,但是較麻煩,一般不進行修改。
3.6、副本分片(replica shard)
熟悉分布式的朋友應該對副本對概念不陌生,為了實現高可用、遇到問題時實現分片的故障轉移機制,ElasticSearch允許將索引分片的一個或多個復制成所謂的副本分片。
疑問三:副本分片有什么作用和注意事項呢?
當分片或者節點發生故障時提供高可用性。因此,需要注意的是,副本分片永遠不會分配到復制它的原始或主分片所在的節點上;
可以提高擴展搜索量和吞吐量,因為ES允許在所有副本上並行執行搜索;
默認情況下,ES中的每個索引都分配5個主分片,並為每個主分片分配1個副本分片。主分片在創建索引時指定,不能修改,副本分片可以修改。
看到這里,各位一定對ES有所了解了,那么接下來就是安裝配置並使用了!有不少朋友初學時查閱資料,選擇安裝win版本,這里我不推薦,因為實際工作中,ES不可能安裝在win下。但是根據官方文檔安裝Linux版本時,又會遇到各種奇葩問題,咋辦呢?別急,我這里有一本極速安裝方法,百分百不出錯,咱們接着往下看!
四、極速安裝配置
咱們如果想很爽的使用ES,需要安裝3個東西:ES、Kibana、ElasticSearch Head。通過Kibana可以對ES進行便捷的可視化操作,通過ElasticSearch Head可以查看ES的狀態及數據,可以理解為ES的圖形化界面。
那如何進行極速且不出錯的安裝配置呢?答案很簡單,站在巨人的肩膀上!用docker啟動前輩們已經配置好的ES環境不就可以了嗎?!咱們做開發的應該把時間花在刀刃上,而不是花費大量時間去安裝配置。
首先開始安裝ES、Kibana,同時安裝這兩個加啟動,一共需要3步,3行代碼搞定:
-
搜索docker鏡像庫里可用的ES鏡像:
docker search elasticsearch
可以看到,stars排名第一的是官方的ES鏡像,第二是大牛已經融合了ES7.7和Kibana7.7的鏡像,那咱們就用第二個了。
-
把這個鏡像從鏡像庫拉下來:
docker pull nshou/elasticsearch-kibana
-
最后咱們把鏡像啟動為容器就可以了,端口映射保持不變,咱們給這個容器命名為eskibana,到這里ES和Kibana就安裝配置完成了!容器啟動后,它們也就啟動了,一般不會出錯,是不是非常方便?節省大把時間放到開發上來,這也是我一直推薦docker的原因。
docker run -d -p 9200:9200 -p 9300:9300 -p 5601:5601 --name eskibana nshou/elasticsearch-kibana
咱們還需要安裝ElasticSearch Head,它相當於是ES的圖形化界面,這個更簡單,它是一個瀏覽器的擴展程序,直接在chrome瀏覽器擴展程序里下載安裝即可:
-
打開chrome瀏覽器,在擴展程序chrome應用商店那里,搜索elasticsearch:
-
選擇ElasticSearch Head,點擊
添加至Chrome
,進行擴展程序的安裝即可:
到這里咱們的ES、Kibana、ElasticSearch Head都已經安裝完成了,下面咱們驗證一下,看是否安裝成功!
-
驗證ES:
打開瀏覽器,輸入IP:端口,比如我的:
http://127.0.0.1:9200/
,然后就看到了那句經典的:You Know, for Search:
-
驗證Kibana:
打開瀏覽器,輸入Kibana的IP:端口,比如我的:
http://127.0.0.1:5601/
,然后會看到如下界面:
這里面可以提供很多模擬數據,感興趣的可以自己玩玩,咱們學習期間只要使用左下角那個扳手形狀的Dev Tools就可以了,點擊后,會出現如下界面:
-
驗證ES Head:
這個更簡單,只需要點擊之前咱們安裝的那個擴展程序圖標就可以了:
點擊信息,還可以看到集群或者索引的信息,很方便,大家沒事可以玩一玩,熟悉一下:
通過驗證,我們已經全部安裝配置成功了,那么接下來,就讓我們一起練習一下基礎的增刪改查,加深對ES的理解吧!
五、基礎使用
前面我們已經介紹過了ES 是RESTful 風格的系統,所以我們需要先掌握RESTful 的四個關鍵詞:PUT(修改),POST(添加),DELETE(刪除),GET(查詢)。其中在ES里面PUT和POST的界限並不是很分明,有時候PUT也作為添加。
好了,下面就開始愉快的code吧~
5.1、索引基礎操作
-
創建一個空索引
如下代碼,咱們創建了一個0副本2分片的ropledata索引,然后咱們可以在Elasticsearch Head里刷新一下,並查看索引的信息:
PUT /ropledata { "settings": { "number_of_shards": "2", "number_of_replicas": "0" } }
-
修改副本
咱們如果對剛才創建的索引副本數量不滿意,可以進行修改,注意:分片不允許修改。
PUT ropledata/_settings { "number_of_replicas" : "2" }
-
刪除索引
當這個索引不想用了,可以進行刪除,執行如下命令即可,執行成功后,刷新ElasticSearch Head可以看到剛才創建的ropledata索引消失了:
DELETE /ropledata
5.2、數據增刪改查
-
插入數據
插入數據的時候可以指定id,如果不指定的話,ES會自動幫我們生成。我們以指定id為例,如下代碼是我們創建了一個101的文檔,創建成功后,可以在Elasticsearch Head的數據瀏覽模塊里看到這些數據,代碼及演示如下:
//指定id POST /ropledata/_doc/101 { "id":1, "name":"且聽_風吟", "page":"https://ropledata.blog.csdn.net", "say":"歡迎點贊,收藏,關注,一起學習" }
-
修改數據
這里大家要特別注意,ES里的文檔是不可以修改的,但是可以覆蓋,所以ES修改數據本質上是對文檔的覆蓋。ES對數據的修改分為全局更新和局部更新,咱們分別進行code並對比:
-
全局更新
PUT /ropledata/_doc/101 { "id":1, "name":"且聽_風吟", "page":"https://ropledata.blog.csdn.net", "say":"再次歡迎點贊,收藏,關注,一起學習" }
大家可以多全局更新幾次,會發現每次全局更新之后這個文檔的
_version
都會發生改變!
-
局部更新
POST /ropledata/_update/101 { "doc": { "say":"奧力給" } }
這時候我們可以多次去執行上面的局部更新代碼,會發現除了第一次執行,后續不管又執行了多少次,
_version
都不再變化!
疑問四:局部更新的時候ES底層的流程是怎樣的?和全局更新相比性能怎么樣?
局部更新的底層流程:
- 內部先獲取到對應的文檔;
- 將傳遞過來的字段更新到文檔的json中(這一步實質上也是一樣的);
- 將老的文檔標記為deleted(到一定時候才會物理刪除);
- 將修改后的新的文檔創建出來。
性能對比:
- 全局更新本質上是替換操作,即使內容一樣也會去替換;
- 局部更新本質上是更新操作,只有遇到新的東西才更新,沒有新的修改就不更新;
- 局部更新比全局更新的性能好,因此推薦使用局部更新。
-
-
查詢數據
ES的數據查詢知識點非常多,也非常復雜,后面我打算單獨講解演示,本文只展示最基本的根據id搜索數據的code:
GET /ropledata/_doc/101
-
刪除數據
比如我們想把ropledata索引下的id為101的文檔刪除,可以使用如下命令:
DELETE /ropledata/_doc/101
疑問五:查詢或者刪除的時候指定的ID是文檔里面得字段id嗎?
不是的,這點容易混淆,查詢或者刪除時候用到的ID是創建文檔時候指定或者ES自動生成的那個id,而不是文檔里面的那個叫
id
字段!文檔里面的文檔字段是可以沒有id
的。
六、總結
本文我們對ES的基本概念進行了清晰的解釋,並用最有效率的方式進行了安裝配置,也對基礎的增刪改查進行了圖文並茂的演示。掌握了這些可以說對ES已經入門了,寫這篇文章的目的也已經達到了!ES還有很多復雜的查詢,中文分詞,倒排索引等技術點需要我們去掌握,后續我將會整理出來,咱們一起學習!
如果您對我的文章感興趣,歡迎關注點贊收藏,如果您有疑惑或發現文中有不對的地方,還請不吝賜教,非常感謝!!