1. 程式人生 > >小白學ES 01-Elasticsearch的基礎概念

小白學ES 01-Elasticsearch的基礎概念

目錄

1 Elasticsearch概述

1.1 Elasticsearch是什麼

Elasticsearch(ES)是一個基於Apache的開源索引庫Lucene而構建的開源、分散式、RESTful介面的全文搜尋引擎, 還是一個分散式文件資料庫.

ES可以輕鬆擴充套件數以百計的伺服器(水平擴充套件), 用於儲存和處理資料. 它可以在很短的時間記憶體儲、搜尋和分析海量資料, 通常被作為複雜搜尋場景下的核心引擎.

由於Lucene提供的API操作起來異常繁瑣, 需要編寫大量的程式碼, Elasticsearch就對Lucene 進行了封裝與優化, 並提供了REST風格的操作介面, 開箱即用, 大大的方便了開發人員的使用.

關於全文檢索與Lucene方面的簡介, 請參照博主的部落格: Lucene01-全文搜尋及Lucene簡介

1.2 Elasticsearch的優點

  1. 橫向可擴充套件性: 作為大型分散式叢集, 很容易就能擴充套件新的伺服器到ES叢集中; 也可執行在單機上作為輕量級搜尋引擎使用.
  2. 更豐富的功能: 與傳統關係型資料庫相比, ES提供了全文檢索、同義詞處理、相關度排名、複雜資料分析、海量資料的近實時處理等功能.
  3. 分片機制提供更好地分佈性: 同一個索引被分為多個分片(Shard), 利用分而治之的思想提升處理效率.
  4. 高可用: 提供副本(Replica)機制, 一個分片可以設定多個副本, 即使在某些伺服器宕機後, 叢集仍能正常工作.
  5. 開箱即用: 提供簡單易用的API, 服務的搭建、部署和使用都很容易操作.

1.3 Elasticsearch的相關產品

  1. Beats: 是一個代理, 將不同型別的資料傳送到Elasticsearch中.
  2. Shield: 提供基於角色的訪問控制與審計, 加密通訊、認證保護整個ES的資料, 為ES帶來企業級的安全性. 是收費產品.
  3. Watcher: 是ES的警報和通知工具, 檢測ES的狀態, 在異常發生時進行提醒. 是收費產品
  4. Marvel: 是ES的管理和監控工具, 檢測ES叢集的索引和節點的活動. 是收費產品.

1.4 Elasticsearch的使用場景

(1) 維基百科(類似百度百科): 全文檢索, 高亮, 搜尋推薦;

(2) The Guardian(新聞網站): 使用者行為日誌(點選, 瀏覽, 收藏, 評論) + 社交網路資料(對某某新聞的相關看法), 資料分析(將公眾對文章的反饋提交至文章作者);

(3) Stack Overflow(IT技術論壇): 全文檢索, 搜尋相關問題和答案;

(4) GitHub(開原始碼管理), 搜尋管理其託管的上千億行程式碼;

(5) 日誌資料分析: ELK技術棧(Elasticsearch + Logstash + Kibana)對日誌資料進行採集&分析;

(6) 商品價格監控網站: 使用者設定某商品的價格閾值, 當價格低於該閾值時, 向用戶推送降價訊息;

(7) BI系統(Business Intelligence, 商業智慧): 分析某區域最近3年的使用者消費額的趨勢、使用者群體的組成結構等;

(8) 其他應用: 電商、招聘、門戶等網站的內部搜尋服務, IT系統(OA, CRM, ERP等)的內部搜尋服務, 資料分析(ES的又一熱門使用場景).

2 Elasticsearch的功能概述

2.1 分散式的搜尋引擎和資料分析引擎

  1. 搜尋: 谷歌, 百度, 各大網站的站內搜尋(如淘寶網的商品搜尋), IT系統的檢索(如OA內部的資訊查詢);
  2. 資料分析: 電商網站中, 對形如最近30天IT書籍銷量排名前10的商家有哪些; 新聞網站中: 最近7天訪問量排名Top 10的新聞是哪些......
  • 總結: Elasticsearch用於: 在較大使用者量、較高訪問量的分散式系統中, 對資料進行搜尋與分析.

