大白話講解大數據之Elasticsearch的核心概念

1、elasticsearch是lucene的框架,所以我們先概述下兩者

(1)lucene:可以說是搜索引擎的鼻祖,最先進、功能最強大的搜索庫,但是直接基於lucene開發的話會非常複雜,因為他的api極其複雜(實現一些簡單的功能,寫大量的java代碼,好比以前的jdbc,邏輯囉嗦的),還需要深入理解其內部各種索引結構。

(2)elasticsearch:基於lucene,是lucene的最完美的框架之一(比較知名的還有solr),隱藏了複雜性,提供簡單易用的restful api接口、java api接口等(相當於jdbc的框架,無需你瞭解太多底層,開箱即用)

2、Elasticsearch的優點(簡稱ES):

1.分佈式的文檔(document)存儲引擎

2.分佈式的搜索引擎的分析引擎

3.分佈式,支持PB級數據(大量數據的支持)

開箱即用,優秀的默認參數,不需要任何額外設置(懂其原理的可以調整優化),完全開源。

3、ES的由來(故事):

據傳說,有一個程序員失業了,陪著自己老婆去英國倫敦學習廚師課程。程序員在失業期間想給老婆寫一個菜譜搜索引擎,覺得lucene實在太複雜了,就開發了一個封裝了lucene的開源項目,compass。後來程序員找到了工作,是做分佈式的高性能項目的,覺得compass不夠,就寫了elasticsearch,讓lucene變成分佈式的系統。其真假性我也不知道,我只知道ES真的很強大。

4、Elasticsearch的核心概念

(1)Near Realtime(NRT):近實時

兩個意思:

①從數據寫入到數據可以被搜索到大約1s,這個肯定會延遲,而不是隨機延遲,ES寫入到被搜索到會有1s之內的延遲;

②基於es執行搜索和分析可以達到秒級(大數據量也無壓力)

大白話講解大數據之Elasticsearch的核心概念

近實時圖示

(2)Cluster:集群:

包含多個節點,每個節點屬於哪個集群是通過一個配置(集群名稱,默認是elasticsearch)來決定的,默認一個集群就一個節點。

(3)Node:節點,集群中的一個節點,節點也有一個名稱(默認是隨機分配的),默認節點會去加入一個名稱為“elasticsearch”(默認的集群)的集群,如果直接啟動一堆節點,那麼他們會自動組成一個elasticsearch集群(啟動的node都會加入Elasticsearch這個集群名稱的集群中),一個節點也可以組成一個elasticsearch集群。

(4)Document:文檔,es中的最小數據單元,一個document可以是各種各樣的數據,比如一條日誌數據,一條訂單數據,用JSON表示,每個index下的type中(不懂沒關係,一會就會講解),都可以去存儲多個document,一個document裡面有多個field,每個field就是一個數據字段。(相當於表中的一行)

例如:

產品document:

{

"product_id": "1",

"product_name": "腦白金",

"product_desc": "老年人專用",

"category_id": "1",

"category_name": "保健品"

}

這就是一個document,如此簡單,就是一個json而已。

(5)Index:索引,包含一堆有相似結構的document數據,比如可以有一個日誌索引,商品索引,訂單索引,索引有一個名稱,一個index包含很多document,一個index就代表了一類類似的或者相同的document。比如建立一個product index,商品索引,裡面可能就存放了所有的商品數據,所有的商品document。(相當於一個數據庫)

(6)Type:類型,每個索引裡都可以有一個或多個type,type是index中的一個邏輯數據分類,一個type下的document,都有相同的field,比如系員工統,有一個索引,可以定義用戶數據type,角色數據type,權限數據type。(相當於一張表)

例如:

商品index,裡面存放了所有的商品document

但是商品分很多種類,每個種類的document的field可能不太一樣,比如

日化商品type:product_id,product_name,product_desc,category_id,category_name

電器商品type:product_id,product_name,product_desc,category_id,category_name,service_period

生鮮商品type:product_id,product_name,product_desc,category_id,category_name,eat_period

每一個type裡面,都會包含一堆document

{

"product_id": "1",

"product_name": "美的空調",

"product_desc": "超級給力還省電",

"category_id": "2",

"category_name": "電器",

"service_period": "3年"

}

{

"product_id": "2",

"product_name": "大閘蟹",

"product_desc": "無汙染",

"category_id": "4",

"category_name": "生鮮",

"eat_period": "30天"

}

(7)shard:單臺機器無法存儲大量數據,es可以將一個索引中的數據切分為多個shard,分佈在多臺服務器上存儲。有了shard就可以橫向擴展,存儲更多數據,讓搜索和分析等操作分佈到多臺服務器上去執行,提升吞吐量和性能。每個shard都是一個lucene index。

(8)replica:任何一個服務器隨時可能故障或宕機,此時shard可能就會丟失,因此可以為每個shard創建多個replica副本,replica可以在shard故障時提供備用服務,保證數據不丟失。多個replica還可以提升搜索操作的吞吐量和性能。primary shard(建立索引時一次設置,不能修改,默認5個),replica shard(隨時修改數量,默認1個,這1個相當於5個,也就是說5個primary shard,5個replica shard)

大白話講解大數據之Elasticsearch的核心概念

shard圖解

若有興趣,歡迎來加入群,【Java初學者學習交流群】:458430385,此群有Java開發人員、UI設計人員和前端工程師。有問必答,共同探討學習,一起進步!

歡迎關注我的微信公眾號【Java碼農社區】,會定時推送各種乾貨(純乾貨的東西,並非Java基礎語法這些。)

大白話講解大數據之Elasticsearch的核心概念

java碼農社區

相關推薦

推薦中...