1. 程式人生 > >ElasticSearch入門(一)

ElasticSearch入門(一)

1.基本概念

1.1 常用的全文搜尋框架

       1、Lucene             Apache下面的一個開源專案,高效能的、可擴充套件的工具庫,提供搜尋的基本架構;             如果開發人員需用使用的話,需用自己進行開發,成本比較大,但是效能高

        2、solr             Solr基於Lucene的全文搜尋框架,提供了比Lucene更為豐富的功能,             同時實現了可配置、可擴充套件並對查詢效能進行了優化             建立索引時,搜尋效率下降,實時索引搜尋效率不高             資料量的增加,Solr的搜尋效率會變得更低,適合小的搜尋應用,對應java客戶端的是solrj

        3、elasticSearch             基於Lucene的搜尋框架, 它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面             上手容易,拓展節點方便,可用於儲存和檢索海量資料,接近實時搜尋,海量資料量增加,搜尋響應效能幾乎不受影響;             分散式搜尋框架,自動發現節點,副本機制,保障可用性

1.2 基本介紹

Elasticsearch 是一個開源的搜尋引擎,建立在一個全文搜尋引擎庫 Apache Lucene™ 基礎之上。 Lucene 可以說是當下最先進、高效能、全功能的搜尋引擎庫--無論是開源還是私有。

但是 Lucene 僅僅只是一個庫。為了充分發揮其功能,你需要使用 Java 並將 Lucene 直接整合到應用程式中。 更糟糕的是,您可能需要獲得資訊檢索學位才能瞭解其工作原理。Lucene 非常 複雜。

Elasticsearch 也是使用 Java 編寫的,它的內部使用 Lucene 做索引與搜尋,但是它的目的是使全文檢索變得簡單, 通過隱藏 Lucene 的複雜性,取而代之的提供一套簡單一致的 RESTful API。

然而,Elasticsearch 不僅僅是 Lucene,並且也不僅僅只是一個全文搜尋引擎。 它可以被下面這樣準確的形容:

  • 一個分散式的實時文件儲存,每個欄位
    可以被索引與搜尋
  • 一個分散式實時分析搜尋引擎
  • 能勝任上百個服務節點的擴充套件,並支援 PB 級別的結構化或者非結構化資料

Elasticsearch 將所有的功能打包成一個單獨的服務,這樣你可以通過程式與它提供的簡單的 RESTful API 進行通訊, 可以使用自己喜歡的程式語言充當 web 客戶端,甚至可以使用命令列(去充當這個客戶端)。

1.3 ElasticSearch的一些特性和概念

  • 近實時性(Near Realtime[NRT])

Elasticsearch是一個近實時的搜尋平臺。這意味著當你匯入一個文件並把它變成可搜尋的時間僅會有輕微的延時。

  • 叢集(Cluster)

一個叢集是由一個或多個節點(伺服器)組成的,通過所有的節點一起儲存你的全部資料並且提供聯合索引和搜尋功能的節點集合。每個叢集有一個唯一的名稱標識,預設是“elasticsearch”。這個名稱非常重要,因為一個節點(Node)只有設定了這個名稱才能加入叢集,成為叢集的一部分。

確保你沒有在不同的環境下重用相同的名稱,否則你最終可能會將節點加入錯誤的叢集。例如你可以使用logging-dev,logging-stage和logging-prod來分別給開發,展示和生產叢集命名。

注意,一個叢集中只有一個節點是有效的並且是非常好的。所以這樣的話,你可能需要部署多個叢集並且每個叢集有它們唯一的叢集名稱。

  • 節點(Node)

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

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

在一個叢集中,你想啟動多少節點就可以啟動多少節點。此外,如果沒有其它節點執行在當前網路中,只啟動一個節點將預設形成一個新的名稱為“elasticsearch”單節點叢集。

  • 索引(Index)

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

在一個叢集中,你可以根據自己的需求定義任意多的索引。

  • 型別(Type)[Deprecated in 6.0.0.] 警告!Type在6.0.0版本中已經不贊成使用
  • 文件(Document)

一個文件是一個可被索引的資料的基礎單元。例如,你可以給一個單獨的使用者建立一個文件,給單個產品建立一個文件,以及其他的單獨的規則。這個文件用JSON格式表現,JSON是一種普遍的網路資料交換格式。

