Elasticsearch是什么以及核心概念

luojun1272 8年前發布 | 66K 次閱讀 ElasticSearch 搜索引擎

來自: http://my.oschina.net/secisland/blog/613288


Elasticsearch是什么

    Elasticsearch是一個高度可擴展的開源全文搜索和分析引擎。它可以在很短的時間內存儲,搜索和分析大量的數據。它通常作為具有復雜搜索場景情況下的核心發動機。我們舉幾個例子來說明Elasticsearch能做什么?

    當你經營一家網上商店,你可以讓你的客戶搜索你賣的商品。在這種情況下,你可以使用Elasticsearch來存儲您的整個產品目錄和庫存信息,為客戶提供精準搜索,可以為客戶推薦相關商品。

    當你想收集日志或者交易數據的時候,要分析和挖掘這些數據,尋找趨勢,統計,總結,或異常。在這種情況下,你可以使用LogStash 或者其他工具來進行收集數據,當這些數據存儲到Elasticsearch中 。你可以搜索和匯總這些數據,找到任何你感興趣的信息。

    當你運行一個價格提醒的平臺,可以給客戶提供一些規則,如我有興趣購買一個特定的電子設備,當商品的價格在未來一個月內的價格低于多少錢的時候通知我。在這種情況下,你可以把供應商的價格,把他們定期存儲到Elasticsearch中,使用定時器過濾的能力來匹配客戶的需求,當查詢到價格低于客戶設定的值后給客戶發送一條通知。

    當你有商業智能分析的需求時,你希望快速調查,分析和可視化,并有大量的數據(千萬條記錄)的時候。在這種情況下,你可以使用Elasticsearch來存儲你的數據,然后用Kibana建立自定義的儀表板或者任何你熟悉的語言開發展示界面,您可以使用Elasticsearch的聚合功能來執行復雜的商業智能與數據查詢。

    本文由賽克藍德(secisland)原創,轉載請標明作者和出處。

    對于碼農來說,比較有名的案例是github,gihtub 的搜索是基于 Elasticsearch 構建的,在 github.com/search 頁面,你可以檢索項目、用戶、issue、pull request,還有代碼。共有 40-50個 索引庫,分別用于索引網站需要跟蹤的各種數據。雖然只索引項目的主分支(master),但這個數據量依然巨大,20億索引文檔,30TB的索引文件

Elasticsearch的核心概念

    下面介紹Elasticsearch的幾個核心概念,準實時索引(Near Realtime),集群(cluster),節點(node), 索引(index),類型(type),文檔(document),分片和復制(shards Replicas)。

準實時索引(Near Realtime)

Elasticsearch是準實時搜索平臺。這意味著有輕微的延遲(通常為1秒)就可以從入庫建索引文件到已經進行關鍵字搜索。

集群(cluster)

集群是由一個或多個節點組成,對外提供服務,對外提供索引和搜索功能。在所有節點,一個集群有一個唯一的名稱默認為“Elasticsearch”。此名稱是很重要的,因為每個節點只能是群集的一部分,當該節點被設置為相同的名稱時,就會自動加入群集。當需要有多個集群的時候,要確保每個集群的名稱不能重復,否則,節點可能會加入錯誤的群集。請注意,一個節點只能加入一個集群。此外,您還可以擁有多個獨立的集群,每個集群都有其不同的集群名稱。例如,在開發過程中,你可以建立開發集群庫和測試集群庫,分別為開發,測試服務。

節點(node)

一個節點是一個邏輯上獨立的服務,它是群集的一部分,可以存儲數據,并參與集群的索引和搜索功能。就像集群一樣,一個節點也有唯一的名字,默認是一個隨機的和機器相關的名稱,在啟動的時候分配。如果你不想要的默認值,你可以定義任何你想要的節點名。這個名字在管理中很重要,在網絡中Elasticsearch群集通過節點名稱進行管理和通信。一個節點可以被配置為加入一個特定的群集。默認情況下,每個節點會加入名為Elasticsearch的集群中,這意味著如果你在網絡上啟動多個節點,如果網絡暢通,他們能彼此發現并自動加入一個名為Elasticsearch的集群中。在一個單一的集群中,你可以擁有多個你想要的節點。當網絡沒有集群運行的時候,只要啟動任何一個節點,這個節點會默認生成一個新的集群,這個集群會有一個節點。

索引(index)

索引是有點結構的文檔集合。例如,可以有一個客戶數據的索引,另一個是產品目錄的索引,還有一個訂單數據的索引。一個索引是一個名稱(必須是全部小寫),這個名字是用來指在執行索引、搜索、更新和刪除操作時對文檔的索引。在一個單一的集群中,您可以定義多個你想要的索引。

類型(type)

在索引中,可以定義一個或多個類型。類型是索引的邏輯分區。在一般情況下,一種類型被定義為具有一組公共字段的文檔。例如,讓我們假設你運行一個博客平臺,并把所有的數據存儲在一個索引中。在這個索引中,您可以定義一個類型為用戶數據,另一種類型為博客數據,另一種類型的評論數據。

文檔(document)

文檔是可以被索引的基本單位。例如,你可以有一個的客戶文檔,有一個產品文檔,還有一個訂單的文檔文檔是以JSON(JavaScript Object Notation)格式存儲的。在一個索引中,您可以存儲多個的文檔。請注意,雖然在一個索引中有多分文檔,但這些文檔的結構是一致的,并在第一次存儲的時候指定。

分片(shards)

一個索引可以存儲很大的數據,這些空間可以超過一個節點的物理存儲的限制。例如,十億個文檔占用磁盤空間為1TB。僅從單個節點搜索可能會很慢,還有一臺物理機器也不一定能存儲這么多的數據為了解決這一問題,Elasticsearch將索引分解成多個分片。當你創建一個索引,你可以簡單地定義你想要的分片數量。每個分片本身是一個全功能的、獨立的單元,可以托管在集群中的任何節點。

分片主要有兩個很重要的原因是:

1、它允許你水平分割擴展你的數據。

2、它允許你分配和并行操作(可能在多個節點上)從而提高性能和吞吐量

這些很強大的功能對用戶來說是透明的,你不需要做什么操作,系統會自動處理。

復制(Replicas)

復制是一個非常有用的功能,不然會有單點問題。當網絡中的某個節點出現問題的時候,復制可以對故障進行轉移,保證系統的高可用。因此,Elasticsearch允許你創建一個或多個拷貝,你的索引分片就形成了所謂的副本或副本分片。

復制是重要的,主要的原因有:

1、它提供了高可用性,當節點失敗的時候不受影響。需要注意的是,一個復制的分片不會存儲在同一個節點中。

2、它允許您擴展您的搜索量,提高并發量,因為搜索可以在所有副本上并行的執行。

總結一下,每個索引可以拆分成多個分片。索引可以復制零個或者多個分片。一旦復制,每個索引就有了主分片和復本分片。分片的數量和副本的數量可以在創建索引時定義。當創建索引后,你可以隨時改變副本的數量,但你不能改變分片的數量。

默認情況下,每個索引分配5個分片和1個副本,這意味著你的集群節點至少要有兩個節點,你將擁有5個主要的分片和5個副本分片共有10個分片。

注:每個Elasticsearch分片是一個Lucene的索引。有文檔,你可以在一個單一的Lucene索引中存儲的最大值為lucene-5843,極限是2147483519(= integer.max_value - 128)個文檔。你可以使用_cat/shards api監控碎片的大小。

賽克藍德(secisland)后續會逐步對Elasticsearch的最新版本的各項功能進行分析,近請期待。

 本文由用戶 luojun1272 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!