我更喜歡把 Elasticsearch 作為一種 nosql 去理解,它的一些開發概念和 MongoDB 以及 Redis 沒有太大的區別,不過了解 Elasticsearch 中的一些核心概念對於你后續使用它仍然有非常大的幫助。
- 近實時查詢(Near RealTime)
Elasticsearch 是一個能提供近實時查詢的搜索服務引擎,這意味着從索引文檔到真正可搜索之間會有一個輕微的延遲(大概在一秒內)。
- 節點和集群
節點(node)是一個運行着的 Elasticsearch 實例,你可以認為是單個服務器。集群(cluster)是一個或多個節點的集合,他們協同工作,共享數據並提供故障轉移和擴展功能。集群由唯一名稱標識,如 .NET Core 中的環境名稱,推薦在不同的環境中使用諸如 Development,Production 之類的名稱部署開發。其實節點和集群就是 web 開發中的常見概念而已,大家注意區分即可。
- 文檔
文檔是可索引信息的基本單元,以JSON表示。你可以用其來定義單個產品信息或是員工信息。我們可以把文檔理解為數據庫文檔中的行列數據。在索引/類型中,您可以存儲任意數量的文檔。文檔有幾個共同不可缺的屬性,分別為 _index, _type, _id, 針對特定一個或一類文檔進行操作時,必須指定這些屬性。
最后要提醒大家的是,雖然文檔物理上是駐留在索引中,但實際上文檔必須索引/分配給索引中的類型。
- 索引
索引是具有某些相似特征的文檔的集合,它和數據庫中的索引概念並不十分相同。我們可以把索引理解為數據庫文檔中的數據庫。事實上,我們的數據被存儲和索引在分片(shards)中,索引只是一個把一個或多個分片分組在一起的邏輯空間。然而,這只是一些內部細節——我們的程序完全不用關心分片。
- 類型
在索引中,我們可以定義一個或多個類型。類型是索引的邏輯類別/分區,其語義完全由開發者決定。通常,為具有一組公共字段的文檔定義類型。例如,假設開發者運行博客平台並將所有數據存儲在一個索引中。在此索引中,我們可以為用戶數據定義類型,為博客數據定義另一種類型,並為注釋數據定義另一種類型。我們可以把索引理解成數據庫文檔中的表。
以下是 es 和 關系型數據庫的簡單類比
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices(索引簇)-> Types -> Documents -> Fields
- 分片和復制
理論上,索引可以存儲盡可能多的數據,但是這種情況下性能往往不太樂觀,或者常見的磁盤容量限制也不能允許。所以 Elasticsearch 提供了類似於 MongoDB 中的分片功能,該功能能將索引細分為多個分片。每個分片本身是一個功能完全和獨立的“索引”,可以托管在集群中的任何節點上。
同樣的,有分片技術來處理數據量增長快速的問題,就意味着需要復制技術來應對這種過程中(其實不只是該過程,任何情況下都應該有安全意識)數據安全的問題。Elasticsearch 允許您將索引分片的一個或多個副本轉換為所謂的副本分片。復制技術為我們提供了數據的高可用性和搜索吞吐的擴展性。不過需要注意的是,副本分片從不分配在與從其復制的原始/主分片相同的節點上。
總而言之,每個索引可以拆分為多個分片。索引也可以復制為零(意味着沒有副本)或更多次。一旦復制,每個索引將具有主分片(從索引復制的原始分片)和副本分片(主分片的副本)。開發者可以在創建索引時就為每個索引定義分片和副本的數量。創建索引后,可以隨時動態更改副本數,但不能在此過程后隨即更改分片數。