Elasticsearch第一步

ElasticSearch JSON 大數據 Hadoop 園看天下 2017-04-07

Elasticsearch的基礎知識在網絡上隨處可見。當和“大數據”相關的名詞、開源項目鋪天蓋地朝我們飛來的時候,Elasticsearch就像一條獨特的風景線,使人眼前一亮。如果Hadoop(生態系統)比作EJB的話,那麼Elasticsearch應比做Spring Framework。故此筆者仍認為有必要重新“indexing”Elasticsearch的基礎知識。

特點

準實時(NRT

Elasticsearch是一個接近實時的搜索平臺。這意味著,從索引一個文檔直到這個文檔可被搜索到,中間只有輕微的延遲(通常是1秒)。

極其優雅而強大的REST API

幾乎所有的搜索引擎特性都能通過原生HTTP訪問;查詢請求和結果集為JSON格式;可以通過curl這樣簡單的工具進行測試/實驗/調試。

無模式數據模型

允許應用設計者靈活發揮;允許對無模式的元數據任意索引;可根據索引的需要調整類型/字段。

完全分佈式和高可用性

P2P方式操作主節點恢復(AdHoc),多播自動發現;適合虛擬機/雲預分配環境運行;新節點加入後可橫向擴展索引規模。搜索集群自動容錯恢復。

高級搜索特性

全文搜索、自動完成、實時搜索分析;強大的查詢DSL;多語言支持;根據大部分的查詢需求,內建分詞器、過濾分析。

名詞

Elasticsearch第一步

上圖對類似Oracle這樣的關係型數據庫與Elasticsearch進行比較,把不同的名詞

索引(Index

一個索引就是一個擁有幾分相似特徵的文檔的集合。比如說,可以有一個客戶數據的索引,或一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須全部是小寫字母的),並且當我們要對對應於這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集群中,如果你想,可以定義任意多的索引。

分片和複製(Shard&Replica

一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引佔據1TB的磁盤空間,而單一節點都沒有這麼大的磁盤空間;或者單個節點響應搜索請求時太慢。

為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到集群中的任何節點上。

分片之所以重要,主要有兩方面的原因:

  • 允許水平分割/擴展你的內容容量。

  • 允許在分片(可能位於多個節點上)之上進行分佈式的、並行的操作,進而提高性能/吞吐量。

至於一個分片怎樣分佈,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對作為用戶的你來說,這些都是透明的。

在一個網絡/雲的環境裡,失敗隨時都可能發生,在某個分片/節點不知怎麼的就處於離線狀態,或者由於任何原因消失了,這種情況下,有一個故障轉移機制是非常有用並且是強烈推薦的。為此目的,Elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。

複製之所以重要,有兩個主要原因:

  • 在分片/節點失敗的情況下,提供了高可用性。為此,複製分片絕不能與原/主要(original/primary)分片放在同一節點上,這個原則非常重要。

  • 擴展你的搜索量/吞吐量,因為搜索可以在所有的複製上並行運行。

總之,每個索引可以被劃分成多個分片。一個索引也可以被複制0次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作為複製源的原來的分片)和複製分片(主分片的拷貝)之別。分片和複製的數量可以在索引創建的時候指定。在索引創建之後,你可以在任何時候動態地改變複製的數量,但是你事後不能改變分片的數量。

Elasticsearch第一步

為更直觀觀察這一過程,上圖中是以一張圖片舉例的索引過程,被劃分為3個分片、1份複製分片,加在一起共6個分片。

默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個複製,這意味著,如果你的集群中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。

真的麼?來看看head插件截圖:

Elasticsearch第一步

類型(type

在一個索引中,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義完全由你來定。通常,會為具有一組共同字段的文檔定義一個類型。比如說,我們假設你運營一個博客平臺並且將你所有的數據存儲到一個索引中。在這個索引中,你可以為用戶數據定義一個類型,為博客數據定義另一個類型,當然,也可以為評論數據定義另一個類型。

文檔(document

一個文檔是一個可被索引的基礎信息單元。比如,你有一個客戶的文檔,某產品的一個文檔,當然,也可以擁有某個訂單的一個文檔。文檔以JSON格式來表示,而JSON是一個廣泛存在於互聯網的數據交互格式。

在一個索引/類型中,只要你想,你可以存儲任意多的文檔。注意,儘管一個文檔,物理上存在於一個索引之中,但文檔必須被索引/賦予一個類型。

字段(Fields

字段的概念和關係型數據庫的列名(字段名)概念相差無幾,本文就不再囉嗦了。

映射(Mapping

映射非常類似於靜態語言中的數據類型:聲明一個變量為int類型的變量,以後這個變量都只能存儲int類型的數據。同樣,一個number類型的映射字段只能存儲number類型的數據。

同語言的數據類型相比,映射還有一些其他的含義,它不僅告訴Elasticsearch一個字段中是什麼類型的值,它還告訴Elasticsearch如何索引數據以及數據是否能被搜索到。所以,當你的查詢沒有返回相應的數據,你的映射很有可能有問題。

查詢DSL(Query DSL

Elasticsearch提供的JSON風格特定領域語言,利用它你可以執行查詢,稱為查詢DSL。例如:

'{

"query": {"match_all": {} },

"sort": {"balance": { "order": "desc" } }

}'

參考文獻:

http://blog.csdn.net/cnweike/article/details/33736429

http://blog.csdn.net/lvhong84/article/details/23936697

http://log.medcl.net/item/2011/08/diving-into-elasticsearch-5-distributed-architecture/

相關推薦

推薦中...