最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合easy-es的詳細過程

 更新時間:2025年02月24日 11:10:19   作者:m0_74824865  
本文介紹了EasyES,一個基于Elasticsearch的ORM框架,旨在簡化開發(fā)流程并提高效率,EasyES支持SpringBoot框架,并提供了CRUD操作、批量操作和查詢操作等方法,文章還列舉了使用EasyES時可能遇到的技術難題及解決方法,感興趣的朋友一起看看吧

一、easy-es簡介

EasyES是一款基于Elasticsearch官方提供的RestHighLevelClient開發(fā)的ORM框架,旨在簡化開發(fā)流程并提高效率。 EasyES在保持RestHighLevelClient原有功能的基礎上進行增強,而不做任何改變。它采用與Mybatis-Plus相似的語法,使得開發(fā)者可以無縫遷移至EasyES,無需額外學習成本。EasyES的核心理念是將簡單、易用性留給用戶,將復雜性留給框架,致力于成為全球最受歡迎的ElasticSearch搜索引擎開發(fā)框架。

EasyES的主要特點包括:

  • 全自動索引托管:全球開源首創(chuàng)的索引托管模式,無需關心索引的創(chuàng)建、更新及數(shù)據(jù)遷移等繁瑣步驟,徹底解放開發(fā)者。
  • 屏蔽語言差異:開發(fā)者只需要會MySQL語法即可使用ES,無需學習復雜的ES語法。
  • 減少代碼量:與直接使用RestHighLevelClient相比,相同的查詢可以節(jié)省3-5倍的代碼量。
  • 零魔法值:字段名稱直接從實體中獲取,無需輸入字段名稱字符串,提高代碼可讀性。
  • 降低門檻:通過EasyES,即便是只了解ES基礎的初學者也可以輕松駕馭ES完成絕大多數(shù)需求的開發(fā)。
  • 無侵入:引入EasyES不會對現(xiàn)有工程產生影響,啟動即會自動注入基本的CURD操作,性能基本無損耗。

easy-es官網 https://www.easy-es.cn/

二、實現(xiàn)基于Spring Boot框架的應用程序代碼

1.添加相關依賴

<!-- 引入 Easy-ES 最新版本的依賴 -->
<dependency>
    <groupId>org.dromara.easy-es</groupId>
    <artifactId>easy-es-boot-starter</artifactId>
    <!-- 指定 Easy-ES 的版本號,確保使用的是最新穩(wěn)定版本 -->
    <version>2.0.0-beta3</version>
</dependency>
<!-- 引入 Spring Boot Web 啟動器,并排除內置的 Elasticsearch 依賴以避免沖突 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 注釋掉了版本號,這意味著 Maven 將使用項目中定義的 Spring Boot 版本 -->
    <!-- 如果沒有定義,則會使用最新的可用版本 -->
    <!-- 這種方式可以在 Spring Boot 升級時自動更新依賴,但可能導致不兼容問題 -->
    <!--<version>2.7.18</version>-->
    <exclusions>
        <!-- 排除 Elasticsearch REST 高級客戶端 -->
        <exclusion>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </exclusion>
        <!-- 排除 Elasticsearch REST 客戶端 -->
        <exclusion>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
        </exclusion>
        <!-- 排除 Elasticsearch 核心庫 -->
        <exclusion>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 手動引入指定版本的 Elasticsearch REST 高級客戶端 -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <!-- 指定該客戶端的版本號,以確保與其他依賴的兼容性 -->
    <version>7.14.0</version>
</dependency>
<!-- 手動引入指定版本的 Elasticsearch REST 客戶端 -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <!-- 指定該客戶端的版本號,以確保與其他依賴的兼容性 -->
    <version>7.14.0</version>
</dependency>
<!-- 手動引入指定版本的 Elasticsearch 核心庫 -->
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <!-- 指定核心庫的版本號,以確保與其他依賴的兼容性 -->
    <version>7.14.0</version>
</dependency>

一些解釋:

dependency: 定義一個項目的依賴項。每個依賴項都包含一個或多個子元素,描述該依賴的詳細信息。

groupId: 指定依賴項的組織或公司名稱,通常與其 Maven 倉庫中的路徑相對應。

artifactId: 指定依賴項的唯一標識符,通常是庫或模塊的名稱。

version: 指定依賴項的版本號。可以是具體的版本字符串,也可以使用范圍或特殊版本標識。

exclusions: 用于排除某些傳遞性依賴項。這樣可以避免因不必要的依賴導致版本沖突。

exclusion: 在 exclusions 中定義單個被排除的依賴項。包含兩個子元素:groupId 和 artifactId,用于指定要排除的依賴項。

2.添加相關配置

考慮到有的用戶偏好使用YML格式進行配置,而有的用戶則更喜歡使用PROPERTIES格式,為了提供便利,我同時列出了這兩種類型的配置選項,以便您可以根據(jù)自己的需求和喜好進行選擇。

(1)yml配置

a.基礎配置

easy-es:
  enable: true # 默認為true,若為false則認為不啟用本框架
  address: 你的ip地址:9200 # 指定Elasticsearch服務的IP地址和端口,格式為IP:9200
logging:
  level:
    tracer: trace # 設置日志級別為trace,開發(fā)時可開啟以打印ES全部請求信息及DSL語句
    # 注意:開啟此配置后,可以將EE的print-dsl設置為false,以避免日志重復打印

b.拓展配置(可選)

不加不影響項目啟動,但是為了實現(xiàn)性能優(yōu)化,建議您根據(jù)實際需求和場景進行相應的配置調整,進行細致的配置優(yōu)化

easy-es:
  keep-alive-millis: 30000 # 心跳保持時間(毫秒)。用于確保連接在無數(shù)據(jù)傳輸時仍然保持活動狀態(tài),防止因長時間空閑而關閉連接。
  connect-timeout: 5000 # 連接超時設置(毫秒)。定義建立連接的最大等待時間,超過該時間則認為連接失敗。
  socket-timeout: 600000 # 數(shù)據(jù)讀取超時設置(毫秒)。規(guī)定讀取數(shù)據(jù)時的最大等待時間,超出此時間將中斷讀取操作。
  request-timeout: 5000 # 請求超時設置(毫秒)。指定發(fā)送請求的最大等待時間,超過此時間則視為請求失敗。
  connection-request-timeout: 5000 # 連接請求超時設置(毫秒)。定義從連接池獲取連接的最大等待時間。
  max-conn-total: 100 # 最大總連接數(shù)。設置連接池中允許的最大連接數(shù)量。
  max-conn-per-route: 100 # 每個路由的最大連接數(shù)。規(guī)定針對每個目標主機可同時建立的最大連接數(shù)量。

c.全局配置(可選)

在項目啟動過程中,若未明確指定相關配置,系統(tǒng)將自動采用預設的默認值以確保順利運行。

easy-es:
  schema: http # 默認為 http,可選值為 https(不使用 SSL)。配置為 https 時,使用 HTTPS 協(xié)議。
  banner: true # 默認為 true,是否打印啟動橫幅。若不需要打印,設置為 false。
  global-config:
    i-kun-mode: false # 是否開啟小黑子模式,默認為關閉。開啟后日志會更加有趣,僅供娛樂用途。
    process-index-mode: manual # 索引處理模式??蛇x值:smoothly(平滑模式)、not_smoothly(非平滑模式)和 manual(手動模式),默認開啟手動模式。
    print-dsl: true # 是否在控制臺打印通過該框架生成的 DSL 語句。默認為 true,建議在測試穩(wěn)定后生產環(huán)境中關閉以提高性能。
    distributed: false # 當前項目是否為分布式項目。默認為 true。在非手動托管索引模式下,分布式項目會獲取分布式鎖,非分布式項目使用 synchronized 鎖。
    reindexTimeOutHours: 72 # 重建索引的超時時間,單位為小時。默認值為 72 小時,根據(jù) ES 中存儲的數(shù)據(jù)量可調整。
    async-process-index-blocking: true # 異步處理索引是否阻塞主線程。默認阻塞。當數(shù)據(jù)量過大時,可調整為非阻塞,以加快項目啟動速度。
    active-release-index-max-retry: 4320 # 在分布式環(huán)境下,平滑模式下當前客戶端激活最新索引的最大重試次數(shù)。若數(shù)據(jù)量過大,重建索引數(shù)據(jù)遷移時間超過 72 小時,可增大此參數(shù)。
    active-release-index-fixed-delay: 60 # 在分布式環(huán)境下,平滑模式下當前客戶端激活最新索引的重試時間間隔。若希望最終一致性時效性更高,可減小此值,但會犧牲一些性能。
    db-config:
      map-underscore-to-camel-case: false # 是否開啟下劃線轉駝峰命名,默認為 false。
      index-prefix: daily_ # 索引前綴,用于區(qū)分環(huán)境。默認為空,作用與 MP 的 tablePrefix 相同。
      id-type: customize # ID 生成策略??蛇x值為 customize(自定義),用戶可以自行生成 ID(例如取自 MySQL 的數(shù)據(jù) ID)。默認使用 ES 自動生成 ID。
      field-strategy: not_empty # 字段更新策略,默認為 not_null(不為空)。
      enable-track-total-hits: true # 是否開啟總數(shù)據(jù)匹配追蹤,默認為開啟。若不開啟,將無法獲取數(shù)據(jù)總條數(shù)。查詢數(shù)量突破 1 萬條時,需要同步調整 @IndexName 注解中的 maxResultWindow。
      refresh-policy: immediate # 數(shù)據(jù)刷新策略。默認為不刷新。若對數(shù)據(jù)時效性要求較高,可調整為 immediate,但會有性能損耗,也可選擇 wait_until 作為折中方案。
      batch-update-threshold: 10000 # 批量更新接口的閾值,默認值為 1 萬。突破此值時需同步調整 enable-track-total-hits=true 和 @IndexName.maxResultWindow > 1w,并重建索引。
      smartAddKeywordSuffix: true # 是否智能為字段添加 .keyword 后綴。默認開啟,會根據(jù)當前字段的索引類型及查詢類型自動判斷是否需要拼接 .keyword 后綴。

多數(shù)據(jù)源(可選)

easy-es:
  dynamic:
    datasource:
      ds1:
        address: 你的ip地址:9200 # 數(shù)據(jù)源1的連接地址
        # username: '可省略,如果沒有用戶名'
        # password: '可省略,如果沒有密碼'
      ds2:
        address: 你的ip地址:9200 # 數(shù)據(jù)源2的連接地址
        # username: '可省略,如果沒有用戶名'
        # password: '可省略,如果沒有密碼'
      # 其他數(shù)據(jù)源配置...

(2)properties配置

a.基礎配置

# Easy-ES 配置
easy-es.enable=true # 啟用框架,默認為true,設置為false則禁用此框架
easy-es.address=你的ip地址:9200 # 設置Elasticsearch的連接地址
# 日志配置
logging.level.tracer=trace # 設置日志級別為trace,開發(fā)時可開啟,以打印所有Elasticsearch請求信息及DSL語句
# 注意:開啟此配置后,可將EE的print-dsl設置為false以避免重復打印

b.拓展配置(可選)

不加不影響項目啟動,但是為了實現(xiàn)性能優(yōu)化,建議您根據(jù)實際需求和場景進行相應的配置調整,進行細致的配置優(yōu)化

# Easy-ES 配置
easy-es.keep-alive-millis=30000 # 心跳策略時間,單位:毫秒(ms)。設置保持連接活動的時間,以防長時間無數(shù)據(jù)傳輸導致連接關閉。
easy-es.connect-timeout=5000 # 連接超時時間,單位:毫秒(ms)。設置建立連接時的超時時間。
easy-es.socket-timeout=600000 # 通信超時時間,單位:毫秒(ms)。設置讀取數(shù)據(jù)的超時時間,超過此時間將中斷讀取。
easy-es.request-timeout=5000 # 請求超時時間,單位:毫秒(ms)。設置發(fā)送請求的超時時間,超出該時間將認為請求失敗。
easy-es.connection-request-timeout=5000 # 連接請求超時時間,單位:毫秒(ms)。設置從連接池中獲取連接的超時時間。
easy-es.max-conn-total=100 # 最大連接數(shù),單位:個。設置連接池中最大允許的連接總數(shù)。
easy-es.max-conn-per-route=100 # 最大連接路由數(shù),單位:個。設置每個路由(目標主機)的最大連接數(shù)。

c.全局配置(可選)

在項目啟動過程中,若未明確指定相關配置,系統(tǒng)將自動采用預設的默認值以確保順利運行。

# ES連接協(xié)議,默認為http,可省略;支持https免SSL方式,配置為https即可
easy.es.schema=http
# 是否打印banner,默認為true;不想打印時可設置為false
easy.es.banner=true
# 是否開啟小黑子模式,默認為關閉;開啟后日志將更有趣,僅供娛樂用途
easy.es.global-config.i-kun-mode=false
# 索引處理模式:
# smoothly: 平滑模式
# not_smoothly: 非平滑模式
# manual: 手動模式(默認)
easy.es.global-config.process-index-mode=manual
# 是否在控制臺打印框架生成的DSL語句,默認開啟;生產環(huán)境建議關閉以提升性能
easy.es.global-config.print-dsl=true
# 當前項目是否為分布式項目,默認為true;非分布式項目只需使用synchronized鎖
easy.es.global-config.distributed=false
# 重建索引超時時間,單位為小時,默認為72小時;可根據(jù)ES中存儲的數(shù)據(jù)量調整
easy.es.global-config.reindexTimeOutHours=72
# 異步處理索引是否阻塞主線程,默認阻塞;數(shù)據(jù)量過大時可設置為非阻塞,加快項目啟動
easy.es.global-config.async-process-index-blocking=true
# 分布式環(huán)境下,平滑模式下當前客戶端激活最新索引的最大重試次數(shù)
# 數(shù)據(jù)量過大時,重建索引數(shù)據(jù)遷移時間超過72小時可調大此參數(shù)
easy.es.global-config.active-release-index-max-retry=4320
# 分布式環(huán)境下,平滑模式下當前客戶端激活最新索引的重試時間間隔
# 若需要更高的一致性時效性可調小此值,但會影響性能
easy.es.global-config.active-release-index-fixed-delay=60
# 是否開啟下劃線轉駝峰命名,默認為false;如果需要可設置為true
easy.es.global-config.db-config.map-underscore-to-camel-case=false
# 索引前綴,用于區(qū)分不同環(huán)境,默認為空;用法與MP的tablePrefix相同
easy.es.global-config.db-config.index-prefix=daily_
# ID生成策略:
# customize: 自定義,由用戶生成ID(例如:取MySQL中的數(shù)據(jù)ID)
# 默認情況下,ID由ES自動生成
easy.es.global-config.db-config.id-type=customize
# 字段更新策略,默認為not_null;表示只更新非空字段
easy.es.global-config.db-config.field-strategy=not_empty
# 是否開啟總數(shù)追蹤,默認開啟;若不開啟,則無法獲取數(shù)據(jù)總條數(shù),但其他功能不受影響
# 查詢數(shù)量超過1萬時,需要調整@IndexName注解中的maxResultWindow大于1萬,并重建索引
easy.es.global-config.db-config.enable-track-total-hits=true
# 數(shù)據(jù)刷新策略,默認為不刷新;對數(shù)據(jù)時效性要求高時可設置為immediate,但性能損耗較高,也可選擇折中的wait_until
easy.es.global-config.db-config.refresh-policy=immediate
# 批量更新接口的閾值,默認值為1萬;突破此值需同步調整enable-track-total-hits=true,@IndexName.maxResultWindow > 1w,并重建索引
easy.es.global-config.db-config.batch-update-threshold=10000
# 是否智能為字段添加.keyword后綴,默認開啟;根據(jù)字段的索引類型及查詢類型自動判斷是否需要拼接.keyword后綴
easy.es.global-config.db-config.smartAddKeywordSuffix=true

多數(shù)據(jù)源(可選)

# 動態(tài)數(shù)據(jù)源配置
# 數(shù)據(jù)源1的連接地址,請?zhí)鎿Q為實際的IP地址和端口
easy.es.dynamic.datasource.ds1.address=你的ip地址:9200
# 若數(shù)據(jù)源1需要用戶名,可以在此填寫;若無用戶名可去掉此行
# easy.es.dynamic.datasource.ds1.username=
# 若數(shù)據(jù)源1需要密碼,可以在此填寫;若無密碼可去掉此行
# easy.es.dynamic.datasource.ds1.password=
# 可以繼續(xù)添加更多的數(shù)據(jù)源,示例如下:
# 數(shù)據(jù)源2的連接地址,請?zhí)鎿Q為實際的IP地址和端口
easy.es.dynamic.datasource.ds2.address=你的ip地址:9200
# 若數(shù)據(jù)源2需要用戶名,可以在此填寫;若無用戶名可去掉此行
# easy.es.dynamic.datasource.ds2.username=
# 若數(shù)據(jù)源2需要密碼,可以在此填寫;若無密碼可去掉此行
# easy.es.dynamic.datasource.ds2.password=

三、實現(xiàn)基于Spring Boot框架的應用程序代碼(測試)

1.創(chuàng)建一個實體

import lombok.Data;
import org.dromara.easyes.annotation.HighLight;
import org.dromara.easyes.annotation.IndexField;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.annotation.rely.Analyzer;
import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType;
import java.math.BigDecimal;
import java.util.Date;
@Data
// 指定 Elasticsearch 索引名稱及其分片數(shù)
@IndexName(value = "user_es", shardsNum = 3)
public class User {
    /**
     * 用戶唯一標識符
     * 使用自定義 ID 類型
     */
    @IndexId(type = IdType.CUSTOMIZE)
    private Integer id;
    /**
     * 用戶姓名
     * 字段類型為 TEXT,采用 IK 最大詞元分詞器進行索引與搜索
     * 在搜索結果中匹配的內容將被高亮顯示
     */
    @IndexField(value = "userName", fieldType = FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD, searchAnalyzer = Analyzer.IK_MAX_WORD)
    @HighLight(preTag = "<span style="color:red">", postTag = "</span>")
    private String name;
    /**
     * 用戶年齡
     * 字段類型為 INTEGER
     */
    @IndexField(fieldType = FieldType.INTEGER)
    private Integer age;
    /**
     * 用戶薪資
     * 字段類型為 DOUBLE
     */
    @IndexField(fieldType = FieldType.DOUBLE)
    private BigDecimal salary;
    /**
     * 用戶出生日期
     * 字段類型為 DATE
     */
    @IndexField(fieldType = FieldType.DATE)
    private Date birthday;
}

注釋詳解:

@IndexName:

value = “user_es”: 指定索引名稱為 user_es。

shardsNum = 3: 設置分片數(shù)量為 3。

replicasNum = 1: 設置副本數(shù)量為 1。

@IndexId:

type = IdType.CUSTOMIZE: 指定 ID 類型為自定義。

@IndexField:

value = “userName”: 指定字段在 Elasticsearch 中的名稱為 userName。

fieldType = FieldType.TEXT: 指定字段類型為 TEXT。

analyzer = Analyzer.IK_MAX_WORD: 指定索引時使用的分詞器為 IK_MAX_WORD。

searchAnalyzer = Analyzer.IK_MAX_WORD: 指定搜索時使用的分詞器為 IK_MAX_WORD。

@HighLight:

preTag = “”: 高亮部分前綴標簽。

postTag = “”: 高亮部分后綴標簽。

2.相關方法

<1>.基本 CRUD 操作方法

(1)insert(T entity)

a.描述:

插入一條記錄。

b.參數(shù):

T entity - 要插入的實體對象。

c.返回值:

boolean - 插入是否成功。

(2)insertBatch(List entities)

a.描述:

批量插入記錄。

b.參數(shù):

List entities - 要插入的實體對象列表。

c.返回值:

boolean - 插入是否成功。

(3)deleteById(Object id)

a.描述:

根據(jù) ID 刪除記錄。

b.參數(shù):

Object id - 要刪除的記錄的 ID。

c.返回值:

boolean - 刪除是否成功。

(4)deleteBatchIds(Listids)

a.描述:

批量刪除記錄。

b.參數(shù):

Listids - 要刪除的記錄的 ID 列表。

c.返回值:

boolean - 刪除是否成功。

(5)updateById(T entity)

a.描述:

根據(jù) ID 更新記錄。

b.參數(shù):

T entity - 要更新的實體對象。

c.返回值:

boolean - 更新是否成功。

(6)update(T entity, Wrapper wrapper)

a.描述:

根據(jù)條件更新記錄。

b.參數(shù):

T entity - 要更新的實體對象。

Wrapper wrapper - 更新條件。

c.返回值:

boolean - 更新是否成功。

(7)selectById(Object id)

a.描述:

根據(jù) ID 查詢記錄。

b.參數(shù):

Object id - 要查詢的記錄的 ID。

c.返回值:

T - 查詢到的實體對象。

(8)selectList(Wrapper queryWrapper)

a.描述:

根據(jù)條件查詢記錄列表。

b.參數(shù):

Wrapper queryWrapper - 查詢條件。

c.返回值:

List - 查詢到的實體對象列表。

<2>. 批量操作 (1)insertOrUpdate(T entity)

a.描述:

插入或更新記錄。如果記錄存在則更新,否則插入。

b.參數(shù):

T entity - 要插入或更新的實體對象。

c.返回值:

boolean - 操作是否成功。

(2)insertOrUpdateBatch(List entities)

a.描述:

批量插入或更新記錄。如果記錄存在則更新,否則插入。

b.參數(shù):

List entities - 要插入或更新的實體對象列表。

c.返回值:

boolean - 操作是否成功。

<3>. 查詢操作

(1)selectOne(Wrapper queryWrapper)

a.描述:

根據(jù)條件查詢單條記錄。

b.參數(shù):

Wrapper queryWrapper - 查詢條件。

c.返回值:

T - 查詢到的實體對象。

(2)selectCount(Wrapper queryWrapper)

a.描述:

根據(jù)條件查詢記錄總數(shù)。

b.參數(shù):

Wrapper queryWrapper - 查詢條件。

c.返回值:

long - 記錄總數(shù)。

(3)selectPage(Page page, Wrapper queryWrapper)

a.描述:

分頁查詢記錄。

b.參數(shù):

Page page - 分頁對象。

Wrapper queryWrapper - 查詢條件。

c.返回值:

IPage - 分頁結果。

(4)selectMaps(Wrapper queryWrapper)

a.描述:

根據(jù)條件查詢記錄列表,返回 Map 形式的列表。

b.參數(shù):

Wrapper queryWrapper - 查詢條件。

c.返回值:

List> - 查詢到的記錄列表。

(5)selectObjs(Wrapper queryWrapper)

a.描述:

根據(jù)條件查詢記錄列表,返回單個字段的值列表。

b.參數(shù):

Wrapper queryWrapper - 查詢條件。

c.返回值:

List - 查詢到的記錄列表。

<4>. 其他方法

(1)exists(Wrapper queryWrapper)

a.描述:

根據(jù)條件判斷記錄是否存在。

b.參數(shù):

Wrapper queryWrapper - 查詢條件。

c.返回值:

boolean - 記錄是否存在。

(2)getSource(Wrapper queryWrapper)

a.描述:

獲取查詢條件對應的 DSL 語句。

b.參數(shù):

Wrapper queryWrapper - 查詢條件。

c.返回值:

String - DSL 語句。

3.代碼示例

(1)mapper層(持久層)

建議:Easy-Es的Mapper和MyBatis-Plus分開存放 一個是查數(shù)據(jù)庫的,一個是查es的

import org.dromara.easyes.core.core.BaseEsMapper;
/**
 * 用戶 Elasticsearch 數(shù)據(jù)訪問接口
 * 
 * 該接口繼承自 BaseEsMapper,專門用于處理 User 實體類的 Elasticsearch 操作。
 * 通過此接口,可以實現(xiàn)對用戶數(shù)據(jù)的增刪改查等操作。
 * 
 * @see BaseEsMapper
 * @see User
 */
public interface UserESMapper extends BaseEsMapper<User> {
    // 此接口可以在未來添加自定義的用戶相關查詢方法
}

注意:本接口僅用于執(zhí)行ES(Elasticsearch)相關操作,不涉及數(shù)據(jù)庫操作,請避免功能沖突。

(2)業(yè)務邏輯層(Service)

import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import java.util.List;
/**
 * 用戶服務接口
 *
 * 提供用戶相關的操作,包括插入、查詢、更新和刪除用戶信息。
 * 本接口定義了一系列方法,用于與用戶數(shù)據(jù)進行交互。
 * 具體實現(xiàn)應支持ElasticSearch存儲和查詢。
 *
 * @author [您的名字]
 * @version 1.0
 * @since [日期]
 */
public interface UserEsService {
    /**
     * 插入用戶信息
     *
     * @param user 用戶對象,包含要插入的用戶信息
     * @return 操作影響的行數(shù),通常為1表示成功,0表示失敗
     */
    Integer insertUser(User user);
    /**
     * 根據(jù)用戶ID查詢用戶信息
     *
     * @param id 用戶ID,唯一標識一個用戶
     * @return 用戶對象,查詢成功時返回用戶信息,未找到則返回null
     */
    User getUserById(Integer id);
    /**
     * 查詢滿足條件的用戶列表
     *
     * @param queryWrapper 查詢條件封裝,包含查詢所需的所有條件
     * @return 用戶列表,符合條件的用戶集合,可能為空
     */
    List<User> getUserList(LambdaEsQueryWrapper<User> queryWrapper);
    /**
     * 更新指定ID的用戶信息
     *
     * @param user 用戶對象,需包含ID和更新后的用戶信息
     * @return 操作影響的行數(shù),通常為1表示成功,0表示失敗
     */
    Integer updateUserById(User user);
    /**
     * 刪除指定ID的用戶信息
     *
     * @param id 用戶ID,唯一標識要刪除的用戶
     * @return 操作影響的行數(shù),通常為1表示成功,0表示失敗
     */
    Integer deleteUserById(Integer id);
    /**
     * 分頁查詢用戶信息
     *
     * @param queryWrapper 查詢條件封裝,包含分頁信息和其他查詢條件
     * @return 用戶列表,符合條件的用戶集合,可能為空
     */
    List<User> getUserListWithPage(LambdaEsQueryWrapper<User> queryWrapper);
}

(3)實現(xiàn)層(ServiceImpl)

import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * 用戶服務實現(xiàn)類
 *
 * 實現(xiàn)了 UserEsService 接口,提供與用戶相關的操作,包括插入、查詢、更新和刪除用戶信息。
 * 通過 UserESMapper 與 ElasticSearch 進行交互。
 *
 * @author [您的名字]
 * @version 1.0
 * @since [日期]
 */
