1. 程式人生 > 實用技巧 >es ElasticSearch 快速入門詳解

es ElasticSearch 快速入門詳解

原文連結:https://ropledata.blog.csdn.net/article/details/106423578

文章目錄

一、前言

本文版本說明:

  1. ElasticSearch版本:7.7 (目前最新版)
  2. 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相關的基本概念的對比表格,先看一下:

ESMySql
欄位
文件 一行資料
型別(已廢棄)
索引 資料庫

看完這個表格後,建議像背單詞那樣蓋住右半部分的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還有很多複雜的查詢,中文分詞,倒排索引等技術點需要我們去掌握,後續我將會整理出來,咱們一起學習!

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