基本概念 近實時 (Near Realtime NRT) Elasticsearch是一個接近實時的搜索平臺。 這意味著從索引文檔的時間到可搜索的時間都有一個小的延遲(通常是一秒)。 這就意味著當新增數據後最壞情況大概要1秒之後才能被搜索到。 集群 當一臺伺服器無法滿足索引數據容量和查詢性能的時候, ...
基本概念
近實時 (Near Realtime NRT)
Elasticsearch是一個接近實時的搜索平臺。 這意味著從索引文檔的時間到可搜索的時間都有一個小的延遲(通常是一秒)。
這就意味著當新增數據後最壞情況大概要1秒之後才能被搜索到。
集群
當一臺伺服器無法滿足索引數據容量和查詢性能的時候,可以通過水平擴展方式加入更多的伺服器來分解數據的容量和搜索的性能。
群集是一個或多個節點(伺服器)的集合,它們一起保存整個數據,併在所有節點上提供聯合索引和搜索功能。 一個集群由一個唯一的名字來標識,預設是“elasticsearch”。 這個名字很重要,因為如果節點設置為通過名字加入集群,節點只能是集群的一部分。
節點
節點是作為集群一部分的單個伺服器,存儲數據並參與集群的索引和搜索功能。就像一個集群一樣,一個節點由一個名字來標識,預設情況下它是一個在啟動時分配給節點的隨機通用唯一標識符(UUID)。如果您不需要預設值,您可以定義任何您想要的節點名稱。此名稱對於管理目的非常重要,您需要確定網路中的哪些伺服器對應於Elasticsearch群集中的哪些節點。
索引
索引是具有相似特征的文檔的集合。 例如,您可以擁有客戶數據的索引,產品目錄的另一個索引以及訂單數據的另一個索引。 索引由名稱標識(必須全部為小寫),該名稱用於在對索引文檔進行索引,搜索,更新和刪除操作時引用索引。
在單個群集中,您可以根據需要定義多個索引。
因此索引有點類似資料庫中的表,儘管在ES6之前用index類比為資料庫,把type類比為資料庫中的表。但ES6之後將會把type廢棄掉,因此建議新用戶不要再用type的概念了。
type
type曾經是您的索引的邏輯類別/分區,允許您在同一個索引中存儲不同類型的文檔,例如一種類型的用戶,另一種類型的博客文章。 在索引中不再可能創建多個類型,並且在後面的版本中將刪除整個類型的概念。
具體移除的原因是當一個索引中的結構類似的情況下,Lucene的壓縮率會更高,如果在一個索引中創建不同結構的文檔,會導致數據的稀疏性。
其實在solr中也沒有type的概念,如果用戶真要擁有type的概念,可以自己來創建一個type的欄位來進行就可以。
文檔
文檔是可被索引的基本信息單元。 例如,您可以為單個客戶提供文檔,為單個產品提供另一個文檔,為單個訂單提供另一個文檔。 這個文檔是用JSON(JavaScript Object Notation)表示的,它是一個無處不在的互聯網數據交換格式。
分片和副本
當一臺伺服器存儲不下當前的數據時,可以用分片的方式來進行存儲。
比如:我們有1000萬的數據,如果我們有10台伺服器,則在每台伺服器上只要存儲100萬條數據就可以了。
這樣單純通過分片的方式,既提高了整體的數據存儲容量,並且對於搜索的性能也有很大的提升。
因為如果1000萬條數據只存儲在一臺機器上,假如每1萬條數據的搜索性能為1秒,則需要1000秒,而現在被分片到了10台伺服器上,並且每台伺服器中只有100萬條數據,則以並行方式搜索的話,就只要100秒就可以了。
這樣搜索的性能也直接從1000秒降低到了100秒。
副本很重要,主要有兩個原因:
- 提高了高可用性,因為每份數據會被覆製成多份
- 提高了搜索的吞吐量,因為搜索可以在所有副本上並行執行。
總而言之,每個索引可以分成多個碎片。 索引也可以被覆製為零(意味著沒有複製品)或更多次。 一旦被覆制,每個索引將具有主要碎片(從中複製的原始碎片)和副本碎片(主要碎片的副本)。 在創建索引時,可以為每個索引定義分片和副本的數量。 創建索引之後,您可以隨時更改動態副本的數量,但不能隨意更改碎片的數量。
預設情況下,Elasticsearch中的每個索引都分配了5個主分片和1個副本,這意味著如果您的集群中至少有兩個節點,則索引將包含5個主分片和另外5個副本分片(1個完整副本) 每個索引10個碎片。