ES06-SpringData集成

ES06-SpringData集成

文章目錄

  • ES06-SpringData集成
  • 1-參考網址
  • 2-知識整理
  • 3-Spring Data Elasticsearch 9.0.0 完整示例
  • 4-知識補充
    • 1-Elasticsearch JAVA操作有三種客戶端:
      • 1. TransportClient(已廢棄)
      • 2. JestClient(第三方 HTTP 客戶端)
      • 3. RestClient(官方推薦)
      • 總結


1-參考網址

  • 【推薦】SpringData集成代倉庫:https://gitee.com/enzoism/springboot-springdata-es
  • 【不推薦】RestHighLevelClient集成代碼倉庫:https://gitee.com/enzoism/springboot-es
  • RestHighLevelClient對接:https://blog.csdn.net/weixin_45690436/article/details/109027610

2-知識整理

  • 1)如何選擇接入框架:ES7.0之后就不要再用RestHighLevelClient(2025-09-06目前公司的項目還是這種對接方式)
  • 2)后續推薦使用【Java API Client(8.x 最新)】+【SpringData】
  • 3)spring-boot-starter-data-elasticsearch代碼對接示例

3-Spring Data Elasticsearch 9.0.0 完整示例

編寫時間:2025-09-06,項目是【Elasticsearch 9.0.0】+【JDK17】

項目基于 Spring Boot 3.2.x + Elasticsearch 9.0.0(服務器端)+ Spring Data Elasticsearch 5.2.x
(客戶端)的完整可運行示例,實現對你提供的 index_popyu 索引的 增刪改查 邏輯。
(Spring Data Elasticsearch 在底層已自動使用官方推薦的 Java API Client,無需額外引入 TransportClient/JestClient。)


一、依賴與版本

<!-- pom.xml 核心片段 -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version>
</parent><properties>
<java.version>17</java.version>
</properties><dependencies>
<!-- Spring Data Elasticsearch 5.2.x 已適配 ES 9.0 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- 其他常規 starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
</dependencies>

二、YAML 配置

# application.yml
spring:elasticsearch:uris: http://localhost:9200      # 9.0 默認端口username:                        # 如未開啟 x-pack 可留空password:

三、實體類(與 mapping 一一對應)

package com.example.es.entity;import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;@Document(indexName = "index_popyu")
@Setting(replicas = 0, shards = 1)   // 開發階段簡化
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UsrDoc {@Id@Field(type = FieldType.Keyword)private String usrId;@Field(type = FieldType.Text)private String usrNm;@Field(type = FieldType.Integer)private Integer usrAge;@Field(type = FieldType.Keyword)private String usrCity;@Field(type = FieldType.Keyword)private String usrPhone;@Field(type = FieldType.Date, format = DateFormat.date)private String joinDate;   // yyyy-MM-dd@Field(type = FieldType.Date, format = DateFormat.hour_minute_second)private String joinTime;   // HH:mm:ss
}

四、Repository 接口(自帶 CRUD)

package com.example.es.repo;import com.example.es.entity.UsrDoc;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;@Repository
public interface UsrRepository extends ElasticsearchRepository<UsrDoc, String> {// 可按需追加自定義方法,Spring Data 會幫你生成實現
}

五、Service 層(完整增刪改查)

package com.example.es.service;import com.example.es.entity.UsrDoc;
import com.example.es.repo.UsrRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;import java.util.Optional;@Service
@RequiredArgsConstructor
public class UsrService {private final UsrRepository repo;/* ---------- 增 ---------- */public UsrDoc save(UsrDoc doc) {return repo.save(doc);}/* ---------- 刪 ---------- */public void deleteById(String usrId) {repo.deleteById(usrId);}/* ---------- 改 ---------- */public UsrDoc update(UsrDoc doc) {// Spring Data 的 save 根據 @Id 存在即覆蓋return repo.save(doc);}/* ---------- 查 ---------- */public Optional<UsrDoc> findById(String usrId) {return repo.findById(usrId);}public Page<UsrDoc> findAll(Pageable pageable) {return repo.findAll(pageable);}
}

六、Controller(REST 入口)

package com.example.es.controller;import com.example.es.entity.UsrDoc;
import com.example.es.service.UsrService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/usr")
@RequiredArgsConstructor
public class UsrController {private final UsrService service;@PostMappingpublic UsrDoc create(@RequestBody UsrDoc doc) {return service.save(doc);}@GetMapping("/{usrId}")public ResponseEntity<UsrDoc> get(@PathVariable String usrId) {return service.findById(usrId).map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());}@GetMappingpublic Page<UsrDoc> list(@PageableDefault(size = 10) Pageable pageable) {return service.findAll(pageable);}@PutMapping("/{usrId}")public UsrDoc update(@PathVariable String usrId,@RequestBody UsrDoc doc) {doc.setUsrId(usrId);   // 確保主鍵一致return service.update(doc);}@DeleteMapping("/{usrId}")public void delete(@PathVariable String usrId) {service.deleteById(usrId);}
}

七、啟動類


@SpringBootApplication
public class Es900Application {public static void main(String[] args) {SpringApplication.run(Es900Application.class, args);}
}

八、驗證

  1. 啟動 Elasticsearch 9.0.0(默認端口 9200)。
  2. 啟動 Spring Boot,首次訪問任意接口時,Spring Data 會自動根據 @Document 注解創建 index_popyu 并寫入你給出的
    mapping(已內置)。
  3. 使用 curl / Postman 調用:
POST http://localhost:8080/usr
{"usrId": "u001","usrNm": "Popyu","usrAge": 18,"usrCity": "shenzhen","usrPhone": "13800138000","joinDate": "2025-09-06","joinTime": "14:30:00"
}
GET  http://localhost:8080/usr/u001
PUT  http://localhost:8080/usr/u001
DEL  http://localhost:8080/usr/u001

4-知識補充

1-Elasticsearch JAVA操作有三種客戶端:

1、TransportClient
2、JestClient
3、RestClient

在 Elasticsearch 7.x 之后,TransportClient 已被廢棄,官方推薦使用 RestHighLevelClient(基于 RestClient 封裝)或最新的 Java API Client(Elasticsearch 8.x 推出)。以下是三種客戶端的對比和示例:


1. TransportClient(已廢棄)

  • 特點:基于 TCP 協議,直接連接集群節點,性能高但依賴 ES 版本。
  • 缺點:兼容性差(需與集群版本一致),7.x 后廢棄。
  • 示例(不推薦):
    // 已廢棄,無需關注
    

2. JestClient(第三方 HTTP 客戶端)

  • 特點:基于 HTTP 協議,輕量級,支持版本兼容性較好。
  • 缺點:功能有限,更新滯后(非官方維護)。
  • 依賴
    <dependency><groupId>io.searchbox</groupId><artifactId>jest</artifactId><version>6.3.1</version>
    </dependency>
    
  • 示例
    JestClientFactory factory = new JestClientFactory();
    factory.setHttpClientConfig(new HttpClientConfig.Builder("http://localhost:9200").multiThreaded(true).build());
    JestClient client = factory.getObject();// 索引文檔
    Index index = new Index.Builder("{\"name\":\"John\"}").index("users").type("_doc").build();
    client.execute(index);
    

3. RestClient(官方推薦)

  • 特點:基于 HTTP 協議,官方維護,支持所有 ES 功能。
  • 分類
    • RestLowLevelClient:輕量級,需手動處理請求/響應。
    • RestHighLevelClient(7.x 常用):封裝了高級 API(已廢棄)。
    • Java API Client(8.x 最新):官方推薦,基于 REST 協議。
  • 示例(RestHighLevelClient,7.x)
    RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http"))
    );// 索引文檔
    IndexRequest request = new IndexRequest("users");
    request.source("{\"name\":\"John\"}", XContentType.JSON);
    IndexResponse response = client.index(request, RequestOptions.DEFAULT);
    
  • 示例(Java API Client,8.x)
    ElasticsearchClient client = new ElasticsearchClient(RestClient.builder(new HttpHost("localhost", 9200, "http"))
    );// 索引文檔
    IndexRequest<User> request = IndexRequest.of(i -> i.index("users").document(new User("John"))
    );
    client.index(request);
    

總結

客戶端協議狀態適用場景
TransportClientTCP已廢棄
JestClientHTTP非官方維護輕量級需求(不推薦)
RestClientHTTP官方推薦所有新版本(7.x/8.x)

建議

  • 7.x:使用 RestHighLevelClient(已廢棄但可用)。
  • 8.x:遷移到 Java API Client(基于 REST,官方支持)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98343.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對于鏈表相關經典算法題:環形鏈表的約瑟夫問題的解析

開篇介紹&#xff1a; Hello 大家&#xff0c;在上一篇博客中&#xff0c;我們一同拆解了「206. 反轉鏈表」和「876. 鏈表的中間結點」這兩道單鏈表經典題目&#xff0c;通過對指針操作的細致打磨&#xff0c;相信大家對單鏈表的特性與算法設計思路有了更深入的理解。而在今天…

MySQL集群——主從復制

目錄 一、環境搭建、部署 1. RHEL7.9、9.3的搭建 二、主從復制 1. 環境說明 2. 環境準備 1&#xff09;克隆RHEL79_mysql_master 2&#xff09;改名為 “RHEL79_mysql_slave” 并修改IP 3&#xff09;修改主機名 3. 部署MySQL主從同步 1&#xff09;主庫(mysql-master) 2&…

《用 asyncio 構建異步任務隊列:Python 并發編程的實戰與思考》

《用 asyncio 構建異步任務隊列:Python 并發編程的實戰與思考》 一、引言:并發編程的新時代 在現代軟件開發中,性能已不再是錦上添花,而是產品成功的基石。尤其在 I/O 密集型場景中,如網絡爬蟲、實時數據處理、微服務通信等,傳統的同步編程模式往往力不從心。 Python …

【Linux】yum工具篇

目錄一、軟件包管理器1.1 什么是軟件包1.2 Linux軟件生態二、yum具體操作2.1 查找軟件包2.2 安裝軟件包2.3 卸載軟件配置文件所在路徑個人主頁<—請點擊 Linux專欄<—請點擊 一、軟件包管理器 1.1 什么是軟件包 在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼…

撬動制造全場景增效,開利空調找到了怎樣的“通關密碼”?

由深圳軟件協會指導、法大大和信息俠聯合出品的《制造行業合同數智化升級白皮書》&#xff08;以下簡稱“白皮書”&#xff09;首次提出了 “電子簽法律AI” 雙輪驅動模型。在制造行業面臨供應鏈協同、合規風控及全球化出海等多重挑戰的當下&#xff0c;法大大依托豐富的制造企…

[Android]RecycleView的item用法

RecyclerView 是 Android 提供的一個強大的列表控件&#xff0c;用來顯示大量數據。RecyclerView 的主要特點 1. 高性能的視圖復用機制 Recycle就是循環的意思&#xff0c;那么recycleview的特點也很鮮明了&#xff0c;它只會創建出在屏幕內和一定緩存的itemview,當view滑出屏幕…

AI驅動的軟件測試:革命性的自動化、缺陷檢測與實驗優化

引言在當今快節奏的軟件開發生命周期&#xff08;SDLC&#xff09;中&#xff0c;傳統測試方法已逐漸無法滿足對速度、覆蓋面和準確性的極高要求。人工智能&#xff08;AI&#xff09;和機器學習&#xff08;ML&#xff09;技術的融入&#xff0c;正在從根本上重塑軟件測試的格…

繼續優化基于樹狀數組的cuda前綴和

在之前的博客《借助樹狀數組的思想實現cuda版前綴和》中&#xff0c;我們用三個kernel實現了基于樹狀數組的cuda版前綴和&#xff0c;但是在數據量較大時速度不如傳統的reduce-then-scan方法&#xff0c;主要原因在于跨block的reduce階段沒有充分利用所有的cuda核心。在本博客中…

Qt圖片資源導入

右鍵項目&#xff0c;點擊添加新文件 選擇Qt -> Qt Resource File 資源文件起名 如&#xff1a;res 生成res.qrc文件 在項目的同級目錄下創建文件夾res&#xff0c;并將準備好的資源粘貼進去 右鍵qrc文件&#xff0c;選中Open in Editor 添加前綴 前綴是各種類型圖片的分類&…

嵌入式第四十六天(51單片機(中斷,定時器))

一.獨立按鍵設置1.#include "key.h"void init_key(void) {P1 | (0x0F << 4); }int key_pressed(void) {static int ret 0;if((P1 & (1 << 4)) 0){ret 1;}else if((P1 & (1 << 5)) 0){ret 2;}else if((P1 & (1 << 6)) 0){r…

Visual Studio Code2024安裝包及安裝教程

一、軟件下載軟件名稱&#xff1a;Visual Studio Code 2024安裝環境&#xff1a;window10及以上系統下載鏈接&#xff1a;https://pan.quark.cn/s/d9831b28c69a解壓軟件Bandizip下載鏈接&#xff1a;https://pan.quark.cn/s/a54e79b5d553二、軟件安裝1、下載后&#xff0c;先解…

fps:游戲玩法

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄游戲玩法倒計時僵尸潮游戲成功&失敗計時玩法&#xff1a;玩家在計時內存活&#xff0c;成功&#xff1b;反之失敗Game界面&#xff1a;由關卡調用計時系統計時完成&#xff1a;調用結果界面結果界面玩家死亡&…

如何建立針對 .NET Core web 程序的線程池的長期監控

如何建立針對 .NET Core web 程序的線程池的長期監控 建立針對 .NET Core Web 應用程序線程池的長期監控是一個系統性的工程&#xff0c;它涉及代碼集成、指標收集、存儲、可視化和告警。 核心思路 線程池監控不是孤立的&#xff0c;它必須與應用程序的整體性能指標&#xff08…

前端開發學習路徑

前端開發學習路徑前端開發基礎技能HTML、CSS和JavaScript是前端開發的三大核心技術。HTML用于構建網頁結構&#xff0c;CSS負責樣式設計&#xff0c;JavaScript實現交互功能。掌握這三項技術是學習前端開發的基礎。現代前端開發通常需要了解ES6語法&#xff0c;包括箭頭函數、解…

一款沒有任何限制的免費遠程手機控制手機的軟件簡介

這是一款沒有任何限制的免費遠程手機控制手機的軟件支持安卓和蘋果1.安裝1.1被控制端安裝airdroid1.2控制端air mirror2.登錄同一個賬號3.控制使用打開控制端軟件選擇要控制的機器直接點“遠程控制“連接上后就可以任意操作被控手機了

在word中使用lateX公式的方法

非常好的問題&#xff01;這是一個許多科研人員和學生都渴望實現的功能。但需要明確的是&#xff1a; **Microsoft Word 本身并不具備“自動”將 LaTeX 代碼實時轉換為渲染后公式的功能。** 它不像 Overleaf 或 VS Code 的 Markdown 插件那樣&#xff0c;輸入 $Emc^2$ 就立刻變…

23種設計模式——代理模式(Proxy Pattern)詳解

?作者簡介&#xff1a;大家好&#xff0c;我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式&#xff0c;持續分享Java技術內容。 &#x1f34e;個人主頁&#xff1a;Meteors.的博客 &#x1f49e;當前專欄&#xff1a;設計模式 ?特色專欄&#xff1a;知識分享 &#x…

webpack scope hositing 和tree shaking

Scope Hoisting&#xff08;作用域提升&#xff09; 和 Tree Shaking&#xff08;搖樹優化&#xff09; 是現代前端構建中至關重要的概念。它們是構建工具&#xff08;如 Webpack、Rollup、Vite&#xff09;用來優化最終打包產物的核心技術。 核心概念快速理解 Tree Shaking&am…

手寫React狀態hook

在日常開發中&#xff0c;我們經常用到 React 的狀態管理 Hook&#xff1a;useState 和 useReducer。 但你有沒有想過&#xff1a;這些 Hook 內部是怎么實現的&#xff1f;為什么調用 setState 之后組件會重新渲染&#xff1f; 今天我們就來從零手寫 useState 和 useReducer&am…

力扣hot100:相交鏈表與反轉鏈表詳細思路講解(160,206)

問題描述核心思路&#xff1a;雙指針交替遍歷算法思想&#xff1a; 使用兩個指針 pa 和 pb 分別從鏈表A和鏈表B的頭節點出發&#xff0c;同步向后遍歷。當任一指針走到鏈表末尾時&#xff0c;將其重定位到另一鏈表的頭節點繼續遍歷。若兩鏈表相交&#xff0c;pa 和 pb 最終會在…