@Service
public class UserEsServiceImpl implements UserEsService {
    @Autowired
    private UserESMapper userEsMapper;
    /**
     * 插入用戶信息到數(shù)據(jù)庫
     *
     * @param user 用戶對象,包含要插入的用戶信息
     * @return 操作影響的行數(shù),通常為1表示成功,0表示失敗
     */
    @Override
    public Integer insertUser(User user) {
        // 插入用戶信息到數(shù)據(jù)庫
        return userEsMapper.insert(user);
    }
    /**
     * 根據(jù)用戶ID查詢用戶信息
     *
     * @param id 用戶ID,唯一標識一個用戶
     * @return 用戶對象,查詢成功時返回用戶信息,未找到則返回null
     */
    @Override
    public User getUserById(Integer id) {
        // 根據(jù)用戶ID查詢用戶信息
        return userEsMapper.selectById(id);
    }
    /**
     * 查詢滿足條件的用戶列表
     *
     * @param queryWrapper 查詢條件封裝,包含查詢所需的所有條件
     * @return 用戶列表,符合條件的用戶集合,可能為空
     */
    @Override
    public List<User> getUserList(LambdaEsQueryWrapper<User> queryWrapper) {
        // 查詢滿足條件的用戶列表
        return userEsMapper.selectList(queryWrapper);
    }
    /**
     * 更新指定ID的用戶信息
     *
     * @param user 用戶對象,需包含ID和更新后的用戶信息
     * @return 操作影響的行數(shù),通常為1表示成功,0表示失敗
     */
    @Override
    public Integer updateUserById(User user) {
        // 更新指定ID的用戶信息
        return userEsMapper.updateById(user);
    }
    /**
     * 刪除指定ID的用戶信息
     *
     * @param id 用戶ID,唯一標識要刪除的用戶
     * @return 操作影響的行數(shù),通常為1表示成功,0表示失敗
     */
    @Override
    public Integer deleteUserById(Integer id) {
        // 刪除指定ID的用戶信息
        return userEsMapper.deleteById(id);
    }
    /**
     * 分頁查詢用戶信息
     *
     * @param queryWrapper 查詢條件封裝,包含分頁信息和其他查詢條件
     * @return 用戶列表,符合條件的用戶集合,可能為空
     */
    @Override
    public List<User> getUserListWithPage(LambdaEsQueryWrapper<User> queryWrapper) {
        // 分頁查詢用戶信息
        return userEsMapper.selectList(queryWrapper);
    }
}

(4)表現(xiàn)層(Controller)

import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * 用戶控制器
 *
 * 提供與用戶相關的 RESTful API 接口,包括插入、查詢、更新和刪除用戶信息。
 * 所有請求均以 /user-es 為前綴。
 *
 * @author [您的名字]
 * @version 1.0
 * @since [日期]
 */
@RestController
@RequestMapping("/user-es")
public class UserEsController {
    @Autowired
    private UserEsService userService;
    /**
     * 插入用戶信息
     *
     * @param user 用戶對象,包含要插入的用戶信息
     * @return 插入操作影響的行數(shù),通常為1表示成功,0表示失敗
     */
    @PostMapping
    public Integer insertUser(@RequestBody User user) {
        // 插入用戶信息
        return userService.insertUser(user);
    }
    /**
     * 根據(jù)用戶ID查詢用戶信息
     *
     * @param id 用戶ID,唯一標識一個用戶
     * @return 用戶對象,查詢成功時返回用戶信息,未找到則返回null
     */
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Integer id) {
        // 根據(jù)用戶ID查詢用戶信息
        return userService.getUserById(id);
    }
    /**
     * 查詢滿足條件的用戶列表
     *
     * @param age 可選參數(shù),查詢指定年齡的用戶
     * @return 用戶列表,符合條件的用戶集合,可能為空
     */
    @GetMapping
    public List<User> getUserList(@RequestParam(required = false) Integer age) {
        // 查詢滿足條件的用戶列表
        LambdaEsQueryWrapper<User> queryWrapper = new LambdaEsQueryWrapper<>();
        if (age != null) {
            queryWrapper.eq(User::getAge, age); // 添加等于年齡的查詢條件
        }
        return userService.getUserList(queryWrapper);
    }
    /**
     * 更新指定ID的用戶信息
     *
     * @param user 用戶對象,需包含ID和更新后的用戶信息
     * @return 更新操作影響的行數(shù),通常為1表示成功,0表示失敗
     */
    @PutMapping
    public Integer updateUserById(@RequestBody User user) {
        // 更新指定ID的用戶信息
        return userService.updateUserById(user);
    }
    /**
     * 刪除指定ID的用戶信息
     *
     * @param id 用戶ID,唯一標識要刪除的用戶
     * @return 刪除操作影響的行數(shù),通常為1表示成功,0表示失敗
     */
    @DeleteMapping("/{id}")
    public Integer deleteUserById(@PathVariable Integer id) {
        // 刪除指定ID的用戶信息
        return userService.deleteUserById(id);
    }
    /**
     * 分頁查詢用戶信息
     *
     * @param from 分頁起始位置
     * @param size 每頁大小
     * @return 用戶列表,符合條件的用戶集合,可能為空
     */
    @GetMapping("/page")
    public List<User> getUserListWithPage(@RequestParam(defaultValue = "0") int from,
                                          @RequestParam(defaultValue = "10") int size) {
        // 分頁查詢用戶信息
        LambdaEsQueryWrapper<User> queryWrapper = new LambdaEsQueryWrapper<>();
        queryWrapper.from(from).size(size); // 設置分頁起始位置和大小
        return userService.getUserListWithPage(queryWrapper);
    }
}

4.遭遇的技術難題與挑戰(zhàn)

(1)缺少一些jackson的相關依賴

如果發(fā)生以下報錯可能是因為缺少一些jackson的相關依賴

報錯信息

org.springfranework.beans. factory.BeanCreationException Ceae brekpont : Error creating bean with nane ‘reguestHappingHandlerAdapter’ defined in class path resource org/springfranework/boot/autoconfigure/neb/servlet/NebHvckutoConfigurationsEnablelebHvcConfiguration.

翻譯

org.springfranework.beans。工廠。在類路徑資源org/springfranework/boot/autoconfigure/neb/servlet/NebHvckutoConfigurationsEnablelebHvcConfiguration中定義名稱為‘reguestHappingHandlerAdapter’的bean創(chuàng)建錯誤。

報錯全部信息

org.springfranework.beans. factory.BeanCreationException Ceae brekpont : Error creating bean with nane 'reguestHappingHandlerAdapter' defined in class path resource [org/springfranework/boot/autoconfigure/neb/servlet/NebHvckutoConfigurationsEnablelebHvcConfiguration.
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) [spring-beans-5.3.31.jar:5.3.31)lat org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:633) [spring-beans-5.3.31.jar:5.3.31at org.
springframework beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) [spring-beans-5.3.31.jar:5.3.31]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) [spring-beans-5.3.31.jar:5.3.31]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) 
[spring-beans-5.3.31.jar:5.3.31 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) [spring-beans-5.3.31.jar:5.3.31 at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$e(AbstractBeanFactory.java:335) [spring-beans-5.3.31.jar:5.3.31]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) 
[spring-beans-5.3.31.jar:5.3.31]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.lava:333) -[spring-beans-5.3.31.jar:5.3.31] lat org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) [spring-beans-5.3.31.jar:5.3.31]at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultlistableBeanFactory.java:955) [spring-beans-5.3.31.jar:5.3.31]at 
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:929) [spring-context-5.3.31.jar:5.3.31)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:591) [spring-context-5.3.31.jar:5.3.31]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) [spring-boot-2.7.18.jar:2.7.18)at 
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) [spring-boot-2.7.18.jar:2.7.18]lat org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409) [spring-boot-2.7.18.jar:2.7.18]at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) [spring-boot-2.7.18.jar:2.7.18]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) [spring-boot-2.7.18.jar:2.7.18]at 
org.springframework.boot.SpringApplication.run(SpringApplication.java:1289) [spring-boot-2.7.18.jar:2.7.18]lat com.gjc.EasyEsApplication.main(EasyEsApplication.java:13) [classes/:na]CSDN @Love-Sto

解決方法:根據(jù)要加入相關依賴

<dependencies>
    <!-- Jackson 數(shù)據(jù)綁定核心庫,用于將 Java 對象與 JSON 數(shù)據(jù)進行轉換 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.3</version> <!-- 請使用最新版本 -->
    </dependency>
    <!-- Jackson 核心庫,提供基本的 JSON 處理功能 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.13.3</version> <!-- 請使用最新版本 -->
    </dependency>
    <!-- Jackson 注解庫,提供用于序列化和反序列化的注解 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.13.3</version> <!-- 請使用最新版本 -->
    </dependency>
</dependencies>

注: 會報錯的原因在于Spring Boot的自動配置機制依賴于這些庫來處理JSON數(shù)據(jù)的序列化和反序列化。具體來說,jackson-databind、jackson-core 和 jackson-annotations 是Jackson庫的核心組件,Spring Boot使用它們來處理HTTP請求和響應中的JSON數(shù)據(jù)。

以下是對每個依賴項的詳細解釋: a. jackson-databind

作用:

提供數(shù)據(jù)綁定功能,即將JSON數(shù)據(jù)轉換為Java對象(反序列化)和將Java對象轉換為JSON數(shù)據(jù)(序列化)。

重要性:

這是Jackson庫的核心部分,Spring Boot的MappingJackson2HttpMessageConverter依賴于它來處理HTTP請求和響應中的JSON數(shù)據(jù)。

b. jackson-core

作用:

提供底層的流式API,用于高效地讀取和寫入JSON數(shù)據(jù)。

重要性:

jackson-databind依賴于jackson-core來實現(xiàn)其數(shù)據(jù)綁定功能。沒有jackson-core,jackson-databind無法正常工作。

c. jackson-annotations

作用:

提供注解支持,用于控制JSON數(shù)據(jù)的序列化和反序列化行為。

重要性:

雖然不是必需的,但這些注解(如@JsonProperty、@JsonDeserialize等)在處理復雜的JSON數(shù)據(jù)結構時非常有用。Spring Boot的一些自動配置功能也依賴于這些注解。

為什么缺少這些依賴會報錯? a.MappingJackson2HttpMessageConverter 依賴:

Spring Boot的WebMvcAutoConfiguration會自動配置一個RequestMappingHandlerAdapter,該適配器需要MappingJackson2HttpMessageConverter來處理JSON數(shù)據(jù)。

MappingJackson2HttpMessageConverter依賴于jackson-databind來實現(xiàn)JSON的序列化和反序列化。

b.jackson-databind 依賴:

如果沒有jackson-databind,MappingJackson2HttpMessageConverter無法實例化,從而導致RequestMappingHandlerAdapter的初始化失敗。

c.jackson-core 依賴:

jackson-databind依賴于jackson-core來實現(xiàn)底層的JSON讀寫操作。如果沒有jackson-core,jackson-databind也無法正常工作。

d.jackson-annotations 依賴:

雖然jackson-annotations不是必須的,但在某些情況下,Spring Boot的自動配置可能會使用這些注解來優(yōu)化JSON處理。缺少這些注解可能會導致一些高級功能無法正常使用。

(2)easy-es當前支持的SpringBoot版本

easy-es 是一個基于Elasticsearch的Java EE開發(fā)框架,它不直接支持Spring Boot 3.0及以上版本,因為它可能依賴于Spring Boot 2.x系列的特定API或者功能。

如果你需要在Spring Boot 3.0以上版本使用類似easy-es的功能,你可以尋找是否有支持Spring Boot 3.x的版本,或者等待easy-es更新以支持新版本。

如果你不得不在Spring Boot 3.0以上版本使用類似easy-es的功能,你可以考慮以下兩種方案:

查看easy-es的最新版本是否支持Spring Boot 3.x,如果有,則升級到支持的版本。如果easy-es沒有發(fā)布支持Spring Boot 3.x的新版本,你可以嘗試自己對現(xiàn)有版本進行修改,使其兼容Spring Boot 3.x,但這可能需要較多的工作和測試。

在進行任何升級或修改之前,請確保檢查easy-es的官方文檔和發(fā)布說明,以獲取有關兼容性和任何重大更改的信息。

注:本文開頭提供了easy-es的官網

目前的錯誤信息就是這些,未來遇到新的問題將會逐步記錄和補充。

到此這篇關于SpringBoot整合easy-es的文章就介紹到這了,更多相關SpringBoot整合easy-es內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Java中的迭代迭代器Iterator與枚舉器Enumeration

    詳解Java中的迭代迭代器Iterator與枚舉器Enumeration

    Iterator與Enumeration分別是實現(xiàn)迭代器和枚舉器類的接口,下面就帶大家來詳解Java中的迭代迭代器Iterator與枚舉器Enumeration,以及它們之間的區(qū)別.
    2016-05-05
  • SpringMVC源碼解析之消息轉換器HttpMessageConverter

    SpringMVC源碼解析之消息轉換器HttpMessageConverter

    本篇文章主要介紹了SpringMVC源碼解析之消息轉換器HttpMessageConverter ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • SpringMVC接收java.util.Date類型數(shù)據(jù)的2種方式小結

    SpringMVC接收java.util.Date類型數(shù)據(jù)的2種方式小結

    這篇文章主要介紹了使用SpringMVC接收java.util.Date類型數(shù)據(jù)的2種方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Eclipse內置瀏覽器打開方法

    Eclipse內置瀏覽器打開方法

    這篇文章主要介紹了Eclipse內置瀏覽器打開方法,需要的朋友可以了解下。
    2017-09-09
  • servlet之ServletContext簡介_動力節(jié)點Java學院整理

    servlet之ServletContext簡介_動力節(jié)點Java學院整理

    這篇文章主要介紹了servlet之ServletContext簡介,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 在 Spring Boot 項目中實現(xiàn)文件下載功能

    在 Spring Boot 項目中實現(xiàn)文件下載功能

    這篇文章主要介紹了在 Spring Boot 項目中實現(xiàn)文件下載功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot+JUnit5+MockMvc+Mockito單元測試的實現(xiàn)

    SpringBoot+JUnit5+MockMvc+Mockito單元測試的實現(xiàn)

    今天聊聊如何在 SpringBoot 中集成 Junit5、MockMvc、Mocktio。Junit5 是在 Java 棧中應用最廣的測試框架,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MyBatisPlus代碼生成器的原理及實現(xiàn)詳解

    MyBatisPlus代碼生成器的原理及實現(xiàn)詳解

    這篇文章主要為大家詳細介紹了MyBatisPlus中代碼生成器的原理及實現(xiàn),文中的示例代碼講解詳細,對我們學習MyBatisPlus有一定幫助,需要的可以參考一下
    2022-08-08
  • Java讀取郵件的方法

    Java讀取郵件的方法

    這篇文章主要介紹了Java讀取郵件的方法,以163郵件服務器為例說明了Java讀取郵件的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • Java分布式鎖由淺入深介紹

    Java分布式鎖由淺入深介紹

    這篇文章主要介紹了Java分布式鎖,數(shù)據(jù)庫實現(xiàn)分布式鎖方式比較多,如悲觀鎖(查詢時增加for?update)、樂觀鎖(通過version字段)、增加一個表記錄鎖信息等。因為依賴于數(shù)據(jù)庫,比較好理解,但是也存在一些問題
    2023-03-03

最新評論

射阳县| 普兰店市| 清流县| 富阳市| 右玉县| 桑日县| 南溪县| 霍城县| 盘锦市| 当阳市| 揭东县| 吐鲁番市| 平江县| 麻栗坡县| 同心县| 肥东县| 金华市| 松溪县| 明溪县| 芜湖县| 包头市| 深水埗区| 如东县| 清河县| 庆城县| 金阳县| 花垣县| 襄汾县| 宁强县| 波密县| 阳东县| 固安县| 天峻县| 绩溪县| 甘泉县| 思南县| 朔州市| 南阳市| 盐源县| 长治县| 无为县|