介紹
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);
整合與配置
-
Elasticsearch 和 Kibana 安裝,如果不想在本地安裝 Elasticsearch 和 Kibana,可以使用官方提供的免費試用版 Elastic Cloud
-
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"
}
}
}
}
- 專案新增如下依賴:
<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>
- 在 application.yml 中配置如下連線資訊:
spring:
elasticsearch:
uris:
- https://my-deployment-ce7ca3.es.us-central1.gcp.cloud.es.io:9243
username: elastic
password: qTjgYVKSuExX
- 新增我們自己的 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() {
}
}