ElasticSearch最新版快速入門詳解

寫在前面:我是「且聽風吟」,目前是某上市遊戲公司的大數據開發工程師,熱愛大數據開源技術,喜歡分享自己的所學所悟,現階段正在從頭梳理大數據體系的知識,以後將會把時間重點放在Spark和Flink上面。

如果你也對大數據感興趣,希望在這個行業一展拳腳。歡迎關注我,我們一起努力,一起學習。博客地址:https://ropledata.blog.csdn.net

博客的名字來源於:且聽風吟,靜待花開。也符合我對技術的看法,想要真正掌握一門技術就需要厚積薄發的毅力,同時保持樂觀的心態。

你只管努力,剩下的交給時間!

在這裏插入圖片描述

一、前言

本文版本說明:

  1. ElasticSearch版本:7.7 (目前最新版)
  2. Kibana版本:7.7(目前最新版)

ElasticSearch在實際生產裏通常和LogStash,Kibana,FileBeat一起構成Elastic Stack來使用,它是這些組件裏面最核心的一個。因此學好ElasticSearch的必要性不言而喻,但是由於ElasticSearch官方更新太過頻繁且文檔陳舊,同時在Linux下安裝配置的過程較繁雜,不利於入門使用。

爲了幫助大家快速入門ElasticSearch,並掌握ElasticSearch和Kibana的使用。本文會把最新版的ElasticSearch的知識點用通俗易懂的語言來展現,並會在覈心概念上和MySql對比,同時給大家介紹百分百成功的極速安裝配置方法,讓大家可以把時間更多的用在技術研究上。

注意:下文咱們把ElasticSearch簡稱爲ES,對可能出現的疑問進行標紅並解釋。
logo

二、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的節點類型主要分爲如下幾種:
    1. Master Eligible節點:每個節點啓動後,默認就是Master Eligible節點,可以通過設置node.master: false 來禁止。Master Eligible可以參加選主流程,併成爲Master節點(當第一個節點啓動後,它會將自己選爲Master節點);注意:每個節點都保存了集羣的狀態,只有Master節點才能修改集羣的狀態信息。
    2. Data節點:可以保存數據的節點。主要負責保存分片數據,利於數據擴展。
    3. Coordinating 節點:負責接收客戶端請求,將請求發送到合適的節點,最終把結果彙集到一起
  • 注意:每個節點默認都起到了Coordinating node的職責。一般在開發環境中一個節點可以承擔多個角色,但是在生產環境中,還是設置單一的角色比較好,因爲有助於提高性能。

3.5、分片(shard)

瞭解分佈式或者學過mysql分庫分表的應該對分片的概念比較熟悉,ES裏面的索引可能存儲大量數據,這些數據可能會超出單個節點的硬件限制。

爲了解決這個問題,ES提供了將索引細分爲多個碎片的功能,這就是分片。這裏咱們可以簡單去理解,在創建索引時,只需要咱們定義所需的碎片數量就可以了,其實每個分片都可以看作是一個完全功能性和獨立的索引,可以託管在集羣中的任何節點上。

疑問二:分片有什麼好處和注意事項呢?

  1. 通過分片技術,咱們可以水平拆分數據量,同時它還支持跨碎片(可能在多個節點上)分佈和並行操作,從而提高性能/吞吐量;
  2. ES可以完全自動管理分片的分配和文檔的聚合來完成搜索請求,並且對用戶完全透明;
  3. 主分片數在索引創建時指定,後續只能通過Reindex修改,但是較麻煩,一般不進行修改。


3.6、副本分片(replica shard)

熟悉分佈式的朋友應該對副本對概念不陌生,爲了實現高可用、遇到問題時實現分片的故障轉移機制,ElasticSearch允許將索引分片的一個或多個複製成所謂的副本分片。

疑問三:副本分片有什麼作用和注意事項呢?

  1. 當分片或者節點發生故障時提供高可用性。因此,需要注意的是,副本分片永遠不會分配到複製它的原始或主分片所在的節點上;

  2. 可以提高擴展搜索量和吞吐量,因爲ES允許在所有副本上並行執行搜索;

  3. 默認情況下,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行代碼搞定:

  1. 搜索docker鏡像庫裏可用的ES鏡像:

    docker search elasticsearch
    

    在這裏插入圖片描述

    可以看到,stars排名第一的是官方的ES鏡像,第二是大牛已經融合了ES7.7和Kibana7.7的鏡像,那咱們就用第二個了。

  2. 把這個鏡像從鏡像庫拉下來:

    docker pull nshou/elasticsearch-kibana
    

    在這裏插入圖片描述

  3. 最後咱們把鏡像啓動爲容器就可以了,端口映射保持不變,咱們給這個容器命名爲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瀏覽器擴展程序裏下載安裝即可:

  1. 打開chrome瀏覽器,在擴展程序chrome應用商店那裏,搜索elasticsearch:
    在這裏插入圖片描述

  2. 選擇ElasticSearch Head,點擊添加至Chrome,進行擴展程序的安裝即可:
    在這裏插入圖片描述

