Springboot3整合Elasticsearch8(elasticsearch-java)最佳實(shí)踐
1、Elasticsearch的JAVA客戶端選擇
Elasticsearch官方支持的客戶端
| 客戶端名稱 | 簡(jiǎn)介 | 使用建議 |
|---|---|---|
| Elasticsearch Java API Client(新客戶端) | 官方推薦的新客戶端,基于 JSON Mapping(如 ElasticsearchClient 類(lèi)),從 Elasticsearch 7.15 開(kāi)始推出。 | ?推薦用于 Spring Boot 3+,Elasticsearch 8+ |
| RestHighLevelClient(已廢棄) | 基于 REST 的高級(jí)客戶端,是 ES 6 ~ 7 的主力客戶端,ES 8 中已標(biāo)記為 deprecated。 | ?不推薦新項(xiàng)目使用 |
| Low Level REST Client | 底層客戶端,只提供 HTTP 封裝,不解析 JSON。 | ??適合自定義協(xié)議或處理特殊 JSON 請(qǐng)求場(chǎng)景 |
Spring官方對(duì)Elasticsearch的封裝
| 客戶端名稱 | 簡(jiǎn)介 | 特點(diǎn) |
|---|---|---|
| Spring Data Elasticsearch | Spring 官方對(duì) Elasticsearch 的數(shù)據(jù)訪問(wèn)封裝,支持 Repository 風(fēng)格的接口編程。 | ??開(kāi)發(fā)效率高、和 JPA 風(fēng)格一致,但功能不如原生客戶端全 |
easy-es(dromara團(tuán)隊(duì)),國(guó)人之光!
| 客戶端名稱 | 簡(jiǎn)介 | 特點(diǎn) |
|---|---|---|
| easy-es | 風(fēng)格類(lèi)似 MyBatis-Plus,一致的 API 和分頁(yè)查詢方式,Java 開(kāi)發(fā)者易于理解。 | ??開(kāi)發(fā)效率高、但是是對(duì)RestHighLevelClient的深層封裝,容易受版本影響,小團(tuán)隊(duì)維護(hù) |
總結(jié):
RestHighLevelClient 是ES7中使用最多的客戶端,但是在ES8中已經(jīng)廢棄。
easy-es 是基于RestHighLevelClient封裝的,會(huì)比較重,代碼風(fēng)格類(lèi)似 MyBatis-Plus,熟悉MP的同學(xué)容易上手,但是容易受RestHighLevelClient和Elasticsearch版本的限制,并且目前社區(qū)雖然活躍,但項(xiàng)目主要靠小團(tuán)隊(duì)維護(hù),不如官方客戶端那樣穩(wěn)定長(zhǎng)期。
Elasticsearch Java API Client 是 Elasticsearch 7.15 開(kāi)始推出最新的客戶端,能使用Elasticsearch中所有功能,首選首選!?。。。?!
Spring Data Elasticsearch 是Spring 官方對(duì) Elasticsearch的封裝,Springboot3中已經(jīng)棄用了RestHighLevelClient,選擇引用了Elasticsearch Java API Client,直接解決了依賴版本沖突的問(wèn)題,Spring社區(qū)強(qiáng)大,所以...不用我說(shuō)了吧....選我?。。。?!
2、Spring Data Elasticsearch 官方文檔
Elasticsearch Clients :: Spring Data Elasticsearch
3、Springboot3整合Spring Data Elasticsearch
tips:我使用的是Springboot3.3.4版本
3.1 maven引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>引入成功之后可以看到:

elasticsearch的新客戶端elasticsearch-java也被引入了進(jìn)來(lái)。
3.2 配置
yml配置文件
spring:
application:
name: cloud-elasticsearch
elasticsearch:
uris: http://127.0.0.1:9200 # 這里還要注意是https還是http協(xié)議
# username: elastic #如果有賬號(hào)密碼就要配置賬號(hào)密碼,否則可以不配置
# password: 123456
server:
port: 200004、【簡(jiǎn)單使用】Spring Data Elasticsearch
4.1 創(chuàng)建ES實(shí)體類(lèi)
創(chuàng)建完實(shí)體類(lèi)后,啟動(dòng)項(xiàng)目Spring會(huì)自動(dòng)根據(jù)注解,來(lái)創(chuàng)建ES的索引(index)和映射(mapping)
@Data
@Document(indexName = "news")
public class EsNews {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_smart")
private String title;//標(biāo)題
@Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_smart")
private String content;//內(nèi)容
@Field(type = FieldType.Keyword)
private String author;//作者
@Field(type = FieldType.Keyword)
private List<String> tags;//標(biāo)簽
@Field(type = FieldType.Date,pattern = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd")
@JsonProperty("publish_date")
private Date publishDate;//發(fā)布時(shí)間
@Field(type = FieldType.Date,pattern = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd")
@JsonProperty("create_time")
private Date createTime;//創(chuàng)建時(shí)間
@Field(type = FieldType.Long)
@JsonProperty("view_count")
private Long viewCount;//閱讀量
}注解解析:
@Document(indexName = "news")
該實(shí)體對(duì)應(yīng)的索引名稱為:news
@Id
ES的唯一標(biāo)識(shí)
@Field
@Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_smart")
Field(字段名) , type = FieldType.Text(字段類(lèi)型為T(mén)EXT) ,analyzer = "ik_max_word"(存入時(shí)的分詞器為ik_max_word),searchAnalyzer = "ik_smart"(搜索時(shí)的分詞器為ik_smart)
@JsonProperty("publish_date")
ES中JSON字段,迎來(lái)進(jìn)行序列化映射
tips:實(shí)際開(kāi)發(fā)中業(yè)務(wù)實(shí)體類(lèi)和ES實(shí)體類(lèi)最好是分開(kāi)的,業(yè)務(wù)實(shí)體類(lèi)主要用來(lái)做數(shù)據(jù)庫(kù)操作,ES實(shí)體類(lèi)只用來(lái)做ES檢索

4.2 繼承ElasticsearchRepository接口
public interface EsNewsRepository extends ElasticsearchRepository<EsNews,String> {
}查看ElasticsearchRepository源碼可以看到
ElasticsearchRepository也繼承了PagingAndSortingRepository(分頁(yè)和排序接口)、CrudRepository(常用基礎(chǔ)crud接口)

當(dāng)你的類(lèi)接口繼承了ElasticsearchRepository后,你輸入find,你會(huì)看到Spring幫你生成的所有常用簡(jiǎn)單的查詢語(yǔ)句。

大部分關(guān)鍵詞用法:
| 關(guān)鍵詞 | 說(shuō)明 | 等價(jià) Elasticsearch 查詢類(lèi)型 |
|---|---|---|
findBy | 查詢開(kāi)始(必須) | - |
And / Or | 條件連接符 | bool 查詢 |
Is / Equals | 等于 | term |
Between | 在兩個(gè)值之間 | range |
LessThan | 小于 | range |
LessThanEqual | 小于等于 | range |
GreaterThan | 大于 | range |
GreaterThanEqual | 大于等于 | range |
After | 大于(時(shí)間) | range |
Before | 小于(時(shí)間) | range |
IsNull | 字段為 null | must_not exists |
IsNotNull / NotNull | 字段非 null | exists |
Like | 類(lèi)似(不建議用,Elasticsearch 中更推薦 Containing) | match (部分分詞匹配) |
NotLike | 不類(lèi)似 | bool + must_not |
StartingWith | 以…開(kāi)頭(需要 keyword 類(lèi)型字段,match 不支持) | prefix / wildcard |
EndingWith | 以…結(jié)尾(需 keyword 類(lèi)型字段) | wildcard |
Containing / Contains | 包含(常用于全文檢索) | match |
NotContaining | 不包含 | bool + must_not |
In | 包含在列表中 | terms |
NotIn | 不包含在列表中 | bool + must_not terms |
True / False | 布爾值判斷 | term |
OrderBy | 排序 | sort |
4.3 CRUD接口使用
使用SpringBoot單元測(cè)試
4.3.1 新增
文檔單個(gè)新增(save):
@Test
@DisplayName("新增單個(gè)文檔")
void saveDoc(){
EsNews news = new EsNews();
news.setId("1");//如果不設(shè)置ID,Spring則會(huì)幫你生成一個(gè)ES風(fēng)格的隨機(jī)ID
news.setTitle("電影《不能說(shuō)的秘密》熱映");
news.setContent("內(nèi)容:不能說(shuō)的秘密............牛X..");
news.setAuthor("周杰倫");
news.setTags(Arrays.asList("電影", "國(guó)產(chǎn)"));
news.setPublishDate(new Date());
news.setCreateTime(new Date());
news.setViewCount(100L);
esNewsRepository.save(news);
}文檔批量新增(saveAll):
@Test
@DisplayName("批量新增文檔")
void saveBatchDoc(){
List<EsNews> newsList = new ArrayList<>();
for (int i = 1; i <= 11; i++) {
EsNews news = new EsNews();
news.setId(String.valueOf(i));
news.setTitle("電影《CPW的奇幻世界 " + i + "》");
news.setContent("內(nèi)容 " + i);
news.setAuthor("作者" + i);
news.setTags(Arrays.asList("電影", "奇幻"));
news.setPublishDate(new Date());
news.setCreateTime(new Date());
news.setViewCount(100L + i);
newsList.add(news);
}
esNewsRepository.saveAll(newsList);
}4.3.3 修改
?。。lasticsearchRepository?。?!的修改跟新增是同一個(gè)接口,如果你的對(duì)象攜帶ID,那么ES會(huì)先查詢文檔庫(kù)里是有存在這么一個(gè)ID,如果存在的話則進(jìn)行 先刪除 然后 覆蓋??!
@Test
@DisplayName("新增單個(gè)文檔")
void saveDoc(){
EsNews news = new EsNews();
news.setId("1");//ES會(huì)先找文檔庫(kù)里是否存在改ID,先刪除再覆蓋
news.setTitle("電影《不能說(shuō)的秘密》熱映");
news.setContent("內(nèi)容:不能說(shuō)的秘密........牛X..更新覆蓋操作");
news.setAuthor("周杰倫");
news.setTags(Arrays.asList("電影", "國(guó)產(chǎn)"));
news.setPublishDate(new Date());
news.setCreateTime(new Date());
news.setViewCount(100L);
esNewsRepository.save(news);
}如果你想做到只修改文檔中其中一條數(shù)據(jù),比如只把作者周杰倫修改成CPW,那就需要用到第五節(jié)【高階用法】Elasticsearch Java API Client
4.3.3 查詢
需求:我要查詢文檔編號(hào)為999的文檔
tips:簡(jiǎn)單的查詢,比如根據(jù)ID查詢文檔,ElasticsearchRepository已經(jīng)自己封裝好了,不用另外寫(xiě)。(findById)
@Test
@DisplayName("根據(jù)ID查詢文檔")
void searchByID(){
Optional<EsNews> news = esNewsRepository.findById("999");
System.out.println(news);
}
需求:我要分頁(yè)查詢,標(biāo)題包含【奇幻世界】,作者精準(zhǔn)是【作者1】的文檔
tips:這種復(fù)雜多條件的就需要我們自己寫(xiě),如果是模糊查詢的則用Containing
1、EsNewsRepository新增接口findByTitleContainingOrAuthor:
public interface EsNewsRepository extends ElasticsearchRepository<EsNews,String> {
Page<EsNews> findByTitleContainingOrAuthor(String Title, String Author,Pageable pageable);
}2、使用
@Test
@DisplayName("分頁(yè)查詢條件")
void searchAll(){
Pageable pageable = PageRequest.of(0, 10);
Page<EsNews> pageList = esNewsRepository.findByTitleContainingOrAuthor("奇幻世界","作者1",pageable);
for (EsNews news : pageList) {
System.out.println(news);
}
}
根據(jù)4.2中的關(guān)鍵詞,還有更多的用法例如過(guò)濾、排序
4.3.4 刪除
刪除就沒(méi)什么好說(shuō)的了,直接上代碼!
@Test
@DisplayName("根據(jù)ID刪除文檔")
void deleteDocById(){
esNewsRepository.deleteById("1");
System.out.println("ID為1的文檔刪除成功");
}
@Test
@DisplayName("批量刪除文檔")
void deleteBatchDoc(){
esNewsRepository.deleteAll();
System.out.println("文檔批量刪除成功");
}
@Test
@DisplayName("根據(jù)ID批量刪除文檔")
void deleteBatchDocByIds(){
List<String> idList = Arrays.asList("1", "2");
esNewsRepository.deleteAllById(idList);
System.out.println("根據(jù)ID批量刪除文檔刪除成功");
}5、【高階用法】Elasticsearch Java API Client
1、修改文檔中的某一條數(shù)據(jù)
2、高級(jí)聚合查詢
6、【最佳實(shí)踐】Elasticsearch+消息隊(duì)列(RabbitMQ)+數(shù)據(jù)庫(kù)(MYSQL)
實(shí)際應(yīng)用
到此這篇關(guān)于Springboot3整合Elasticsearch8(elasticsearch-java)最佳實(shí)踐的文章就介紹到這了,更多相關(guān)Springboot3整合Elasticsearch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot整合spring-boot-starter-data-elasticsearch的過(guò)程
- SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)
- SpringBoot集成ElasticSearch(ES)實(shí)現(xiàn)全文搜索功能
- SpringBoot3集成ElasticSearch的方法詳解
- SpringBoot實(shí)現(xiàn)elasticsearch 查詢操作(RestHighLevelClient 的案例實(shí)戰(zhàn))
- SpringBoot集成elasticsearch使用圖文詳解
- SpringBoot整合ES-Elasticsearch的實(shí)例
- 解決SpringBoot整合ElasticSearch遇到的連接問(wèn)題
- springBoot集成Elasticsearch 報(bào)錯(cuò) Health check failed的解決
- springboot中使用ElasticSearch的詳細(xì)教程
相關(guān)文章
SpringBoot整合Knife4j的實(shí)戰(zhàn)示例
Knife4j是一個(gè)為Java MVC框架集成Swagger生成API文檔的增強(qiáng)解決方案,本文就來(lái)介紹一下SpringBoot整合Knife4j的實(shí)戰(zhàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
詳解Java中String,StringBuffer和StringBuilder的使用
這篇文章主要為大家詳細(xì)介紹了Java中String,StringBuffer和StringBuilder三者的區(qū)別以及使用,文中的少了講解詳細(xì),感興趣的可以了解一下2022-07-07
IntelliJIDEA中實(shí)現(xiàn)SpringBoot多實(shí)例運(yùn)行的兩種方式
在微服務(wù)開(kāi)發(fā)中,經(jīng)常需要同時(shí)啟動(dòng)多個(gè)服務(wù)實(shí)例進(jìn)行測(cè)試或模擬集群環(huán)境,?IntelliJ?IDEA?作為Java開(kāi)發(fā)者常用工具,提供了靈活的多實(shí)例啟動(dòng)支持,本文將詳細(xì)介紹如何通過(guò)修改配置?和批量啟動(dòng)?兩種方式實(shí)現(xiàn)SpringBoot多實(shí)例運(yùn)行,并解決常見(jiàn)問(wèn)題,需要的朋友可以參考下2025-03-03
SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例
本篇文章主要介紹了SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例,可以限制登陸次數(shù),有興趣的同學(xué)可以了解一下。2017-03-03
Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語(yǔ)句塊的使用方式
這篇文章主要介紹了Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語(yǔ)句塊的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Maven+SSM框架實(shí)現(xiàn)簡(jiǎn)單的增刪改查
這篇文章主要介紹了Maven+SSM框架實(shí)現(xiàn)簡(jiǎn)單的增刪改查,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
使用IDEA搭建Hadoop開(kāi)發(fā)環(huán)境的操作步驟(Window10為例)
經(jīng)過(guò)三次重裝,查閱無(wú)數(shù)資料后成功完成hadoop在win10上實(shí)現(xiàn)偽分布式集群,以及IDEA開(kāi)發(fā)環(huán)境的搭建。一步一步跟著本文操作可以避免無(wú)數(shù)天坑2021-07-07

