背景及常見術語

背景

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

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

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

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

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

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

面向文件

Elasticsearch 是 面向文件 的,意味著它儲存整個物件或 文件。Elasticsearch 不僅儲存文件,而且 索引 每個文件的內容,使之可以被檢索。在 Elasticsearch 中,我們對文件進行索引、檢索、排序和過濾—而不是對行列資料。這是一種完全不同的思考資料的方式,也是 Elasticsearch 能支援複雜全文檢索的原因。

幾個關鍵詞
  • 實時
  • 分散式
  • 搜尋
  • 分析
優勢
  • Elasticsearch對模糊搜尋非常擅長(搜尋速度很快)
  • 從Elasticsearch搜尋到的資料可以根據評分過濾掉大部分的,只要返回評分高的給使用者就好了(原生就支援排序)
  • 沒有那麼準確的關鍵字也能搜出相關的結果(能匹配有相關性的記錄)
常見術語
  • Index:Elasticsearch的Index相當於資料庫的Table
  • Type:這個在新的Elasticsearch版本已經廢除(在以前的Elasticsearch版本,一個Index下支援多個Type--有點類似於訊息佇列一個topic下多個group的概念)
  • Document:Document相當於資料庫的一行記錄
  • Field:相當於資料庫的Column的概念
  • Mapping:相當於資料庫的Schema的概念(個人感覺這個解釋不太合理,說白了其實就是靜態型別對映)
  • DSL:相當於資料庫的SQL(給我們讀取Elasticsearch資料的API)

  • cluster:一組擁有共同的 cluster name 的節點
  • node:叢集中的一個 例項
  • primary shard: 索引的子集,索引可以切分成多個分片,分佈在不同的節點,分片對應的是lucene中的索引
  • replica shard:每個主分片可以有一個或者多個副本
  • allocation:將分片分配給某個節點的過程,包括分配主分片或副本。如果是副本,還包括從主分片複製資料的過程

客戶端

節點客戶端(Node client)

節點客戶端作為一個非資料節點加入到本地叢集中。換句話說,它本身不儲存任何資料,但是它知道資料在叢集中的哪個節點中,並且可以把請求轉發到正確的節點。

傳輸客戶端(Transport client)

輕量級的傳輸客戶端可以將請求傳送到遠端叢集。它本身不加入叢集,但是它可以將請求轉發到叢集中的一個節點上。

注意️

兩個 客戶端都是通過 埠並使用 Elasticsearch 的原生 傳輸 協議和叢集互動。叢集中的節點通過埠 彼此通訊。如果埠沒有開啟,節點將無法形成一個叢集。

客戶端作為節點必須和 Elasticsearch 有相同的 主要 版本;否則,它們之間將無法互相理解。

應用場景

如果要將應用程式和 Elasticsearch 叢集進行解耦,傳輸客戶端是一個理想的選擇。例如,如果您的應用程式需要快速的建立和銷燬到叢集的連線,傳輸客戶端比節點客戶端”輕”,因為它不是一個叢集的一部分。

類似地,如果您需要建立成千上萬的連線,你不想有成千上萬節點加入叢集。傳輸客戶端( TC )將是一個更好的選擇。

另一方面,如果你只需要有少數的、長期持久的物件連線到叢集,客戶端節點可以更高效,因為它知道叢集的佈局。但是它會使你的應用程式和叢集耦合在一起,所以從防火牆的角度,它可能會構成問題。

RESTful API with JSON over HTTP

可以使用 RESTful API 通過埠 和 Elasticsearch 使用類GraphQL語義進行通訊,可以用任何一個 web 客戶端訪問 Elasticsearch

java - spring接入方式

https://spring.io/projects/spring-data-elasticsearch