2.2 全文檢索 結構化檢索 資料分析

  1. 全文檢索: 搜尋商品名稱包含"程式設計思想"的商品: select * from products where product_name like "%程式設計思想%" ;
  2. 結構化檢索: 搜尋商品分類為"電腦科學"的所有商品: select * from products where category_id='電腦科學' ;
  3. 資料分析: 分析每一種商品分類下有多少件商品: select category_id, count(*) from products group by category_id ;
  4. 其他個性化搜尋需求: 部分匹配、自動完成(輸入聯想)、搜尋糾錯、搜尋推薦......

2.3 海量資料的近實時處理

  1. 分散式: Elasticsearch可將海量資料自動分發到多臺伺服器上, 進行儲存和檢索;
  2. 海量資料的處理: 分散式系統構建完成後, 就可通過大規模伺服器叢集去儲存和檢索資料 —— 伺服器有了處理海量資料的能力;
  3. 基於Elasticsearch的搜尋和分析服務可達到秒級響應.
  • 關於近實時:

    非近實時: 檢索x個數據要花費很長時間(這就不是近實時, 而是離線批處理, batch-processing).

    實時: 資料的處理與響應都是立即呈現的, 幾乎沒有間隔, 這在大資料應用場景下是很難達到的要求.

    近實時(near real-time, NRT): 對海量資料進行搜尋和分析的響應耗時控制在秒級以內, 方可稱為近實時.

3 Elasticsearch的核心概念

3.1 ES服務的相關概念

  1. Term(索引詞)

    • 在ES中, 索引詞(Term)是一個能夠被索引的精確值, 可以通過Term查詢進行準確搜尋.
    • 舉例: foo、Foo、FOO是不同的索引詞.
  2. Text(文字)

    • 文字是一段普通的非結構化文字, 通長文字會被分析成多個Term, 儲存在ES的索引庫中.
    • 文字欄位一般需要先分析再儲存, 查詢文字中的關鍵詞時, 需要根據搜尋條件搜尋出原文字.
  3. Analysis(分析)

    • 分析是將文字轉換為索引詞的過程, 分析的結果依賴於分詞器.
    • 比如: FOO BAR、Foo-Bar和foo bar可能會被分析成相同的索引詞foo和bar, 然後被儲存到ES的索引庫中. 當用FoO:bAr進行全文搜尋的時候, 搜尋引擎根據匹配計算也能在索引庫中查詢到相關的內容.
  4. Cluster(叢集)

    • 叢集由一個或多個節點組成, 對外提供索引和搜尋服務. 叢集中有且只能有一個節點被選舉為主節點 —— 主從節點是叢集內部的說法, 對使用者是透明的 —— 去中心化.
    • 同一網路中, 每個ES叢集都要有唯一的名稱用於區分, 預設的叢集名稱為"Elasticsearch".
    • 水平擴充套件時, 只需要將新增節點的叢集名稱設定為要擴容的叢集名稱, 該節點就會自動加入叢集中.
    • 一個節點只能加入到一個叢集中.
  5. Node(節點)

    • 節點是邏輯上獨立的服務, 是叢集的一部分, 可以儲存資料, 並參與叢集的索引和檢索功能.
    • 節點也有唯一的名稱, 用於叢集的管理和通訊. 節點名稱在啟動的時候自動分配 —— 當然可以自定義.
    • 如果有多個節點在執行, 預設情況下, 這些節點會自動組成一個名為Elasticsearch的叢集.
    • 如果只有一個節點在執行, 該節點就會組成只有一個節點的名為Elasticsearch的叢集.
    • 每個節點屬於哪個叢集是通過"叢集名稱"來決定的.
  6. Shard(分片)

    • 單臺機器(節點)無法儲存大量的索引資料, ES可以把一個完整的索引分成多個分片, 分佈到不同的節點上, 從而構成分散式索引.
    • 分片的數量只能在建立索引前指定, 建立索引後不能修改.
    • 每個分片都是一個Lucene例項, 即每個分片底層都有一個單獨的Lucene提供索引和檢索服務, 它們可以託管在叢集的任一節點上.
    • 單個Lucene中儲存的索引文件最大值為 lucene-5843, 極限是2147483519(=integer.max_value - 128) 個文件. 可使用_cat/shards API 監控分片的大小.
  7. Replica(副本)

    • ES支援為每個Shard建立多個副本, 相當於索引資料的冗餘備份.
    • 副本的重要性:
      • ① 解決單點問題, 提高可用性和容錯性: 某些節點失敗時服務不受影響;
      • ② 提高查詢效率: 搜尋可以在所有的副本上並行執行, 提高了服務的併發量.
  8. Primary Shard & Replica Shard(主分片和副本分片)

    • 分片分為Primary Shard(主分片)、Replica Shard(副本分片), 建立索引時, 系統會先將索引儲存在主分片中, 然後再將主分片中的索引複製到不同的副本中.
    • 注意: 主分片和副本分片不能儲存在同一個節點中 —— 無法保證高可用. 主分片在建立索引時設定, 預設為5個, 後期不能修改; 系統預設每個主分片各有一個副本分片, 即共有5個副本分片, 可隨時修改其數量.
    • ==> 預設情況下, 每個索引共有10個Shard = 5個Primary Shard + 5個Replica Shard.
    • ==> 叢集中至少要有2個節點: 最小的高可用配置.

3.2 ES索引的相關概念

ES的索引中, 各概念的關係為: Field =組成=> Document =組成=> Type =組成=> Index, 索引結構圖如下:

ES的索引結構圖

  1. Index(索引)

    • 索引是具有相似結構的文件的集合, 比如可以有一個商品分類索引, 訂單索引.
    • 索引的名稱要小寫, 通過索引名稱來執行索引、搜尋、更新和刪除等操作.
  2. Type(型別)

    • 每個索引中可以定義一個或多個Type, Type是Index的邏輯分類.
    • 一種Type一般被定義為具有一組公共field的document, 比如對部落格系統中的資料建立索引, 可以定義使用者資料Type, 部落格資料Type, 評論資料Type.
  3. Document(文件)

    • 文件是儲存在ES中的一個JSON格式的字串, 是ES索引中的最小資料單元.

    • 一個Document可以是一條商品分類資料, 一條訂單資料, 例如:

      # book document
      {
          "book_id": "1",
          "book_name": "Thinking in Java(Java 程式設計思想)",
          "book_desc": "Java學習者不得不看的經典書籍",
          "book_price": 108.00,
          "category_id": "5"
      }
  4. Mapping(對映)

    • 類似於關係資料庫中的表結構, 每個Index都有一個對映: 定義索引中每個欄位的型別.
    • 對映可以提前定義, 也可以在第一次儲存文件時自動識別.
    • 類似於Solr中約束schema.xml檔案的作用.
  5. Field(欄位)

    • 欄位可以是一個簡單的值(如字串、數字、日期), 也可以是一個數組, 還可以巢狀一個物件或多個物件.
    • 欄位類似於關係資料庫中表資料的列, 每個欄位都對應一個型別.
    • 可以指定如何分析某一欄位的值, 即對Field指定分詞器.
  6. Source Field(源欄位)

    • 原始的JSON文件被儲存在 _source 欄位中, 搜尋文件時預設返回該欄位及其內容.
    • 該欄位不儲存索引分析後的任何其他資料.
  7. ID(主鍵)

    • ID是一個Document的唯一標識, 如果儲存文件時沒有提供ID, ES會自動生成一個ID.
    • Document的Index/Type/ID都必須是唯一的.

3.3 與關係型資料庫的對比

Elasticsearch RDBMS
Index(索引) DataBase(資料庫)
Type(型別) Table(表)
Document(文件) Row(行)
Field(欄位) Column(列)

參考資料:

《Elasticsearch技術解析與實戰》朱林 編著, 機械工業出版社出版

版權宣告

作者: ma_shoufeng(馬瘦風)

出處: 部落格園 馬瘦風的部落格

您的支援是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段宣告, 且在文章頁面明顯位置給出原文連結, 否則博主保留追究法律責任的權利.