ES 核心概念
概述
在前面的學習中,我們已經掌握了es是什麼,同時也把ES服務已經安裝啟動,那麼es是如何去儲存資料,資料結構又是什麼,又是如何實現搜尋的呢?我們先來聊聊ElasticSearch的相關概念吧
叢集,節點,索引,型別,文件
elasticsearch 是面向文件,關係型資料庫和elasticsearch客觀的對比!
Relational DB | ElasticSearch |
---|---|
資料庫(database) | 索引(indices) |
表(tables) | types(慢慢被棄用) |
行(rows) | documents |
欄位(columns) | fields |
elasticsearch(叢集)中可以包含多個索引(資料庫),每個索引中可以包含多個型別(表),每個型別下又包含多個文件(行),每個文件中又包含多個欄位(列)。
物理設計:
elasticsearch在後臺把每個索引劃分成多個分片,每分分片可以在叢集中的不同伺服器間遷移
自己就是一個叢集!預設的叢集名字就是elasticsearch
邏輯設計:
一個索引型別中,包含多個文件,比如說文件1,文件2。當我們索引一篇文件時,可以通過這樣的一各順序找到它:索引>型別>文件ID,通過這個組合我們就能索引到某個具體的文件。注意:ID不必是整數,實際上它是個字串。
文件
就是我們的一條一條資料
之前說elasticsearch是面向文件的,那麼就意味著索引和搜尋資料的最小單位是文件,elasticsearch中,文件有幾個重要屬性:
- 自我包含,一篇文件同時包含欄位和對應的值,也就是同時包含key:value!
- 可以是層次型的,一個文件中包含自文件,複雜的邏輯實體就是這麼來的!{就是一個json物件!fastjson進行自動轉換}
- 靈活的結構,文件不依賴預先定義的模式,我們知道關係型資料庫中,要提前定義欄位才能使用,在elasticsearch中,對於欄位是非常靈活的,有時候,我們可以忽略該欄位,或者動態的新增一個新的欄位。
儘管我們可以隨意的新增或者忽略某個欄位,但是,每個欄位的型別非常重要,比如一個年齡欄位型別,可以是字串也可以是整形。因為elasticsearch會儲存欄位和型別之間的對映及其他的設定。這種對映具體到每個對映的每種型別,這也是為什麼在elasticsearch中,型別有時候也稱為對映型別。
型別
型別是文件的邏輯容器,就像關係型資料庫一樣,表格是行的容器。型別中對於欄位的定義稱為對映,比如name對映為字串型別。我們說文件是無模式的,它們不需要擁有對映中所定義的所有欄位,比如新增一個欄位,那麼elasticsearch是怎麼做的呢?elasticsearch會自動的將新欄位加入對映,但是這個欄位的不確定它是什麼型別,elasticsearch就開始猜,如果這個值是18,那麼elasticsearch會認為它是整形。但是elasticsearch也可能猜不對,所以最安全的方式就是提前定義好所需要的對映,這點跟關係型資料庫殊途同歸了,先定義好欄位,然後再使用,別整什麼么蛾子。
索引
就是資料庫
索引是對映型別的容器,elasticsearch中的索引是一個非常大的問文件集合。索引儲存了型別對映型別的欄位和其它設定。然後他們被儲存到了各個分片上。我們來研究下分片是如何工作的。
物理設計:節點和分片是如何工作的
一個叢集至少有一個節點,而一個節點就是一個elasticsearch程式,節點可以有多個索引預設的,如果你建立索引,那麼會又五個分片(primary shard,又稱主分片)構成,每一個主分片都會有個一副本(replica shard,又稱複製分片)
上圖是一個有3個節點的叢集,可以看到主分片和對應的複製分片都不會在同一個節點內,這樣有利於某個節點掛掉了,資料也不至於丟失。實際上,一個分片是一個Lucene索引,一個包含倒排索引的檔案目錄,倒排索引的結構使得elasticsearch在不掃描全部文件的情況下,就能告訴你哪些文件包含特定的關鍵字。不過,等等,倒排索引是什麼鬼?
倒排索引
elasticsearch使用的是一種稱為倒排索引的結構,採用Lucene倒排索作為底層。這種結構適用於快速的全文搜尋,一個索引由文件中所有不重複的列表構成,對於每一個詞,都有一個包含它的文件列表。例如,現在有兩個文件,每個文件包含如下內容:
study every day,good good up to foreve r#文件1包含的內容
To forever,study every day,good good up #文件2包含的內容
為了建立倒排索引,我們首先要將每個文件拆分成獨立的詞(或稱為詞條或者tokens),然後建立一個包含所有不重複的詞條的排序列表,然後列出每個詞條出現在哪個文件:
現在我們試圖搜尋 to forever,只需要檢視包含每個詞條的文件 score
兩個文件都匹配,但是第一個文件比第二個匹配程度更高。如果沒有別的條件,現在,這兩個包含關鍵字的文件都將返回。
再來看一個示例,比如我們通過部落格標籤來搜尋部落格文章。那麼倒排索引列表就是這樣的一個結構:
如果要搜尋含有python標籤的文章,那相對於查詢所有原始資料而言,查詢倒排索引後的資料將會快的多。只需要檢視標籤這一欄,然後獲取相關的文章ID即可。
elasticsearch的索引和Lucene的索引對比
在elasticsearch中,索引這個詞被頻繁使用,這就是術語的使用。在elasticsearch中,索引被分為多個分片,每份分片是一個Lucene的索引。所以一個elasticsearch索引是由多個Lucene索引組成的。別問為什麼,誰讓elasticsearch使用Lucene作為底層呢!
如無特指,說起索引都是指elasticsearch的索引。
接下來的一切操作都在kibana中Dev Tools下的Console裡完成。基礎操作!
本作品採用《CC 協議》,轉載必須註明作者和本文連結