在本教程中,我們將通過實際操作和實用的方式,探索使用 Spring Boot 進行 Elasticsearch 的基礎知識。我們將學習如何使用 Spring Data Elasticsearch 模塊創建索引、進行 CRUD 操作、搜索和查詢 Elasticsearch 文檔。我們還將看看如何在我們的 Spring 應用程序中記錄 Elasticsearch 的請求和響應數據。
1. 介紹
Elasticsearch 是一個強大且廣泛使用的開源搜索和分析引擎,基于 Lucene。它設計用于快速和近實時地存儲、搜索和分析大量數據。
以下是 Elasticsearch 的一些關鍵功能:
-
全文搜索: Elasticsearch 在全文搜索方面表現出色。它能夠高效地索引和搜索大量非結構化或半結構化文本數據。
-
JSON 文檔: Elasticsearch 中的數據以 JSON 文檔的形式存儲。每個文檔存儲在一個索引中,概念上類似于關系型數據庫中的表。這使得 Elasticsearch 是無模式的,可以在沒有預定義結構的情況下索引和搜索數據。
-
查詢: Elasticsearch 提供了豐富而靈活的查詢語言,使我們能夠執行從簡單到復雜的搜索。我們可以使用各種查詢類型(如術語查詢、匹配查詢、范圍查詢等)來過濾、聚合和排序數據。
-
分析器和分詞器: Elasticsearch 包含強大的文本分析功能,如分析器和分詞器,可以將文本分解為令牌以實現高效的搜索和索引。它支持多種語言和自定義分析器。
2. Elasticsearch 環境搭建
參考第一篇文章
3. 創建項目和配置elasticsearch
3.1. Maven
添加spring-boot-starter-data-elasticsearch
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
3.2. Elasticsearch ClientConfiguration
Spring Data Elasticsearch 依賴于一個 Elasticsearch 客戶端(由 Elasticsearch 客戶端庫提供),該客戶端可以連接到單個 Elasticsearch 節點或集群。
Elasticsearch 客戶端配置.
@Configuration
public class ImperativeElasticsearchConfig extends ElasticsearchConfiguration {@Overridepublic ClientConfiguration clientConfiguration() {return ClientConfiguration.builder().connectedTo("192.168.163.13:9200").withBasicAuth("elastic", "123456").build();}
}
在上述配置之后,我們可以將以下 bean 注入到其他 Spring 組件中:
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import org.elasticsearch.client.RestClient;@Autowired
ElasticsearchOperations operations;@Autowired
ElasticsearchClient elasticsearchClient;@Autowired
RestClient restClient;
注意: 我們應該使用 ElasticsearchOperations來與 Elasticsearch 集群交互。
當我們使用repositories時,底層使用的也是ElasticsearchOperations。
4. Document 相關的注解
Spring Data Elasticsearch 支持使用 Java 類作為可以映射到 Elasticsearch 文檔的實體。這些類使用 @Document 注解,其字段使用 @Field 注解來映射到 Elasticsearch 字段。
在我們的演示中,我們將創建一個 Employee ,該doc具有諸如name和salary等屬性,如下所示:
@Data
@Document(indexName = "employees", createIndex = true)
public class Employee {@Idprivate String employeeId;@Field(type = FieldType.Text, name = "name")private String name;@Field(type = FieldType.Long, name = "salary")private long salary;// setters and getters
}
現在,解釋這些注解:
-
@Document – 應用在類級別,表示這個類是索引的mapping。
- indexName – 存儲此實體的索引名稱。
- createIndex – 標志決定是否在倉庫引導時創建索引。默認值為 true。
-
@Id – 應用在字段級別,標記字段作為主鍵。
-
@Field – 應用在字段級別,定義字段的屬性,如名稱、類型、格式等。
5. Spring Data Elasticsearch APIs 分類說明
Spring Data Elasticsearch 提供了方便的抽象和模板,用于與 Elasticsearch 進行交互。它提供了高級抽象和數據訪問方法,使我們無需直接處理底層 API。
-
ElasticsearchOperations (推薦)
包含常見的輔助函數,其他方法已經被 移動到ElasticsearchOperations擴展的不同接口中。這些接口現在反映了 Elasticsearch 的 REST API 結構。
- DocumentOperations 包含與保存或刪除相關的函數。
- SearchOperations 包含在 Elasticsearch 中進行搜索的函數。
- IndexOperations 定義了在索引上操作的函數,如索引創建或映射創建。
-
ElasticsearchRepository: 是一個擴展了標準 Spring Data CrudRepository 的倉庫接口。我們可以通過定義自定義方法和查詢來創建自定義倉庫。
-
ElasticsearchTemplate: 是一個高級 API,提供了各種與 Elasticsearch 交互的方法。它允許我們執行索引、查詢和文檔操作。
在后續部分,我們將深入探討如何使用這些 API 的詳細內容。
6. 使用 ElasticsearchOperations
完成必要的客戶端配置后,我們可以將 ElasticsearchOperations bean 自動裝配到服務類中,并使用其方法執行 CRUD 操作。
@Autowired private ElasticsearchOperations elasticsearchOperations;
5.1. 對doc的增刪改查
我們可以使用傳統的 save()、get() 或 delete() 方法來執行針對 Elasticsearch 文檔的操作。
- save() 操作具有 保存或更新語義。
- get() 方法從 Elasticsearch 索引中檢索文檔。要檢索所需的文檔,必須提供主鍵。
- delete() 方法允許從索引中刪除文檔。
Employee employee = new Employee(