Spring Boot 2.x(十七):快速入門Elastic Search

Vi的技術部落格發表於2019-05-20

What —— Elasticsearch是什麼?

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

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

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

面向文件

Elasticsearch是面向文件,即文件是可以被索引的資訊的基本單位,而文件的格式是在NoSQL中常用的JSON,關於關係型資料庫和Elasticsearch之間一些名詞的關係的對應可以用以下的表格來表示,方便我們後面的應用:

關係型資料庫 Elasticsearch
Database Index
Table Type
Row Document
Column Field
Schema Mapping

這裡需要注意的是文件的格式不是固定的,同一個Type下的不同文件可以擁有不同的格式

Why —— 為什麼選擇Elasticsearch?

  • 豐富的查詢方式——Elasticsearch能夠執行及合併多種型別的搜尋(結構化資料、非結構化資料、地理位置、指標),搜尋方式隨心而變。
  • 極速的查詢速度——Elasticsearch通過有限狀態轉換器實現了用於全文檢索的倒排索引,實現了用於儲存數值資料和地理位置資料的 BKD 樹,以及用於分析的列儲存。每個資料都被編入了索引。

  • 可觀的可擴充套件性——Elasticsearch能夠水平擴充套件,每秒鐘可處理海量事件,同時能夠自動管理索引和查詢在叢集中的分佈方式,可以在承載了 PB 級資料的成百上千臺伺服器上執行。
  • 強大的彈性保障——硬體故障。網路分割。Elasticsearch 檢測這些故障並確保叢集(和資料)的安全性和可用性。通過跨叢集複製功能,輔助叢集可以作為熱備份隨時投入使用。

How —— 如何在Spring Boot實戰中使用Elasticsearch?

安裝Elasticsearch

https://www.elastic.co/cn/downloads/elasticsearch

這裡我們選擇的是6.2.2版本的ES,因為我在spring-data-elasticsearch的github上看到最新版本的支援的ES是6.2.2

Spring Boot 2.x(十七):快速入門Elastic Search
其中3.2.x版本尚未釋出正式版,所以這裡選擇了最新的3.1.8版本,下面我們切換到安裝目錄的bin目錄下,啟動es:

./elasticsearch &

這裡新增 & 符號的作用是讓它在後臺執行。
Spring Boot 2.x(十七):快速入門Elastic Search
看到這個就說明啟動成功了~

安裝中文分詞器iK

因為,在我們日常的應用中,我們用的比較多的都是中文的分詞,所以這裡我們需要一箇中文的分詞器

首先前往github上下載與ES版本對應的zip包

https://github.com/medcl/elasticsearch-analysis-ik/releases

然後在es的安裝目錄下的plugins下新建一個ik的目錄,將zip包解壓到該目錄下重啟es即可~
Spring Boot 2.x(十七):快速入門Elastic Search
在es的啟動日誌中看到這個說明外掛已經安裝並啟動成功!
到這裡,我們的前期準備工作就已經結束了,下面的就是在Spring Boot專案中進行操作了~

新增pom依賴

我們首先在pom.xml中新增spring-data-elasticsearch的依賴(敲黑板!!這裡的版本一定要去參考一下對應的ES的版本,不然就會引起版本相容性問題而報錯!):

      <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.1.8.RELEASE</version>
        </dependency>

依賴已經新增完畢,下面我們就通過簡單的配置來完成CRUD

CRUD

這裡的配置需要注意一個點,我們訪問的9200是HTTP的埠號,而使用Java的時候需要配置成9300:

spring:
  data:
    elasticsearch:
      cluster-name: my-applicatioon
      cluster-nodes: 127.0.0.1:9300

在啟動日誌中,我們可以看到這一點:
Spring Boot 2.x(十七):快速入門Elastic Search

然後我們通過註解來完成一個index和mapping的建立(即對應關係型資料庫中的庫和表)

@Data
@Document(indexName = "test",type = "article")
public class Article implements Serializable {

    private Long id;

    @Field(type= FieldType.Text,analyzer = "ik_max_word")
    private String title;

    private String content;
}

@Filed註解中的屬性可以對分詞器進行配置analyzer = "ik_max_word",這樣就可以在查詢標題的時候使我們的中文分詞器了~

這樣,我們就建立了一個index(database)名為test,並新建一個type(table)名為article。

下面,我們如果想要完成CRUD,只需要建立一個介面去繼承ElasticsearchRepository即可,如下:

public interface ESDao extends ElasticsearchRepository<Article,Long> {
}

然後,我們就可以在我們專案這樣去用了~
Spring Boot 2.x(十七):快速入門Elastic Search
和JPA一樣方便,我們這時就可以把ES當做MySQL去操作即可~

專案中用到的對應版本的包我已經上傳到了百度網盤,關注公眾號回覆“ES”即可獲取。
完整的Demo程式碼我已經上傳到了github,歡迎fork star pr

https://github.com/viyog/viboot

原創不易,謝謝支援!

公眾號

Spring Boot 2.x(十七):快速入門Elastic Search

相關文章