ES的基本概念


 Elasticsearch作為這幾年最流行的搜索引擎,越來越多的互聯網企業都在采用它;作為java開發者來說,如果想進一步提高自己能力,同時也為了能夠在實際工作中遇到搜索、存儲問題多一個解決方案,學習ES絕對大家工作、學習乃至找工作都是一個極大的好處。下面我就結合自己學習ES的一些心路歷程,把它的原理、安裝、使用以及常用功能分別做下介紹。

什么是Elasticsearch?

Elasticsearch 是一個分布式可擴展的實時搜索和分析引擎,一個建立在全文搜索引擎 Apache Lucene(TM) 基礎上的搜索引擎.當然 Elasticsearch 並不僅僅是 Lucene 那么簡單,它不僅包括了全文搜索功能,還可以進行以下工作:

  • 分布式實時文件存儲,並將每一個字段都編入索引,使其可以被搜索。
  • 實時分析的分布式搜索引擎。
  • 可以擴展到上百台服務器,處理PB級別的結構化或非結構化數據。

ES能做什么工作?

 1)檢索數據: 對於海量數據的應用,一般關系型數據庫檢索問題一直是噩夢,ES就算為解決它而生,有了它快速搜索不再是開發者頭痛的難題
 2)分布式存儲:相對於傳統存儲解決方案,ES提供的分片、持久化方案,既比關系型類型數據庫速度快、又比緩存數據庫(如REDIS等)存的多、持久化也更好
 3)數據分析: ES結合Logstash、Kibana 構成大名鼎鼎的ELK,實時大規模的日志收集、分析和展示,讓用戶可以多維度對日志實現分析、查詢和管理。

 ES基本構成

 Elasticsearch是面向文檔型數據庫,一條數據在這里就是一個文檔,用JSON作為文檔序列化的格式;因為它是分布式存儲結構,所以有以下幾個基本概念:

集群(Cluster):一個集群是由一個或多個節點(服務器)組成的,通過所有的節點一起保存你的全部數據並且提供聯合索引和搜索功能的節點集合。每個集群有一個唯一的名稱標識,默認是“elasticsearch”。這個名稱非常重要,因為一個節點(Node)只有設置了這個名稱才能加入集群,成為集群的一部分。

節點(Node):

一個節點是一個單一的服務器,是你的集群的一部分,存儲數據,並且參與集群的索引和搜索功能。跟集群一樣,節點在啟動時也會被分配一個唯一的標識名稱,這個名稱默認是一個隨機的UUID(Universally Unique IDentifier)。如果你不想用默認的名稱,你可以自己定義節點的名稱。這個名稱對於管理集群節點,識別哪台服務器對應集群中的哪個節點有重要的作用。

一個節點可以通過配置特定的集群名稱來加入特定的集群。默認情況下,每個節點被設定加入一個名稱為“elasticsearch”的集群,這意味着如果你在你的網絡中啟動了一些節點,並且假設它們能相互發現,它們將會自動組織並加入一個名稱是“elasticsearch”的集群。

索引(Index):

  一個索引就是含有某些相似特性的文檔的集合。例如,你可以有一個用戶數據的索引,一個產品目錄的索引,還有其他的有規則數據的索引。一個索引被一個名稱(必須都是小寫)唯一標識,並且這個名稱被用於索引通過文檔去執行索引,搜索,更新和刪除操作。

類型(Type):

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

文檔(document):
        一個文檔是一個可被索引的基礎信息單元。比如,你可以擁有某一個客戶的文檔,某一個產品的一個文檔,當然,也可以擁有某個訂單的一個文檔。文檔以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯網數據交互格式。
        在一個index/type里面,只要你想,你可以存儲任意多的文檔。注意,盡管一個文檔,物理上存在於一個索引之中,文檔必須被索引/賦予一個索引的type。

 

 

 

分片和復制(shards & replicas):

一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引占據1TB的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,響應太慢。
        
        為了解決這個問題,Elasticsearch提供了將索引划分成多份的能力,這些份就叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到集群中的任何節點上。
        
        分片之所以重要,主要有兩方面的原因:
        
            - 允許你水平分割/擴展你的內容容量
            - 允許你在分片(潛在地,位於多個節點上)之上進行分布式的、並行的操作,進而提高性能/吞吐量
        
        至於一個分片怎樣分布,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對於作為用戶的你來說,這些都是透明的。
        
        在一個網絡/雲的環境里,失敗隨時都可能發生,在某個分片/節點不知怎么的就處於離線狀態,或者由於任何原因消失了,這種情況下,有一個故障轉移機制是非常有用並且是強烈推薦的。為此目的,Elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做復制分片,或者直接叫復制。
        
        復制之所以重要,有兩個主要原因:
            - 在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到復制分片從不與原/主要(original/primary)分片置於同一節點上是非常重要的。
            - 擴展你的搜索量/吞吐量,因為搜索可以在所有的復制上並行運行
            
        總之,每個索引可以被分成多個分片。一個索引也可以被復制0次(意思是沒有復制)或多次。一旦復制了,每個索引就有了主分片(作為復制源的原來的分片)和復制分片(主分片的拷貝)之別。分片和復制的數量可以在索引創建的時候指定。在索引創建之后,你可以在任何時候動態地改變復制的數量,但是你事后不能改變分片的數量。
        
        默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個復制,這意味着,如果你的集群中至少有兩個節點,你的索引將會有5個主分片和另外5個復制分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。

 和MYSQL的比較

上面是文字介紹,下面用一個圖片來說明,這個圖片是把ES和傳統關系型數據庫MYSQL來做比較,看一遍基本就能明白上面所說的概念

(1)關系型數據庫中的數據庫(DataBase),等價於ES中的索引(Index) 
(2)一個數據庫下面有N張表(Table),等價於1個索引Index下面有N多類型(Type), 
(3)一個數據庫表(Table)下的數據由多行(ROW)多列(column,屬性)組成,等價於1個Type由多個文檔(Document)和多Field組成。 
(4)在一個關系型數據庫里面,schema定義了表、每個表的字段,還有表和字段之間的關系。 與之對應的,在ES中:Mapping定義索引下的Type的字段處理規則,即索引如何建立、索引類型、是否保存原始索引JSON文檔、是否壓縮原始JSON文檔、是否需要分詞處理、如何進行分詞處理等。 
(5)在數據庫中的增insert、刪delete、改update、查search操作等價於ES中的增PUT/POST、刪Delete、改_update、查GET.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM