ES 核心概念

属于我的梦,明明还在發表於2024-04-19

ES 核心概念

概述

在前面的學習中,我們已經掌握了es是什麼,同時也把ES服務已經安裝啟動,那麼es是如何去儲存資料,資料結構又是什麼,又是如何實現搜尋的呢?我們先來聊聊ElasticSearch的相關概念吧

叢集,節點,索引,型別,文件

elasticsearch 是面向文件,關係型資料庫和elasticsearch客觀的對比!

Relational DB ElasticSearch
資料庫(database) 索引(indices)
表(tables) types(慢慢被棄用)
行(rows) documents
欄位(columns) fields

elasticsearch(叢集)中可以包含多個索引(資料庫),每個索引中可以包含多個型別(表),每個型別下又包含多個文件(行),每個文件中又包含多個欄位(列)。

物理設計:

elasticsearch在後臺把每個索引劃分成多個分片,每分分片可以在叢集中的不同伺服器間遷移

自己就是一個叢集!預設的叢集名字就是elasticsearch
ES 核心概念

邏輯設計:

一個索引型別中,包含多個文件,比如說文件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,又稱複製分片)

ES 核心概念

上圖是一個有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),然後建立一個包含所有不重複的詞條的排序列表,然後列出每個詞條出現在哪個文件:

ES 核心概念
現在我們試圖搜尋 to forever,只需要檢視包含每個詞條的文件 score

ES 核心概念

兩個文件都匹配,但是第一個文件比第二個匹配程度更高。如果沒有別的條件,現在,這兩個包含關鍵字的文件都將返回。
再來看一個示例,比如我們通過部落格標籤來搜尋部落格文章。那麼倒排索引列表就是這樣的一個結構:

ES 核心概念

如果要搜尋含有python標籤的文章,那相對於查詢所有原始資料而言,查詢倒排索引後的資料將會快的多。只需要檢視標籤這一欄,然後獲取相關的文章ID即可。

elasticsearch的索引和Lucene的索引對比

在elasticsearch中,索引這個詞被頻繁使用,這就是術語的使用。在elasticsearch中,索引被分為多個分片,每份分片是一個Lucene的索引。所以一個elasticsearch索引是由多個Lucene索引組成的。別問為什麼,誰讓elasticsearch使用Lucene作為底層呢!

如無特指,說起索引都是指elasticsearch的索引。

接下來的一切操作都在kibana中Dev Tools下的Console裡完成。基礎操作!
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章