在一個索引或型別中,你可以根據自己的需求儲存任意多的文件。注意,雖然一個文件在物理儲存上屬於一個索引,但是文件實際上必須指定一個在索引中的型別。

  • 分片和複製(Shards & Replicas)

我們在一個索引裡儲存的資料,潛在的情況下可能會超過單節點硬體的儲存限制。例如,單個索引有上千萬個文件需要佔用1TB的硬碟儲存空間,但是一臺機器的硬碟可能沒有這麼大,或者是即便有這麼大,但是單個節點在提供搜尋服務時會響應緩慢。

為了解決這個問題,Elasticsearch提供了分片的能力,它可以將你的索引細分成多個部分。當你建立一個索引的時候,你可以簡單的定義你想要的分片的數量。每個分片本身是一個全功能的完全獨立的“索引”,它可以部署在叢集中的任何節點上。

分片對於以下兩個主要原因很重要:

  • 它允許你水平切分你的內容卷
  • 它允許你通過分片來分佈和並行化執行操作來應對日益增長的執行量

一個分片是如何被分配以及文件又是如何被聚集起來以應對搜尋請求的,它的實現技術由Elasticsearch完全管理,並且對使用者是透明的。

在一個網路環境下或者是雲環境下,故障可能會隨時發生,有一個故障恢復機制是非常有用並且是高度推薦的,以防一個分片或節點不明原因下線,或者因為一些原因去除沒有了。為了達到這個目的,Elasticsearch允許你製作分片的一個或多個拷貝放入一個叫做複製分片或短暫複製品中。

複製對於以下兩個主要原因很重要:

  • 高可用。它提供了高可用來以防分片或節點宕機。為此,一個非常重要的注意點是絕對不要將一個分片的拷貝放在跟這個分片相同的機器上。

  • 高併發。它允許你的分片可以提供超出自身吞吐量的搜尋服務,搜尋行為可以在分片所有的拷貝中並行執行。

總結一下,每個索引可以被切分成多個分片,一個索引可以被複制零次(就是沒有複製)或多次。一旦被複制,每個索引將會有一些主分片(就是那些最原始不是被複製出來的分片),還有一些複製分片(就是那些通過複製主分片得到的分片)。

主分片和複製分片的數量可以在索引被建立時指定。索引被建立後,你可以隨時動態修改複製分片的數量,但是不能修改主分片的數量。

預設情況下,在Elasticsearch中的每個索引被分配5個主分片和一份拷貝,這意味著假設你的叢集中至少有兩個節點,你的索引將會有5個主分片和5個複製分片(每個主分片對應一個複製分片,5個複製分片組成一個完整拷貝),總共每個索引有10個分片。

每個Elasticsearch分片是一個Lucene索引。在一個Lucene索引中有一個文件數量的最大值。截至LUCENE-5843,這個限制是2,147,483,519 (= Integer.MAX_VALUE - 128)個文件。你可以使用_cat/shards API監控分片大小。

1.4 使用場景

 日誌搜尋,資料聚合,資料監控,報表統計分析,站內搜尋(電商,招聘,門戶,等等),IT系統搜尋(OA,CRM,ERP,等等),資料分析。

2 安裝ElasticSearch

1.安裝jdk8(6.4的版本要求JDK1.8)

2.下載安裝包

可以去官網(https://www.elastic.co/downloads)去也可以在線上下     使用wget 下載elasticsearch安裝包         wget  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.tar.gz     解壓         tar -zxvf elasticsearch-6.4.0.tar.gz

3. 啟動

進入bin目錄,在Linux系統中,./elasticsearch

    配置es出現相關問題處理:         1、問題一

  Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12)
            #
            # There is insufficient memory for the Java Runtime Environment to continue.
            # Native memory allocation (mmap) failed to map 986513408 bytes for committing reserved memory.
            # An error report file with more information is saved as:
            # /usr/local/software/temp/elasticsearch-6.2.2/hs_err_pid1912.log

        解決:記憶體不夠,購買阿里雲的機器可以動態增加記憶體

        2、問題二         解決:用非root使用者         新增使用者:useradd -m 使用者名稱  然後設定密碼  passwd 使用者名稱             

        3、問題三         ./elasticsearch

  Exception in thread "main" java.nio.file.AccessDeniedException: /usr/local/software/temp/elasticsearch-6.2.2/config/jvm.options

      解決:許可權不夠 chmod 777 -R 當前es目錄

官方文件: