SpringBoot整合easy-es

打印 上一主题 下一主题

主题 968|帖子 968|积分 2904

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、easy-es简介

   ‌‌EasyES是一款基于Elasticsearch官方提供的RestHighLevelClient开发的ORM框架,旨在简化开发流程并提高服从。‌ EasyES在保持RestHighLevelClient原有功能的基础上举行增强,而不做任何改变。它接纳与Mybatis-Plus相似的语法,使得开发者可以无缝迁徙至EasyES,无需额外学习资本。EasyES的核心理念是将简单、易用性留给用户,将复杂性留给框架,致力于成为环球最受欢迎的ElasticSearch搜刮引擎开发框架‌。
   
   EasyES的主要特点包括:
  

  • ‌全自动索引托管‌:环球开源首创的索引托管模式,无需关心索引的创建、更新及数据迁徙等繁琐步调,彻底解放开发者。
  • ‌屏蔽语言差别‌:开发者只需要会MySQL语法即可使用ES,无需学习复杂的ES语法。
  • ‌减少代码量‌:与直接使用RestHighLevelClient相比,相同的查询可以节流3-5倍的代码量。
  • ‌零魔法值‌:字段名称直接从实体中获取,无需输入字段名称字符串,提高代码可读性。
  • ‌降低门槛‌:通过EasyES,即便是只了解ES基础的初学者也可以轻松驾驭ES完成绝大多数需求的开发。
  • ‌无侵入‌:引入EasyES不会对现有工程产生影响,启动即会自动注入基本的CURD操作,性能基本无斲丧。
   
   easy-es官网 https://www.easy-es.cn/
   

 
二、实现基于Spring Boot框架的应用步伐代码

1.添加相干依赖

  1. <!-- 引入 Easy-ES 最新版本的依赖 -->
  2. <dependency>
  3.     <groupId>org.dromara.easy-es</groupId>
  4.     <artifactId>easy-es-boot-starter</artifactId>
  5.     <!-- 指定 Easy-ES 的版本号,确保使用的是最新稳定版本 -->
  6.     <version>2.0.0-beta3</version>
  7. </dependency>
  8. <!-- 引入 Spring Boot Web 启动器,并排除内置的 Elasticsearch 依赖以避免冲突 -->
  9. <dependency>
  10.     <groupId>org.springframework.boot</groupId>
  11.     <artifactId>spring-boot-starter-web</artifactId>
  12.     <!-- 注释掉了版本号,这意味着 Maven 将使用项目中定义的 Spring Boot 版本 -->
  13.     <!-- 如果没有定义,则会使用最新的可用版本 -->
  14.     <!-- 这种方式可以在 Spring Boot 升级时自动更新依赖,但可能导致不兼容问题 -->
  15.     <!--<version>2.7.18</version>-->
  16.     <exclusions>
  17.         <!-- 排除 Elasticsearch REST 高级客户端 -->
  18.         <exclusion>
  19.             <groupId>org.elasticsearch.client</groupId>
  20.             <artifactId>elasticsearch-rest-high-level-client</artifactId>
  21.         </exclusion>
  22.         <!-- 排除 Elasticsearch REST 客户端 -->
  23.         <exclusion>
  24.             <groupId>org.elasticsearch.client</groupId>
  25.             <artifactId>elasticsearch-rest-client</artifactId>
  26.         </exclusion>
  27.         <!-- 排除 Elasticsearch 核心库 -->
  28.         <exclusion>
  29.             <groupId>org.elasticsearch</groupId>
  30.             <artifactId>elasticsearch</artifactId>
  31.         </exclusion>
  32.     </exclusions>
  33. </dependency>
  34. <!-- 手动引入指定版本的 Elasticsearch REST 高级客户端 -->
  35. <dependency>
  36.     <groupId>org.elasticsearch.client</groupId>
  37.     <artifactId>elasticsearch-rest-high-level-client</artifactId>
  38.     <!-- 指定该客户端的版本号,以确保与其他依赖的兼容性 -->
  39.     <version>7.14.0</version>
  40. </dependency>
  41. <!-- 手动引入指定版本的 Elasticsearch REST 客户端 -->
  42. <dependency>
  43.     <groupId>org.elasticsearch.client</groupId>
  44.     <artifactId>elasticsearch-rest-client</artifactId>
  45.     <!-- 指定该客户端的版本号,以确保与其他依赖的兼容性 -->
  46.     <version>7.14.0</version>
  47. </dependency>
  48. <!-- 手动引入指定版本的 Elasticsearch 核心库 -->
  49. <dependency>
  50.     <groupId>org.elasticsearch</groupId>
  51.     <artifactId>elasticsearch</artifactId>
  52.     <!-- 指定核心库的版本号,以确保与其他依赖的兼容性 -->
  53.     <version>7.14.0</version>
  54. </dependency>
复制代码
 
   一些解释:
  dependency: 定义一个项目的依赖项。每个依赖项都包含一个或多个子元素,描述该依赖的详细信息。
  groupId: 指定依赖项的构造或公司名称,通常与其 Maven 仓库中的路径相对应。
  artifactId: 指定依赖项的唯一标识符,通常是库或模块的名称。
  version: 指定依赖项的版本号。可以是详细的版本字符串,也可以使用范围或特别版本标识。
  exclusions: 用于清除某些传递性依赖项。这样可以制止因不须要的依赖导致版本冲突。
  exclusion: 在 exclusions 中定义单个被清除的依赖项。包含两个子元素:groupId 和 artifactId,用于指定要清除的依赖项。
   
2.添加相干设置

   思量到有的用户偏好使用YML格式举行设置,而有的用户则更喜欢使用PROPERTIES格式,为了提供便利,我同时列出了这两种范例的设置选项,以便您可以根据自己的需求和喜欢举行选择。
   
(1)yml设置 

a.基础设置 

  1. easy-es:
  2.   enable: true # 默认为true,若为false则认为不启用本框架
  3.   address: 你的ip地址:9200 # 指定Elasticsearch服务的IP地址和端口,格式为IP:9200
  4. logging:
  5.   level:
  6.     tracer: trace # 设置日志级别为trace,开发时可开启以打印ES全部请求信息及DSL语句
  7.     # 注意:开启此配置后,可以将EE的print-dsl设置为false,以避免日志重复打印
复制代码
 b.拓展设置(可选) 

   不加不影响项目启动,但是为了实现性能优化,建议您根据实际需求和场景举行相应的设置调整,举行过细的设置优化
  1. easy-es:
  2.   keep-alive-millis: 30000 # 心跳保持时间(毫秒)。用于确保连接在无数据传输时仍然保持活动状态,防止因长时间空闲而关闭连接。
  3.   connect-timeout: 5000 # 连接超时设置(毫秒)。定义建立连接的最大等待时间,超过该时间则认为连接失败。
  4.   socket-timeout: 600000 # 数据读取超时设置(毫秒)。规定读取数据时的最大等待时间,超出此时间将中断读取操作。
  5.   request-timeout: 5000 # 请求超时设置(毫秒)。指定发送请求的最大等待时间,超过此时间则视为请求失败。
  6.   connection-request-timeout: 5000 # 连接请求超时设置(毫秒)。定义从连接池获取连接的最大等待时间。
  7.   max-conn-total: 100 # 最大总连接数。设置连接池中允许的最大连接数量。
  8.   max-conn-per-route: 100 # 每个路由的最大连接数。规定针对每个目标主机可同时建立的最大连接数量。
复制代码
 
c.全局设置(可选)

   在项目启动过程中,若未明确指定相干设置,系统将自动接纳预设的默认值以确保顺遂运行。
  1. easy-es:
  2.   schema: http # 默认为 http,可选值为 https(不使用 SSL)。配置为 https 时,使用 HTTPS 协议。
  3.   banner: true # 默认为 true,是否打印启动横幅。若不需要打印,设置为 false。
  4.   global-config:
  5.     i-kun-mode: false # 是否开启小黑子模式,默认为关闭。开启后日志会更加有趣,仅供娱乐用途。
  6.     process-index-mode: manual # 索引处理模式。可选值:smoothly(平滑模式)、not_smoothly(非平滑模式)和 manual(手动模式),默认开启手动模式。
  7.     print-dsl: true # 是否在控制台打印通过该框架生成的 DSL 语句。默认为 true,建议在测试稳定后生产环境中关闭以提高性能。
  8.     distributed: false # 当前项目是否为分布式项目。默认为 true。在非手动托管索引模式下,分布式项目会获取分布式锁,非分布式项目使用 synchronized 锁。
  9.     reindexTimeOutHours: 72 # 重建索引的超时时间,单位为小时。默认值为 72 小时,根据 ES 中存储的数据量可调整。
  10.     async-process-index-blocking: true # 异步处理索引是否阻塞主线程。默认阻塞。当数据量过大时,可调整为非阻塞,以加快项目启动速度。
  11.     active-release-index-max-retry: 4320 # 在分布式环境下,平滑模式下当前客户端激活最新索引的最大重试次数。若数据量过大,重建索引数据迁移时间超过 72 小时,可增大此参数。
  12.     active-release-index-fixed-delay: 60 # 在分布式环境下,平滑模式下当前客户端激活最新索引的重试时间间隔。若希望最终一致性时效性更高,可减小此值,但会牺牲一些性能。
  13.    
  14.     db-config:
  15.       map-underscore-to-camel-case: false # 是否开启下划线转驼峰命名,默认为 false。
  16.       index-prefix: daily_ # 索引前缀,用于区分环境。默认为空,作用与 MP 的 tablePrefix 相同。
  17.       id-type: customize # ID 生成策略。可选值为 customize(自定义),用户可以自行生成 ID(例如取自 MySQL 的数据 ID)。默认使用 ES 自动生成 ID。
  18.       field-strategy: not_empty # 字段更新策略,默认为 not_null(不为空)。
  19.       enable-track-total-hits: true # 是否开启总数据匹配追踪,默认为开启。若不开启,将无法获取数据总条数。查询数量突破 1 万条时,需要同步调整 @IndexName 注解中的 maxResultWindow。
  20.       refresh-policy: immediate # 数据刷新策略。默认为不刷新。若对数据时效性要求较高,可调整为 immediate,但会有性能损耗,也可选择 wait_until 作为折中方案。
  21.       batch-update-threshold: 10000 # 批量更新接口的阈值,默认值为 1 万。突破此值时需同步调整 enable-track-total-hits=true 和 @IndexName.maxResultWindow > 1w,并重建索引。
  22.       smartAddKeywordSuffix: true # 是否智能为字段添加 .keyword 后缀。默认开启,会根据当前字段的索引类型及查询类型自动判断是否需要拼接 .keyword 后缀。
复制代码
 
多数据源(可选)

  1. easy-es:
  2.   dynamic:
  3.     datasource:
  4.       ds1:
  5.         address: 你的ip地址:9200 # 数据源1的连接地址
  6.         # username: '可省略,如果没有用户名'
  7.         # password: '可省略,如果没有密码'
  8.       ds2:
  9.         address: 你的ip地址:9200 # 数据源2的连接地址
  10.         # username: '可省略,如果没有用户名'
  11.         # password: '可省略,如果没有密码'
  12.       # 其他数据源配置...
复制代码
 
(2)properties设置

a.基础设置

  1. # Easy-ES 配置
  2. easy-es.enable=true # 启用框架,默认为true,设置为false则禁用此框架
  3. easy-es.address=你的ip地址:9200 # 设置Elasticsearch的连接地址
  4. # 日志配置
  5. logging.level.tracer=trace # 设置日志级别为trace,开发时可开启,以打印所有Elasticsearch请求信息及DSL语句
  6. # 注意:开启此配置后,可将EE的print-dsl设置为false以避免重复打印
复制代码
 
b.拓展设置(可选)

   不加不影响项目启动,但是为了实现性能优化,建议您根据实际需求和场景举行相应的设置调整,举行过细的设置优化
  1. # Easy-ES 配置
  2. easy-es.keep-alive-millis=30000 # 心跳策略时间,单位:毫秒(ms)。设置保持连接活动的时间,以防长时间无数据传输导致连接关闭。
  3. easy-es.connect-timeout=5000 # 连接超时时间,单位:毫秒(ms)。设置建立连接时的超时时间。
  4. easy-es.socket-timeout=600000 # 通信超时时间,单位:毫秒(ms)。设置读取数据的超时时间,超过此时间将中断读取。
  5. easy-es.request-timeout=5000 # 请求超时时间,单位:毫秒(ms)。设置发送请求的超时时间,超出该时间将认为请求失败。
  6. easy-es.connection-request-timeout=5000 # 连接请求超时时间,单位:毫秒(ms)。设置从连接池中获取连接的超时时间。
  7. easy-es.max-conn-total=100 # 最大连接数,单位:个。设置连接池中最大允许的连接总数。
  8. easy-es.max-conn-per-route=100 # 最大连接路由数,单位:个。设置每个路由(目标主机)的最大连接数。
复制代码
 
c.全局设置(可选)

   在项目启动过程中,若未明确指定相干设置,系统将自动接纳预设的默认值以确保顺遂运行。
  1. # ES连接协议,默认为http,可省略;支持https免SSL方式,配置为https即可
  2. easy.es.schema=http
  3. # 是否打印banner,默认为true;不想打印时可设置为false
  4. easy.es.banner=true
  5. # 是否开启小黑子模式,默认为关闭;开启后日志将更有趣,仅供娱乐用途
  6. easy.es.global-config.i-kun-mode=false
  7. # 索引处理模式:
  8. # smoothly: 平滑模式
  9. # not_smoothly: 非平滑模式
  10. # manual: 手动模式(默认)
  11. easy.es.global-config.process-index-mode=manual
  12. # 是否在控制台打印框架生成的DSL语句,默认开启;生产环境建议关闭以提升性能
  13. easy.es.global-config.print-dsl=true
  14. # 当前项目是否为分布式项目,默认为true;非分布式项目只需使用synchronized锁
  15. easy.es.global-config.distributed=false
  16. # 重建索引超时时间,单位为小时,默认为72小时;可根据ES中存储的数据量调整
  17. easy.es.global-config.reindexTimeOutHours=72
  18. # 异步处理索引是否阻塞主线程,默认阻塞;数据量过大时可设置为非阻塞,加快项目启动
  19. easy.es.global-config.async-process-index-blocking=true
  20. # 分布式环境下,平滑模式下当前客户端激活最新索引的最大重试次数
  21. # 数据量过大时,重建索引数据迁移时间超过72小时可调大此参数
  22. easy.es.global-config.active-release-index-max-retry=4320
  23. # 分布式环境下,平滑模式下当前客户端激活最新索引的重试时间间隔
  24. # 若需要更高的一致性时效性可调小此值,但会影响性能
  25. easy.es.global-config.active-release-index-fixed-delay=60
  26. # 是否开启下划线转驼峰命名,默认为false;如果需要可设置为true
  27. easy.es.global-config.db-config.map-underscore-to-camel-case=false
  28. # 索引前缀,用于区分不同环境,默认为空;用法与MP的tablePrefix相同
  29. easy.es.global-config.db-config.index-prefix=daily_
  30. # ID生成策略:
  31. # customize: 自定义,由用户生成ID(例如:取MySQL中的数据ID)
  32. # 默认情况下,ID由ES自动生成
  33. easy.es.global-config.db-config.id-type=customize
  34. # 字段更新策略,默认为not_null;表示只更新非空字段
  35. easy.es.global-config.db-config.field-strategy=not_empty
  36. # 是否开启总数追踪,默认开启;若不开启,则无法获取数据总条数,但其他功能不受影响
  37. # 查询数量超过1万时,需要调整@IndexName注解中的maxResultWindow大于1万,并重建索引
  38. easy.es.global-config.db-config.enable-track-total-hits=true
  39. # 数据刷新策略,默认为不刷新;对数据时效性要求高时可设置为immediate,但性能损耗较高,也可选择折中的wait_until
  40. easy.es.global-config.db-config.refresh-policy=immediate
  41. # 批量更新接口的阈值,默认值为1万;突破此值需同步调整enable-track-total-hits=true,@IndexName.maxResultWindow > 1w,并重建索引
  42. easy.es.global-config.db-config.batch-update-threshold=10000
  43. # 是否智能为字段添加.keyword后缀,默认开启;根据字段的索引类型及查询类型自动判断是否需要拼接.keyword后缀
  44. easy.es.global-config.db-config.smartAddKeywordSuffix=true
复制代码
 
多数据源(可选)

  1. # 动态数据源配置
  2. # 数据源1的连接地址,请替换为实际的IP地址和端口
  3. easy.es.dynamic.datasource.ds1.address=你的ip地址:9200
  4. # 若数据源1需要用户名,可以在此填写;若无用户名可去掉此行
  5. # easy.es.dynamic.datasource.ds1.username=
  6. # 若数据源1需要密码,可以在此填写;若无密码可去掉此行
  7. # easy.es.dynamic.datasource.ds1.password=
  8. # 可以继续添加更多的数据源,示例如下:
  9. # 数据源2的连接地址,请替换为实际的IP地址和端口
  10. easy.es.dynamic.datasource.ds2.address=你的ip地址:9200
  11. # 若数据源2需要用户名,可以在此填写;若无用户名可去掉此行
  12. # easy.es.dynamic.datasource.ds2.username=
  13. # 若数据源2需要密码,可以在此填写;若无密码可去掉此行
  14. # easy.es.dynamic.datasource.ds2.password=
复制代码
 
三、实现基于Spring Boot框架的应用步伐代码(测试)

1.创建一个实体

  1. import lombok.Data;
  2. import org.dromara.easyes.annotation.HighLight;
  3. import org.dromara.easyes.annotation.IndexField;
  4. import org.dromara.easyes.annotation.IndexId;
  5. import org.dromara.easyes.annotation.IndexName;
  6. import org.dromara.easyes.annotation.rely.Analyzer;
  7. import org.dromara.easyes.annotation.rely.FieldType;
  8. import org.dromara.easyes.annotation.rely.IdType;
  9. import java.math.BigDecimal;
  10. import java.util.Date;
  11. @Data
  12. // 指定 Elasticsearch 索引名称及其分片数
  13. @IndexName(value = "user_es", shardsNum = 3)
  14. public class User {
  15.     /**
  16.      * 用户唯一标识符
  17.      * 使用自定义 ID 类型
  18.      */
  19.     @IndexId(type = IdType.CUSTOMIZE)
  20.     private Integer id;
  21.     /**
  22.      * 用户姓名
  23.      * 字段类型为 TEXT,采用 IK 最大词元分词器进行索引与搜索
  24.      * 在搜索结果中匹配的内容将被高亮显示
  25.      */
  26.     @IndexField(value = "userName", fieldType = FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD, searchAnalyzer = Analyzer.IK_MAX_WORD)
  27.     @HighLight(preTag = "<span style="color:red">", postTag = "</span>")
  28.     private String name;
  29.     /**
  30.      * 用户年龄
  31.      * 字段类型为 INTEGER
  32.      */
  33.     @IndexField(fieldType = FieldType.INTEGER)
  34.     private Integer age;
  35.     /**
  36.      * 用户薪资
  37.      * 字段类型为 DOUBLE
  38.      */
  39.     @IndexField(fieldType = FieldType.DOUBLE)
  40.     private BigDecimal salary;
  41.     /**
  42.      * 用户出生日期
  43.      * 字段类型为 DATE
  44.      */
  45.     @IndexField(fieldType = FieldType.DATE)
  46.     private Date birthday;
  47. }
复制代码
注释详解:
   @IndexName:
  value = "user_es": 指定索引名称为 user_es。
  shardsNum = 3: 设置分片数量为 3。
  replicasNum = 1: 设置副本数量为 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.参数:

  T entity - 要插入的实体对象。
  c.返回值:

  boolean - 插入是否乐成。
   
(2)insertBatch(List entities)

   a.描述:

  批量插入记录。
  b.参数:

  List entities - 要插入的实体对象列表。
  c.返回值:

  boolean - 插入是否乐成。
   
(3)deleteById(Object id)

   a.描述:

  根据 ID 删除记录。
  b.参数:

  Object id - 要删除的记录的 ID。
  c.返回值:

  boolean - 删除是否乐成。
   
(4)deleteBatchIds(Listids)

   a.描述:

  批量删除记录。
  b.参数:

  Listids - 要删除的记录的 ID 列表。
  c.返回值:

  boolean - 删除是否乐成。
   
(5)updateById(T entity)

   a.描述:

  根据 ID 更新记录。
  b.参数:

  T entity - 要更新的实体对象。
  c.返回值:

  boolean - 更新是否乐成。
   
(6)update(T entity, Wrapper wrapper)

   a.描述:

  根据条件更新记录。
  b.参数:

  T entity - 要更新的实体对象。
  Wrapper wrapper - 更新条件。
  c.返回值:

  boolean - 更新是否乐成。
   
(7)selectById(Object id)

   a.描述:

  根据 ID 查询记录。
  b.参数:

  Object id - 要查询的记录的 ID。
  c.返回值:

  T - 查询到的实体对象。
   
(8)selectList(Wrapper queryWrapper)

   a.描述:

  根据条件查询记录列表。
  b.参数:

  Wrapper queryWrapper - 查询条件。
  c.返回值:

  List - 查询到的实体对象列表。
   
<2>. 批量操作

(1)insertOrUpdate(T entity)

   a.描述:

  插入或更新记录。假如记录存在则更新,否则插入。
  b.参数:

  T entity - 要插入或更新的实体对象。
  c.返回值:

  boolean - 操作是否乐成。
   
(2)insertOrUpdateBatch(List entities)

   a.描述:

  批量插入或更新记录。假如记录存在则更新,否则插入。
  b.参数:

  List entities - 要插入或更新的实体对象列表。
  c.返回值:

  boolean - 操作是否乐成。
   
<3>. 查询操作

(1)selectOne(Wrapper queryWrapper)

   a.描述:

  根据条件查询单条记录。
  b.参数:

  Wrapper queryWrapper - 查询条件。
  c.返回值:

  T - 查询到的实体对象。
  (2)selectCount(Wrapper queryWrapper)

 
   a.描述:

  根据条件查询记录总数。
  b.参数:

  Wrapper queryWrapper - 查询条件。
  c.返回值:

  long - 记录总数。
   
(3)selectPage(Page page, Wrapper queryWrapper)

   a.描述:

  分页查询记录。
  b.参数:

  Page page - 分页对象。
  Wrapper queryWrapper - 查询条件。
  c.返回值:

  IPage - 分页结果。
   
(4)selectMaps(Wrapper queryWrapper)

   a.描述:

  根据条件查询记录列表,返回 Map 情势的列表。
  b.参数:

  Wrapper queryWrapper - 查询条件。
  c.返回值:

  List> - 查询到的记录列表。
   
(5)selectObjs(Wrapper queryWrapper)

   a.描述:

  根据条件查询记录列表,返回单个字段的值列表。
  b.参数:

  Wrapper queryWrapper - 查询条件。
  c.返回值:

  List - 查询到的记录列表。
   
<4>. 其他方法

(1)exists(Wrapper queryWrapper)

   a.描述:

  根据条件判断记录是否存在。
  b.参数:

  Wrapper queryWrapper - 查询条件。
  c.返回值:

  boolean - 记录是否存在。
   
(2)getSource(Wrapper queryWrapper)

   a.描述:

  获取查询条件对应的 DSL 语句。
  b.参数:

  Wrapper queryWrapper - 查询条件。
  c.返回值:

  String - DSL 语句。
   
3.代码示例 

(1)mapper层(持久层)

   建议:Easy-Es的Mapper和MyBatis-Plus分开存放 一个是查数据库的,一个是查es的
   
  1. import org.dromara.easyes.core.core.BaseEsMapper;
  2. /**
  3. * 用户 Elasticsearch 数据访问接口
  4. *
  5. * 该接口继承自 BaseEsMapper,专门用于处理 User 实体类的 Elasticsearch 操作。
  6. * 通过此接口,可以实现对用户数据的增删改查等操作。
  7. *
  8. * @see BaseEsMapper
  9. * @see User
  10. */
  11. public interface UserESMapper extends BaseEsMapper<User> {
  12.     // 此接口可以在未来添加自定义的用户相关查询方法
  13. }
复制代码
留意:本接口仅用于实行ES(Elasticsearch)相干操作,不涉及数据库操作,请制止功能冲突。
 
 (2)业务逻辑层(Service)

  1. import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
  2. import java.util.List;
  3. /**
  4. * 用户服务接口
  5. *
  6. * 提供用户相关的操作,包括插入、查询、更新和删除用户信息。
  7. * 本接口定义了一系列方法,用于与用户数据进行交互。
  8. * 具体实现应支持ElasticSearch存储和查询。
  9. *
  10. * @author [您的名字]
  11. * @version 1.0
  12. * @since [日期]
  13. */
  14. public interface UserEsService {
  15.     /**
  16.      * 插入用户信息
  17.      *
  18.      * @param user 用户对象,包含要插入的用户信息
  19.      * @return 操作影响的行数,通常为1表示成功,0表示失败
  20.      */
  21.     Integer insertUser(User user);
  22.     /**
  23.      * 根据用户ID查询用户信息
  24.      *
  25.      * @param id 用户ID,唯一标识一个用户
  26.      * @return 用户对象,查询成功时返回用户信息,未找到则返回null
  27.      */
  28.     User getUserById(Integer id);
  29.     /**
  30.      * 查询满足条件的用户列表
  31.      *
  32.      * @param queryWrapper 查询条件封装,包含查询所需的所有条件
  33.      * @return 用户列表,符合条件的用户集合,可能为空
  34.      */
  35.     List<User> getUserList(LambdaEsQueryWrapper<User> queryWrapper);
  36.     /**
  37.      * 更新指定ID的用户信息
  38.      *
  39.      * @param user 用户对象,需包含ID和更新后的用户信息
  40.      * @return 操作影响的行数,通常为1表示成功,0表示失败
  41.      */
  42.     Integer updateUserById(User user);
  43.     /**
  44.      * 删除指定ID的用户信息
  45.      *
  46.      * @param id 用户ID,唯一标识要删除的用户
  47.      * @return 操作影响的行数,通常为1表示成功,0表示失败
  48.      */
  49.     Integer deleteUserById(Integer id);
  50.     /**
  51.      * 分页查询用户信息
  52.      *
  53.      * @param queryWrapper 查询条件封装,包含分页信息和其他查询条件
  54.      * @return 用户列表,符合条件的用户集合,可能为空
  55.      */
  56.     List<User> getUserListWithPage(LambdaEsQueryWrapper<User> queryWrapper);
  57. }
复制代码
 
(3)实现层(ServiceImpl)

  1. import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Service;
  4. import java.util.List;
  5. /**
  6. * 用户服务实现类
  7. *
  8. * 实现了 UserEsService 接口,提供与用户相关的操作,包括插入、查询、更新和删除用户信息。
  9. * 通过 UserESMapper 与 ElasticSearch 进行交互。
  10. *
  11. * @author [您的名字]
  12. * @version 1.0
  13. * @since [日期]
  14. */
  15. @Service
  16. public class UserEsServiceImpl implements UserEsService {
  17.     @Autowired
  18.     private UserESMapper userEsMapper;
  19.     /**
  20.      * 插入用户信息到数据库
  21.      *
  22.      * @param user 用户对象,包含要插入的用户信息
  23.      * @return 操作影响的行数,通常为1表示成功,0表示失败
  24.      */
  25.     @Override
  26.     public Integer insertUser(User user) {
  27.         // 插入用户信息到数据库
  28.         return userEsMapper.insert(user);
  29.     }
  30.     /**
  31.      * 根据用户ID查询用户信息
  32.      *
  33.      * @param id 用户ID,唯一标识一个用户
  34.      * @return 用户对象,查询成功时返回用户信息,未找到则返回null
  35.      */
  36.     @Override
  37.     public User getUserById(Integer id) {
  38.         // 根据用户ID查询用户信息
  39.         return userEsMapper.selectById(id);
  40.     }
  41.     /**
  42.      * 查询满足条件的用户列表
  43.      *
  44.      * @param queryWrapper 查询条件封装,包含查询所需的所有条件
  45.      * @return 用户列表,符合条件的用户集合,可能为空
  46.      */
  47.     @Override
  48.     public List<User> getUserList(LambdaEsQueryWrapper<User> queryWrapper) {
  49.         // 查询满足条件的用户列表
  50.         return userEsMapper.selectList(queryWrapper);
  51.     }
  52.     /**
  53.      * 更新指定ID的用户信息
  54.      *
  55.      * @param user 用户对象,需包含ID和更新后的用户信息
  56.      * @return 操作影响的行数,通常为1表示成功,0表示失败
  57.      */
  58.     @Override
  59.     public Integer updateUserById(User user) {
  60.         // 更新指定ID的用户信息
  61.         return userEsMapper.updateById(user);
  62.     }
  63.     /**
  64.      * 删除指定ID的用户信息
  65.      *
  66.      * @param id 用户ID,唯一标识要删除的用户
  67.      * @return 操作影响的行数,通常为1表示成功,0表示失败
  68.      */
  69.     @Override
  70.     public Integer deleteUserById(Integer id) {
  71.         // 删除指定ID的用户信息
  72.         return userEsMapper.deleteById(id);
  73.     }
  74.     /**
  75.      * 分页查询用户信息
  76.      *
  77.      * @param queryWrapper 查询条件封装,包含分页信息和其他查询条件
  78.      * @return 用户列表,符合条件的用户集合,可能为空
  79.      */
  80.     @Override
  81.     public List<User> getUserListWithPage(LambdaEsQueryWrapper<User> queryWrapper) {
  82.         // 分页查询用户信息
  83.         return userEsMapper.selectList(queryWrapper);
  84.     }
  85. }
复制代码
 
(4)表现层(Controller)

  1. import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.*;
  4. import java.util.List;
  5. /**
  6. * 用户控制器
  7. *
  8. * 提供与用户相关的 RESTful API 接口,包括插入、查询、更新和删除用户信息。
  9. * 所有请求均以 /user-es 为前缀。
  10. *
  11. * @author [您的名字]
  12. * @version 1.0
  13. * @since [日期]
  14. */
  15. @RestController
  16. @RequestMapping("/user-es")
  17. public class UserEsController {
  18.     @Autowired
  19.     private UserEsService userService;
  20.     /**
  21.      * 插入用户信息
  22.      *
  23.      * @param user 用户对象,包含要插入的用户信息
  24.      * @return 插入操作影响的行数,通常为1表示成功,0表示失败
  25.      */
  26.     @PostMapping
  27.     public Integer insertUser(@RequestBody User user) {
  28.         // 插入用户信息
  29.         return userService.insertUser(user);
  30.     }
  31.     /**
  32.      * 根据用户ID查询用户信息
  33.      *
  34.      * @param id 用户ID,唯一标识一个用户
  35.      * @return 用户对象,查询成功时返回用户信息,未找到则返回null
  36.      */
  37.     @GetMapping("/{id}")
  38.     public User getUserById(@PathVariable Integer id) {
  39.         // 根据用户ID查询用户信息
  40.         return userService.getUserById(id);
  41.     }
  42.     /**
  43.      * 查询满足条件的用户列表
  44.      *
  45.      * @param age 可选参数,查询指定年龄的用户
  46.      * @return 用户列表,符合条件的用户集合,可能为空
  47.      */
  48.     @GetMapping
  49.     public List<User> getUserList(@RequestParam(required = false) Integer age) {
  50.         // 查询满足条件的用户列表
  51.         LambdaEsQueryWrapper<User> queryWrapper = new LambdaEsQueryWrapper<>();
  52.         if (age != null) {
  53.             queryWrapper.eq(User::getAge, age); // 添加等于年龄的查询条件
  54.         }
  55.         return userService.getUserList(queryWrapper);
  56.     }
  57.     /**
  58.      * 更新指定ID的用户信息
  59.      *
  60.      * @param user 用户对象,需包含ID和更新后的用户信息
  61.      * @return 更新操作影响的行数,通常为1表示成功,0表示失败
  62.      */
  63.     @PutMapping
  64.     public Integer updateUserById(@RequestBody User user) {
  65.         // 更新指定ID的用户信息
  66.         return userService.updateUserById(user);
  67.     }
  68.     /**
  69.      * 删除指定ID的用户信息
  70.      *
  71.      * @param id 用户ID,唯一标识要删除的用户
  72.      * @return 删除操作影响的行数,通常为1表示成功,0表示失败
  73.      */
  74.     @DeleteMapping("/{id}")
  75.     public Integer deleteUserById(@PathVariable Integer id) {
  76.         // 删除指定ID的用户信息
  77.         return userService.deleteUserById(id);
  78.     }
  79.     /**
  80.      * 分页查询用户信息
  81.      *
  82.      * @param from 分页起始位置
  83.      * @param size 每页大小
  84.      * @return 用户列表,符合条件的用户集合,可能为空
  85.      */
  86.     @GetMapping("/page")
  87.     public List<User> getUserListWithPage(@RequestParam(defaultValue = "0") int from,
  88.                                           @RequestParam(defaultValue = "10") int size) {
  89.         // 分页查询用户信息
  90.         LambdaEsQueryWrapper<User> queryWrapper = new LambdaEsQueryWrapper<>();
  91.         queryWrapper.from(from).size(size); // 设置分页起始位置和大小
  92.         return userService.getUserListWithPage(queryWrapper);
  93.     }
  94. }
复制代码
 
4.遭遇的技术难题与挑战

(1)缺少一些jackson的相干依赖

假如发生以下报错可能是因为缺少一些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创建错误。
   
报错全部信息 

  1. 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.
  2. 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.
  3. 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)
  4. [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)
  5. [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
  6. 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
  7. 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
  8. 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
复制代码
 
 解决方法:根据要参加相干依赖

  1. <dependencies>
  2.     <!-- Jackson 数据绑定核心库,用于将 Java 对象与 JSON 数据进行转换 -->
  3.     <dependency>
  4.         <groupId>com.fasterxml.jackson.core</groupId>
  5.         <artifactId>jackson-databind</artifactId>
  6.         <version>2.13.3</version> <!-- 请使用最新版本 -->
  7.     </dependency>
  8.     <!-- Jackson 核心库,提供基本的 JSON 处理功能 -->
  9.     <dependency>
  10.         <groupId>com.fasterxml.jackson.core</groupId>
  11.         <artifactId>jackson-core</artifactId>
  12.         <version>2.13.3</version> <!-- 请使用最新版本 -->
  13.     </dependency>
  14.     <!-- Jackson 注解库,提供用于序列化和反序列化的注解 -->
  15.     <dependency>
  16.         <groupId>com.fasterxml.jackson.core</groupId>
  17.         <artifactId>jackson-annotations</artifactId>
  18.         <version>2.13.3</version> <!-- 请使用最新版本 -->
  19.     </dependency>
  20. </dependencies>
复制代码
 
   注: 会报错的原因在于Spring Boot的自动设置机制依赖于这些库来处理JSON数据的序列化和反序列化。详细来说,jackson-databind、jackson-core 和 jackson-annotations 是Jackson库的核心组件,Spring Boot使用它们来处理HTTP请求和相应中的JSON数据。
   
以下是对每个依赖项的详细解释:

a. jackson-databind

   作用:

  提供数据绑定功能,即将JSON数据转换为Java对象(反序列化)和将Java对象转换为JSON数据(序列化)。
  重要性:

  这是Jackson库的核心部门,Spring Boot的MappingJackson2HttpMessageConverter依赖于它来处理HTTP请求和相应中的JSON数据。
   
b. jackson-core

   作用:

  提供底层的流式API,用于高效地读取和写入JSON数据。
  重要性:

  jackson-databind依赖于jackson-core来实现其数据绑定功能。没有jackson-core,jackson-databind无法正常工作。
   
c. jackson-annotations

   作用:

  提供注解支持,用于控制JSON数据的序列化和反序列化行为。
  重要性:

  固然不是必须的,但这些注解(如@JsonProperty、@JsonDeserialize等)在处理复杂的JSON数据结构时非常有用。Spring Boot的一些自动设置功能也依赖于这些注解。
   
为什么缺少这些依赖会报错?

a.MappingJackson2HttpMessageConverter 依赖:

   Spring Boot的WebMvcAutoConfiguration会自动设置一个RequestMappingHandlerAdapter,该适配器需要MappingJackson2HttpMessageConverter来处理JSON数据。
  MappingJackson2HttpMessageConverter依赖于jackson-databind来实现JSON的序列化和反序列化。
   
b.jackson-databind 依赖:

   假如没有jackson-databind,MappingJackson2HttpMessageConverter无法实例化,从而导致RequestMappingHandlerAdapter的初始化失败。
   
c.jackson-core 依赖:

   jackson-databind依赖于jackson-core来实现底层的JSON读写操作。假如没有jackson-core,jackson-databind也无法正常工作。
   
d.jackson-annotations 依赖:

   固然jackson-annotations不是必须的,但在某些情况下,Spring Boot的自动设置可能会使用这些注解来优化JSON处理。缺少这些注解可能会导致一些高级功能无法正常使用。
   
(2)easy-es当前支持的SpringBoot版本 

   easy-es 是一个基于Elasticsearch的Java EE开发框架,它不直接支持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没有发布支持Spring Boot 3.x的新版本,你可以尝试自己对现有版本举行修改,使其兼容Spring Boot 3.x,但这可能需要较多的工作和测试。
  在举行任何升级或修改之前,请确保检查easy-es的官方文档和发布阐明,以获取有关兼容性和任何庞大更改的信息。
  注:本文开头提供了easy-es的官网
  
目前的错误信息就是这些,未来碰到新的题目将会逐步记录和增补。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表