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,對可能出現的疑問進行標紅並解釋。
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還有很多復雜的查詢,中文分詞,倒排索引等技術點需要我們去掌握,后續我將會整理出來,咱們一起學習!

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM