小白學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的優點
- 橫向可擴充套件性: 作為大型分散式叢集, 很容易就能擴充套件新的伺服器到ES叢集中; 也可執行在單機上作為輕量級搜尋引擎使用.
- 更豐富的功能: 與傳統關係型資料庫相比, ES提供了全文檢索、同義詞處理、相關度排名、複雜資料分析、海量資料的近實時處理等功能.
- 分片機制提供更好地分佈性: 同一個索引被分為多個分片(Shard), 利用分而治之的思想提升處理效率.
- 高可用: 提供副本(Replica)機制, 一個分片可以設定多個副本, 即使在某些伺服器宕機後, 叢集仍能正常工作.
- 開箱即用: 提供簡單易用的API, 服務的搭建、部署和使用都很容易操作.
1.3 Elasticsearch的相關產品
- Beats: 是一個代理, 將不同型別的資料傳送到Elasticsearch中.
- Shield: 提供基於角色的訪問控制與審計, 加密通訊、認證保護整個ES的資料, 為ES帶來企業級的安全性. 是收費產品.
- Watcher: 是ES的警報和通知工具, 檢測ES的狀態, 在異常發生時進行提醒. 是收費產品
- 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 分散式的搜尋引擎和資料分析引擎
- 搜尋: 谷歌, 百度, 各大網站的站內搜尋(如淘寶網的商品搜尋), IT系統的檢索(如OA內部的資訊查詢);
- 資料分析: 電商網站中, 對形如最近30天IT書籍銷量排名前10的商家有哪些; 新聞網站中: 最近7天訪問量排名Top 10的新聞是哪些......
- 總結: Elasticsearch用於: 在較大使用者量、較高訪問量的分散式系統中, 對資料進行搜尋與分析.
2.2 全文檢索 結構化檢索 資料分析
- 全文檢索: 搜尋商品名稱包含"程式設計思想"的商品:
select * from products where product_name like "%程式設計思想%"
; - 結構化檢索: 搜尋商品分類為"電腦科學"的所有商品:
select * from products where category_id='電腦科學'
; - 資料分析: 分析每一種商品分類下有多少件商品:
select category_id, count(*) from products group by category_id
; - 其他個性化搜尋需求: 部分匹配、自動完成(輸入聯想)、搜尋糾錯、搜尋推薦......
2.3 海量資料的近實時處理
- 分散式: Elasticsearch可將海量資料自動分發到多臺伺服器上, 進行儲存和檢索;
- 海量資料的處理: 分散式系統構建完成後, 就可通過大規模伺服器叢集去儲存和檢索資料 —— 伺服器有了處理海量資料的能力;
- 基於Elasticsearch的搜尋和分析服務可達到秒級響應.
關於近實時:
非近實時: 檢索x個數據要花費很長時間(這就不是近實時, 而是離線批處理, batch-processing).
實時: 資料的處理與響應都是立即呈現的, 幾乎沒有間隔, 這在大資料應用場景下是很難達到的要求.
近實時(near real-time, NRT): 對海量資料進行搜尋和分析的響應耗時控制在秒級以內, 方可稱為近實時.
3 Elasticsearch的核心概念
3.1 ES服務的相關概念
Term(索引詞)
- 在ES中, 索引詞(Term)是一個能夠被索引的精確值, 可以通過Term查詢進行準確搜尋.
- 舉例: foo、Foo、FOO是不同的索引詞.
Text(文字)
- 文字是一段普通的非結構化文字, 通長文字會被分析成多個Term, 儲存在ES的索引庫中.
- 文字欄位一般需要先分析再儲存, 查詢文字中的關鍵詞時, 需要根據搜尋條件搜尋出原文字.
Analysis(分析)
- 分析是將文字轉換為索引詞的過程, 分析的結果依賴於分詞器.
- 比如: FOO BAR、Foo-Bar和foo bar可能會被分析成相同的索引詞foo和bar, 然後被儲存到ES的索引庫中. 當用FoO:bAr進行全文搜尋的時候, 搜尋引擎根據匹配計算也能在索引庫中查詢到相關的內容.
Cluster(叢集)
- 叢集由一個或多個節點組成, 對外提供索引和搜尋服務. 叢集中有且只能有一個節點被選舉為主節點 —— 主從節點是叢集內部的說法, 對使用者是透明的 —— 去中心化.
- 同一網路中, 每個ES叢集都要有唯一的名稱用於區分, 預設的叢集名稱為"Elasticsearch".
- 水平擴充套件時, 只需要將新增節點的叢集名稱設定為要擴容的叢集名稱, 該節點就會自動加入叢集中.
- 一個節點只能加入到一個叢集中.
Node(節點)
- 節點是邏輯上獨立的服務, 是叢集的一部分, 可以儲存資料, 並參與叢集的索引和檢索功能.
- 節點也有唯一的名稱, 用於叢集的管理和通訊. 節點名稱在啟動的時候自動分配 —— 當然可以自定義.
- 如果有多個節點在執行, 預設情況下, 這些節點會自動組成一個名為Elasticsearch的叢集.
- 如果只有一個節點在執行, 該節點就會組成只有一個節點的名為Elasticsearch的叢集.
- 每個節點屬於哪個叢集是通過"叢集名稱"來決定的.
Shard(分片)
- 單臺機器(節點)無法儲存大量的索引資料, ES可以把一個完整的索引分成多個分片, 分佈到不同的節點上, 從而構成分散式索引.
- 分片的數量只能在建立索引前指定, 建立索引後不能修改.
- 每個分片都是一個Lucene例項, 即每個分片底層都有一個單獨的Lucene提供索引和檢索服務, 它們可以託管在叢集的任一節點上.
- 單個Lucene中儲存的索引文件最大值為 lucene-5843, 極限是
2147483519(=integer.max_value - 128)
個文件. 可使用_cat/shards API 監控分片的大小.
Replica(副本)
- ES支援為每個Shard建立多個副本, 相當於索引資料的冗餘備份.
- 副本的重要性:
- ① 解決單點問題, 提高可用性和容錯性: 某些節點失敗時服務不受影響;
- ② 提高查詢效率: 搜尋可以在所有的副本上並行執行, 提高了服務的併發量.
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, 索引結構圖如下:
Index(索引)
- 索引是具有相似結構的文件的集合, 比如可以有一個商品分類索引, 訂單索引.
- 索引的名稱要小寫, 通過索引名稱來執行索引、搜尋、更新和刪除等操作.
Type(型別)
- 每個索引中可以定義一個或多個Type, Type是Index的邏輯分類.
- 一種Type一般被定義為具有一組公共field的document, 比如對部落格系統中的資料建立索引, 可以定義使用者資料Type, 部落格資料Type, 評論資料Type.
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" }
Mapping(對映)
- 類似於關係資料庫中的表結構, 每個Index都有一個對映: 定義索引中每個欄位的型別.
- 對映可以提前定義, 也可以在第一次儲存文件時自動識別.
- 類似於Solr中約束schema.xml檔案的作用.
Field(欄位)
- 欄位可以是一個簡單的值(如字串、數字、日期), 也可以是一個數組, 還可以巢狀一個物件或多個物件.
- 欄位類似於關係資料庫中表資料的列, 每個欄位都對應一個型別.
- 可以指定如何分析某一欄位的值, 即對Field指定分詞器.
Source Field(源欄位)
- 原始的JSON文件被儲存在
_source
欄位中, 搜尋文件時預設返回該欄位及其內容. - 該欄位不儲存索引分析後的任何其他資料.
- 原始的JSON文件被儲存在
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(馬瘦風)
出處: 部落格園 馬瘦風的部落格
您的支援是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段宣告, 且在文章頁面明顯位置給出原文連結, 否則博主保留追究法律責任的權利.