到這裏咱們的ES、Kibana、ElasticSearch Head都已經安裝完成了,下面咱們驗證一下,看是否安裝成功!

  1. 驗證ES:

    打開瀏覽器,輸入IP:端口,比如我的:http://127.0.0.1:9200/,然後就看到了那句經典的:You Know, for Search
    在這裏插入圖片描述

  2. 驗證Kibana:

    打開瀏覽器,輸入Kibana的IP:端口,比如我的:http://127.0.0.1:5601/,然後會看到如下界面:
    在這裏插入圖片描述

    這裏面可以提供很多模擬數據,感興趣的可以自己玩玩,咱們學習期間只要使用左下角那個扳手形狀的Dev Tools就可以了,點擊後,會出現如下界面:
    在這裏插入圖片描述

  3. 驗證ES Head:

    這個更簡單,只需要點擊之前咱們安裝的那個擴展程序圖標就可以了:
    在這裏插入圖片描述
    點擊信息,還可以看到集羣或者索引的信息,很方便,大家沒事可以玩一玩,熟悉一下:
    在這裏插入圖片描述

通過驗證,我們已經全部安裝配置成功了,那麼接下來,就讓我們一起練習一下基礎的增刪改查,加深對ES的理解吧!


五、基礎使用

前面我們已經介紹過了ES 是RESTful 風格的系統,所以我們需要先掌握RESTful 的四個關鍵詞:PUT(修改),POST(添加),DELETE(刪除),GET(查詢)。其中在ES裏面PUT和POST的界限並不是很分明,有時候PUT也作爲添加。
好了,下面就開始愉快的code吧~

5.1、索引基礎操作
  1. 創建一個空索引

    如下代碼,咱們創建了一個0副本2分片的ropledata索引,然後咱們可以在Elasticsearch Head裏刷新一下,並查看索引的信息:

    PUT /ropledata
    {
      "settings": { 
        "number_of_shards": "2", 
        "number_of_replicas": "0"
      } 
    }
    

    在這裏插入圖片描述
    在這裏插入圖片描述

  2. 修改副本

    咱們如果對剛纔創建的索引副本數量不滿意,可以進行修改,注意:分片不允許修改。

    PUT ropledata/_settings 
    { 
      "number_of_replicas" : "2" 
    }
    

    在這裏插入圖片描述

  3. 刪除索引

    當這個索引不想用了,可以進行刪除,執行如下命令即可,執行成功後,刷新ElasticSearch Head可以看到剛纔創建的ropledata索引消失了:

    DELETE /ropledata
    

    在這裏插入圖片描述
    在這裏插入圖片描述

5.2、數據增刪改查
  1. 插入數據

    插入數據的時候可以指定id,如果不指定的話,ES會自動幫我們生成。我們以指定id爲例,如下代碼是我們創建了一個101的文檔,創建成功後,可以在Elasticsearch Head的數據瀏覽模塊裏看到這些數據,代碼及演示如下:

    //指定id 
    POST /ropledata/_doc/101 
    {
      "id":1,
      "name":"且聽_風吟",
      "page":"https://ropledata.blog.csdn.net",
      "say":"歡迎點贊,收藏,關注,一起學習" 
    }
    

    在這裏插入圖片描述
    在這裏插入圖片描述

  2. 修改數據

    這裏大家要特別注意,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底層的流程是怎樣的?和全局更新相比性能怎麼樣?

    局部更新的底層流程:

    1. 內部先獲取到對應的文檔;
    2. 將傳遞過來的字段更新到文檔的json中(這一步實質上也是一樣的);
    3. 將老的文檔標記爲deleted(到一定時候纔會物理刪除);
    4. 將修改後的新的文檔創建出來。

    性能對比:

    1. 全局更新本質上是替換操作,即使內容一樣也會去替換;
    2. 局部更新本質上是更新操作,只有遇到新的東西才更新,沒有新的修改就不更新;
    3. 局部更新比全局更新的性能好,因此推薦使用局部更新。
  3. 查詢數據

    ES的數據查詢知識點非常多,也非常複雜,後面我打算單獨講解演示,本文只展示最基本的根據id搜索數據的code:

    GET /ropledata/_doc/101
    

    在這裏插入圖片描述

  4. 刪除數據

    比如我們想把ropledata索引下的id爲101的文檔刪除,可以使用如下命令:

    DELETE /ropledata/_doc/101
    

    在這裏插入圖片描述

疑問五:查詢或者刪除的時候指定的ID是文檔裏面得字段id嗎?

不是的,這點容易混淆,查詢或者刪除時候用到的ID是創建文檔時候指定或者ES自動生成的那個id,而不是文檔裏面的那個叫id 字段!文檔裏面的文檔字段是可以沒有id 的。


六、總結

本文我們對ES的基本概念進行了清晰的解釋,並用最有效率的方式進行了安裝配置,也對基礎的增刪改查進行了圖文並茂的演示。掌握了這些可以說對ES已經入門了,寫這篇文章的目的也已經達到了!ES還有很多複雜的查詢,中文分詞,倒排索引等技術點需要我們去掌握,後續我將會整理出來,咱們一起學習!

如果您對我的文章感興趣,歡迎關注點贊收藏,如果您有疑惑或發現文中有不對的地方,還請不吝賜教,非常感謝!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章