手把手教你使用 Spring Boot 3 開發上線一個前後端分離的生產級系統(七) - Elasticsearch 8.2 整合與配置

xxyopen 發表於 2022-05-31
ElasticSearch Spring

介紹

Elastic Stack 是一個可以幫助我們構建搜尋體驗、解決問題並取得成功的搜尋平臺。核心產品包括 Elasticsearch、Kibana、Beats 和 Logstash(也稱為 ELK Stack)等等。能夠安全可靠地獲取任何來源、任何格式的資料,然後實時地對資料進行搜尋、分析和視覺化。

Elasticsearch 和 Kibana 都是在免費開源的基礎上構建而成,適用於各種各樣的用例,從日誌開始,到能夠想到的任何專案,無一不能勝任。

Elasticsearch 是一個基於 JSON 的分散式、RESTful 風格的搜尋和資料分析引擎,能夠解決不斷湧現出的各種用例。 作為 Elastic Stack 的核心,它集中儲存資料,幫助發現意料之中以及意料之外的情況。

Kibana 是一個免費且開放的使用者介面,能夠對 Elasticsearch 資料進行視覺化,並在 Elastic Stack 中進行導航。我們可以進行各種操作,從跟蹤查詢負載,到理解請求如何流經整個應用,都能輕鬆完成。

Elasticsearch Java API Client 是自 7.16 版本開始穩定釋出的官方 Java API 客戶端。該客戶端為所有 Elasticsearch API 提供強型別請求和響應。主要特性如下:

  • 所有 Elasticsearch API 的強型別請求和響應。
  • 所有 API 的阻塞和非同步版本。
  • 在建立複雜的巢狀結構時,使用流利的構建器和功能模式允許編寫簡潔易讀的程式碼。
  • 通過使用物件對映器(例如 Jackson)或任何 JSON-B 實現來無縫整合應用程式類。
  • 將協議處理委託給 http 客戶端,例如 Java Low Level REST Client ,該客戶端負責處理所有傳輸級別的問題:HTTP 連線池、重試、節點發現等。

Elasticsearch Java API Client 是一個全新的客戶端庫,與舊的 High Level Rest Client (HLRC) 沒有任何關係。它提供了一個獨立於 Elasticsearch 伺服器程式碼的庫,併為所有 Elasticsearch 功能提供了一個非常一致且更易於使用的 API。

Elasticsearch Java API Client 圍繞三個主要元件構建:

  • API 客戶端類。它們為 Elasticsearch API 提供強型別資料結構和方法。由於 Elasticsearch API 很大,它以功能組(也稱為“名稱空間”)的形式構成,每個組都有自己的客戶端類。Elasticsearch 核心功能在 ElasticsearchClient 類中實現。
  • JSON 物件對映器。將應用程式類對映到 JSON 並將它們與 API 客戶端無縫整合。
  • 傳輸層實現。這是所有 HTTP 請求處理髮生的地方。

以下程式碼片段建立並將這三個元件連線在一起:

// 1. Create the low-level client
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200)).build();

// 2. Create the transport with a Jackson mapper
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());

// 3. And create the API client
ElasticsearchClient client = new ElasticsearchClient(transport);

整合與配置

  1. Elasticsearch 和 Kibana 安裝,如果不想在本地安裝 Elasticsearch 和 Kibana,可以使用官方提供的免費試用版 Elastic Cloud

  2. Kibana 中建立小說索引:

PUT /book
{
  "mappings" : {
    "properties" : {
      "id" : {
        "type" : "long"
      },
      "authorId" : {
        "type" : "long"
      },
      "authorName" : {
        "type" : "text",
        "analyzer": "ik_smart"
      },
      "bookName" : {
        "type" : "text",
        "analyzer": "ik_smart"
      },
      "bookDesc" : {
        "type" : "text",
        "analyzer": "ik_smart"
      },
      "bookStatus" : {
        "type" : "short"
      },
      "categoryId" : {
        "type" : "integer"
      },
      "categoryName" : {
        "type" : "text",
        "analyzer": "ik_smart"
      },
      "lastChapterId" : {
        "type" : "long"
      },
      "lastChapterName" : {
        "type" : "text",
        "analyzer": "ik_smart"
      },
      "lastChapterUpdateTime" : {
        "type": "long"
      },
      "picUrl" : {
        "type" : "keyword",
        "index" : false,
        "doc_values" : false
      },
      "score" : {
        "type" : "integer"
      },
      "wordCount" : {
        "type" : "integer"
      },
      "workDirection" : {
        "type" : "short"
      },
      "visitCount" : {
        "type": "long"
      }
    }
  }
}
  1. 專案新增如下依賴:
<dependencies>

    <dependency>
      <groupId>co.elastic.clients</groupId>
      <artifactId>elasticsearch-java</artifactId>
      <version>8.2.0</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.3</version>
    </dependency>

</dependencies>
  1. 在 application.yml 中配置如下連線資訊:
spring:
  elasticsearch:
    uris:
      - https://my-deployment-ce7ca3.es.us-central1.gcp.cloud.es.io:9243
    username: elastic
    password: qTjgYVKSuExX
  1. 新增我們自己的 Elasticsearch 配置類,配置一個 ElasticsearchClient 如下:
/**
 * elasticsearch 相關配置
 *
 * @author xiongxiaoyang
 * @date 2022/5/23
 */
@Configuration
@ConditionalOnProperty(prefix = "spring.elasticsearch", name = "enable", havingValue = "true")
public class EsConfig {

    @Bean
    public ElasticsearchClient elasticsearchClient(RestClient restClient) {

        // Create the transport with a Jackson mapper
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());

        // And create the API client
        return new ElasticsearchClient(transport);
    }

}

說明:因為我們使用的是 Spring Boot 專案,當我們引入了 Java API Client 的 maven 相關依賴時,Spring Boot 的自動配置類 ElasticsearchRestClientAutoConfiguration 生效,會自動為我們配置一個 RestClient。所以 Elasticsearch Java API Client 連線三步驟的第一步Create the low-level client可以省略。

@AutoConfiguration
@ConditionalOnClass({RestClientBuilder.class})
@EnableConfigurationProperties({ElasticsearchProperties.class, ElasticsearchRestClientProperties.class})
@Import({RestClientBuilderConfiguration.class, RestHighLevelClientConfiguration.class, RestClientFromRestHighLevelClientConfiguration.class, RestClientConfiguration.class, RestClientSnifferConfiguration.class})
public class ElasticsearchRestClientAutoConfiguration {
    public ElasticsearchRestClientAutoConfiguration() {
    }
}