Elasticsearch簡介
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
Elasticsearch集群可以包含多個索引(indices)(數(shù)據(jù)庫),每一個索引可以包含多個類型(types)(表),每一個類型包含多個文檔(documents)(行),然后每個文檔包含多個字段(Fields)(列)。
「索引」含義的區(qū)分
????索引(名詞) 如上文所述,一個索引(index)就像是傳統(tǒng)關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)庫,它是相關(guān)文檔存儲的地方。
????索引(動詞)「索引一個文檔」表示把一個文檔存儲到索引(名詞)里,以便它可以被檢索或者查詢。這很像SQL中的 INSERT 關(guān)鍵字,差別是,如果文檔已經(jīng)存在,新的文檔將覆蓋舊的文檔。
? ??倒排索引?傳統(tǒng)數(shù)據(jù)庫為特定列增加一個索引,例如B-Tree索引來加速檢索。Elasticsearch和Lucene使用一種叫做倒排索引(inverted index)的數(shù)據(jù)結(jié)構(gòu)來達(dá)到相同目的。
分布式的特性
? ??Elasticsearch致力于隱藏分布式系統(tǒng)的復(fù)雜性。以下這些操作都是在底層自動完成的:
????????將你的文檔分區(qū)到不同的容器或者分片(shards)中,它們可以存在于一個或多個節(jié)點(diǎn)中。
????????將分片均勻的分配到各個節(jié)點(diǎn),對索引和搜索做負(fù)載均衡。
????????冗余每一個分片,防止硬件故障造成的數(shù)據(jù)丟失。
????????將集群中任意一個節(jié)點(diǎn)上的請求路由到相應(yīng)數(shù)據(jù)所在的節(jié)點(diǎn)。
????????無論是增加節(jié)點(diǎn),還是移除節(jié)點(diǎn),分片都可以做到無縫的擴(kuò)展和遷移。
集群內(nèi)部工作方式

? ??一個節(jié)點(diǎn)(node)就是一個Elasticsearch實(shí)例,而一個集群(cluster)由一個或多個節(jié)點(diǎn)組成,它們具有相同的 cluster.name ,它們協(xié)同工作,分享數(shù)據(jù)和負(fù)載。當(dāng)加入新的節(jié)點(diǎn)或者刪除一個節(jié)點(diǎn)時,集群就會感知到并平衡數(shù)據(jù)。
????集群中一個節(jié)點(diǎn)會被選舉為主節(jié)點(diǎn)(master),它將臨時管理集群級別的一些變更,例如新建或刪除索引、增加或移除節(jié)點(diǎn)等。主節(jié)點(diǎn)不參與文檔級別的變更或搜索,這意味著在流量增長的時候,該主節(jié)點(diǎn)不會成為集群的瓶頸。任何節(jié)點(diǎn)都可以成為主節(jié)點(diǎn)。我們例子中的集群只有一個節(jié)點(diǎn),所以它會充當(dāng)主節(jié)點(diǎn)的角色。
????做為用戶,我們能夠與集群中的任何節(jié)點(diǎn)通信,包括主節(jié)點(diǎn)。每一個節(jié)點(diǎn)都知道文檔存在于哪個節(jié)點(diǎn)上,它們可以轉(zhuǎn)發(fā)請求到相應(yīng)的節(jié)點(diǎn)上。我們訪問的節(jié)點(diǎn)負(fù)責(zé)收集各節(jié)點(diǎn)返回的數(shù)據(jù),最后一起返回給客戶端。這一切都由Elasticsearch處理。
集群健康
? ??在Elasticsearch集群中可以監(jiān)控統(tǒng)計(jì)很多信息,但是只有一個是最重要的:集群健康(cluster health)。集群健康有三種狀態(tài): green 、 yellow 或 red 。
? ? 查看健康狀態(tài)指令:GET /_cluster/health
????在一個沒有索引的空集群中運(yùn)行如上查詢,將回這些信息:

分片(primary shard)和復(fù)制分片(replica shard)
? ??為了將數(shù)據(jù)添加到Elasticsearch,我們需要索引(index)——一個存儲關(guān)聯(lián)數(shù)據(jù)的地方。實(shí)際上,索引只是一個用來指向一個或多個分片(shards)的“邏輯命名空間(logical namespace)”.分片是Elasticsearch在集群中分發(fā)數(shù)據(jù)的關(guān)鍵。把分片想象成數(shù)據(jù)的容器。文檔存儲在分片中,然后分片分配到你集群中的節(jié)點(diǎn)上。當(dāng)你的集群擴(kuò)容或縮小,Elasticsearch將會自動在你的節(jié)點(diǎn)間遷移分片,以使集群保持平衡。
? ??分片可以是主分片(primary shard)或者是復(fù)制分片(replica shard)。你索引中的每個文檔屬于一個單獨(dú)的主分片,復(fù)制分片只是主分片的一個副本,它可以防止硬件故障導(dǎo)致的數(shù)據(jù)丟失,同時可以提供讀請求。當(dāng)索引創(chuàng)建完成的時候,主分片的數(shù)量就固定了,但是復(fù)制分片的數(shù)量可以隨時調(diào)整。



在單一節(jié)點(diǎn)上運(yùn)行意味著有單點(diǎn)故障的風(fēng)險(xiǎn)——沒有數(shù)據(jù)備份。幸運(yùn)的是,要防止單點(diǎn)故障,我們唯一需要做的就是啟動另一個節(jié)點(diǎn)。

如果我們啟動第三個節(jié)點(diǎn),我們的集群會自我感知,這時便成為了三節(jié)點(diǎn)集群????

文檔元數(shù)據(jù)

索引文檔


檢索文檔
? ? 格式:get /index/type/id?pretty? ? //pretty會美化json輸出
檢索文檔一部分
? ? 格式:get /index/type/id?_source=field1,field2...
只得到_source字段
? ? 格式:get /index/type/id?_source
更新文檔
? ? 格式:put /index/type/id{? ? field1:value1,field2:value2? ? }
? ? 更新成功后,version字段+1,create字段為false。在內(nèi)部,Elasticsearch已經(jīng)標(biāo)記舊文檔為刪除并添加了一個完整的新文檔。在有更新沖突的情況下,可以通過 retry_on_conflict 參數(shù)設(shè)置重試次數(shù)
創(chuàng)建文檔
? ? 格式:post /index/type/{? ? field1:value1,field2:value2? ? }? ? //post方法保證文檔是新加入的
????如果想使用自定義的 _id ,我們必須告訴Elasticsearch應(yīng)該在 _index 、 _type 、 _id 三者都不同時才接受請求。
刪除文檔
? ? 格式:delete /index/type/id
????如果文檔被找到,Elasticsearch將返回 200 OK 狀態(tài)碼和以下響應(yīng)體。如果文檔未找到,我們將得到一個 404 Not Found 狀態(tài)碼。盡管文檔不存在—— "found" 的值是 false —— _version 依舊增加了。這是內(nèi)部記錄的一部分,它確保在多節(jié)點(diǎn)間不同操作可以有正確的順序。
樂觀并發(fā)控制
? ? 格式:PUT /index/type/id?version=1
????所有更新和刪除文檔的請求都接受 version 參數(shù),它可以允許在你的代碼中增加樂觀鎖控制。??