Elasticsearch8

64 阅读8分钟
  cluster-nodes: 127.0.0.1:9300

md5: # md5加密 key: 76e7ac9d7134a81381af18b626c23088 # md5秘钥

snow: # 雪花算法 work: id: 20 data: id: 20


5. ElasticsearchConfig.java



import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.util.Arrays;

import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.http.HttpResponseInterceptor; import org.apache.http.message.BasicHeader; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;

import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.json.jackson.JacksonJsonpMapper; import co.elastic.clients.transport.ElasticsearchTransport; import co.elastic.clients.transport.rest_client.RestClientTransport; import lombok.extern.slf4j.Slf4j;

/**

  • @author

  • @date 2024/3/12

  • @since JDK 17 */ @Slf4j @Configuration public class ElasticsearchConfig { @Value("${spring.elasticsearch.rest.url}") private String url;

    @Value("${spring.elasticsearch.rest.port}") private int port;

    @Value("${spring.elasticsearch.rest.username}") private String userName;

    @Value("${spring.elasticsearch.rest.password}") private String password;

    @Value("${spring.elasticsearch.rest.scheme}") private String scheme;

    @Bean public ElasticsearchClient getClient() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { Header[] defaultHeaders = { new BasicHeader("charset", "utf-8"), new BasicHeader("content-type", "application/json") };

     RestClientBuilder clientBuilder = RestClient.builder(new HttpHost(url, port, scheme));
     clientBuilder.setHttpClientConfigCallback(
     		httpClientBuilder -> httpClientBuilder.setDefaultHeaders(Arrays.asList(defaultHeaders))
     				.addInterceptorLast((HttpResponseInterceptor) (response, context) -> response
     						.addHeader("X-Elastic-Product", "Elasticsearch")));
    
     RestClient restClient = clientBuilder.build();
    
     ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
    
     return new ElasticsearchClient(transport);
    

    } }


6. ElasticsearchController.java



import com.wjh.request.FilePageRequest; import io.swagger.v3.oas.annotations.Parameter; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson2.JSON; import com.wjh.base.ResponseApiData; import com.wjh.entity.FileInfo; import com.wjh.request.KeyPageRequest; import com.wjh.service.IFileService;

import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j;

/**

  • @author

  • @date 2024/3/12

  • @since JDK 17 */ @Slf4j @Tag(name = "Elasticsearch AIP接口", description = "Elasticsearch AIP接口") @RestController @RequestMapping("/api/es") public class ElasticsearchController {

    @Autowired private IFileService fileService;

    @Operation(summary = "保存文件信息", description = "保存文件信息") @PostMapping("/save/file") public ResponseApiData<?> saveFile(@RequestBody FileInfo fileInfo) { log.info("保存文件信息-开始.请求参数:{}", JSON.toJSONString(fileInfo)); try { fileService.save(fileInfo);

         return ResponseApiData.success();
     } catch (Exception e) {
         log.error(String.format("保存文件信息-失败.请求参数:%s", JSON.toJSONString(fileInfo)), e);
         return ResponseApiData.systemFail("保存文件信息失败");
     }
    

    }

    @Operation(summary = "根据关键字分页查询", description = "根据关键字分页查询") @PostMapping("/file/keyPage") public ResponseApiData<Page> keyPage(@RequestBody KeyPageRequest request) { log.info("根据关键字分页查询-开始.请求参数:{}", JSON.toJSONString(request)); try { return ResponseApiData.success(fileService.keyPage(request)); } catch (Exception e) { log.error(String.format("根据关键字分页查询-失败.请求参数:%s", JSON.toJSONString(request)), e); return ResponseApiData.systemFail("根据关键字分页查询失败"); } }

    @Operation(summary = "分页查询文件信息", description = "分页查询文件信息") @PostMapping("/file/page") public ResponseApiData<Page> filePage(@RequestBody FilePageRequest request) { log.info("分页查询文件信息-开始.请求参数:{}", JSON.toJSONString(request)); try { return ResponseApiData.success(fileService.page(request)); } catch (Exception e) { log.error(String.format("分页查询文件信息-失败.请求参数:%s", JSON.toJSONString(request)), e); return ResponseApiData.systemFail("分页查询文件信息失败"); } }

    @Operation(summary = "查询文件详情", description = "查询文件详情", parameters = {@Parameter(name = "id", description = "id")} ) @GetMapping("/file/detail/{id}") public ResponseApiData fileDetail(@PathVariable String id) { log.info("查询文件详情-开始.id:{}", id);

     if (StringUtils.isBlank(id)) {
         return ResponseApiData.parameterFail("id不能为空");
     }
     try {
         return ResponseApiData.success(fileService.detail(id));
     } catch (Exception e) {
         log.error(String.format("查询文件详情-失败.id:%s", id), e);
         return ResponseApiData.systemFail("查询文件详情失败");
     }
    

    } }


7. IFileService.java



/**

  • @author

  • @date 2024/3/12

  • @since JDK 17 */ public interface IFileService { void save(FileInfo fileInfo);

    FileInfo detail(String id);

    /**

    • 根据关键字分页查询
    • @date 2024-03-13
    • @param request 请求参数
    • @return Page
    • @since JDK 17
    • @author */ Page keyPage(KeyPageRequest request);

    /**

    • 分页查询文件信息
    • @date 2024-03-13
    • @param request 查询条件
    • @return Page
    • @since JDK 17
    • @author */ Page page(FilePageRequest request); }

8. FileServiceImpl.java



import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Optional;

import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; import org.springframework.data.elasticsearch.client.elc.NativeQuery; import org.springframework.data.elasticsearch.client.elc.NativeQueryBuilder; import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.query.Order; import org.springframework.stereotype.Service;

import com.wjh.common.CommonMethods; import com.wjh.common.Constants; import com.wjh.entity.FileInfo; import com.wjh.mapper.IFileRepository; import com.wjh.request.FilePageRequest; import com.wjh.request.KeyPageRequest; import com.wjh.service.IFileService; import com.wjh.utils.DateUtil; import com.wjh.utils.JsonUtils;

import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery; import co.elastic.clients.elasticsearch._types.query_dsl.Query; import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; import co.elastic.clients.json.JsonData; import lombok.extern.slf4j.Slf4j;

/**

  • @author

  • @date 2024/3/12

  • @since JDK 17 */ @Slf4j @Service public class FileServiceImpl implements IFileService {

    @Autowired private ElasticsearchTemplate elasticsearchTemplate;

    @Autowired private IFileRepository fileRepository;

    @Override public void save(FileInfo fileInfo) { if (fileInfo.getId() == null || StringUtils.isBlank(fileInfo.getId())) { fileInfo.setId(CommonMethods.getMeUUID()); } if (fileInfo.getCreateTime() == null) { fileInfo.setCreateTime(new Date()); } if (fileInfo.getUpdateTime() == null) { fileInfo.setUpdateTime(new Date()); } fileRepository.save(fileInfo); }

    @Override public FileInfo detail(String id) { if (StringUtils.isBlank(id)) { return null; } Optional opt = fileRepository.findById(id.trim()); return opt.orElse(null); }

    /**

    • 根据关键字分页查询

    • @date 2024-03-13

    • @param request 请求参数

    • @return Page

    • @since JDK 17

    • @author */ @Override public Page keyPage(KeyPageRequest request) {

      if (request.getPageNo() == null || request.getPageNo().intValue() <= 0) { request.setPageNo(Constants.DEFAULT_PAGE_NUM); } if (request.getPageSize() == null || request.getPageSize() <= 0) { request.setPageSize(Constants.DEFAULT_PAGE_SIZE); } int offset = (request.getPageNo() - 1) * request.getPageSize();

      Sort sort = Sort.by(new Order(Sort.Direction.DESC, "create_time")/,new Order(Sort.Direction.DESC, "_score")/);

      Pageable pageable = PageRequest.of(offset, request.getPageSize(), sort);

      BoolQuery.Builder bqb = QueryBuilders.bool();

      if (StringUtils.isNotBlank(request.getKeyword())) { // 模糊查询 bqb.must(m -> m.match(ma -> ma.field("content").query(request.getKeyword().trim()))); } NativeQueryBuilder nativeQueryBuilder = new NativeQueryBuilder(); nativeQueryBuilder.withQuery(bqb.build()._toQuery()).withPageable(pageable);

      NativeQuery nativeQuery = nativeQueryBuilder.build();

      SearchHits searchHits = elasticsearchTemplate.search(nativeQuery, FileInfo.class);

      long totalCount = searchHits.getTotalHits();

      List<SearchHit> searchHitList = searchHits.getSearchHits();

      Page page = new PageImpl<>(new ArrayList<>(), pageable, totalCount);

      if (CollectionUtils.isNotEmpty(searchHitList)) { List fileList = new ArrayList<>(searchHitList.size());

       for (SearchHit<FileInfo> searchHit : searchHitList) {
           fileList.add(searchHit.getContent());
       }
       page = new PageImpl<>(fileList, pageable, totalCount);
      

      } return page; }

    /**

    • 分页查询文件信息

    • @param request 查询条件

    • @return Page

    • @date 2024-03-13

    • @author

    • @since JDK 17 */ @Override public Page page(FilePageRequest request) { // 去除前后空格 request = CommonMethods.beanStrim(request);

      if (request.getPageNo() == null || request.getPageNo().intValue() <= 0) { request.setPageNo(Constants.DEFAULT_PAGE_NUM); } if (request.getPageSize() == null || request.getPageSize() <= 0) { request.setPageSize(Constants.DEFAULT_PAGE_SIZE); } // 查询起始日期(yyyy-MM-dd) String beginDate = request.getBeginDate(); // 查询截止日期(yyyy-MM-dd) String endDate = request.getEndDate();

      if (StringUtils.isNotBlank(beginDate) && beginDate.length() == Constants.DATE_LENGTH) { request.setBeginDate(beginDate + " 00:00:00"); } if (StringUtils.isNotBlank(endDate) && endDate.length() == Constants.DATE_LENGTH) { request.setEndDate(endDate + " 23:59:59"); } final FilePageRequest filePageRequest = JsonUtils.parse(JsonUtils.toJSONBytes(request), FilePageRequest.class);

      BoolQuery.Builder bqb = QueryBuilders.bool();

      if (StringUtils.isNotBlank(filePageRequest.getFileName())) { // 模糊查询 bqb.must(m -> m.match(ma -> ma.field("file_name").query(filePageRequest.getFileName()))); } if (StringUtils.isNotBlank(filePageRequest.getFileType())) { // 模糊查询 bqb.must(m -> m.match(ma -> ma.field("file_type").query(filePageRequest.getFileType()))); } if (StringUtils.isNotBlank(filePageRequest.getBeginDate())) { // RangeQuery rangeQuery = QueryBuilders.range().field("create_time").gte(JsonData.of(filePageRequest.getBeginDate())).build(); Query query = Query.of(q -> q .range(r -> { r.field("create_time"); r.gte(JsonData.of(DateUtil.parseDate(filePageRequest.getBeginDate(), DateUtil.formatPattern))); return r; } ) ); bqb.must(query); } if (StringUtils.isNotBlank(filePageRequest.getEndDate())) { Query query = Query.of(q -> q .range(r -> { r.field("create_time"); r.lte(JsonData.of(DateUtil.parseDate(filePageRequest.getEndDate(), DateUtil.formatPattern))); return r; } ) ); bqb.must(query); } int offset = (filePageRequest.getPageNo() - 1) * filePageRequest.getPageSize();

      Sort sort = Sort.by(new Order(Sort.Direction.DESC, "create_time")/,new Order(Sort.Direction.DESC, "_score")/);

      Pageable pageable = PageRequest.of(offset, filePageRequest.getPageSize(), sort);

      NativeQueryBuilder nativeQueryBuilder = new NativeQueryBuilder(); nativeQueryBuilder.withQuery(bqb.build()._toQuery()).withPageable(pageable);

      NativeQuery nativeQuery = nativeQueryBuilder.build();

      SearchHits searchHits = elasticsearchTemplate.search(nativeQuery, FileInfo.class);

      long totalCount = searchHits.getTotalHits();

      List<SearchHit> searchHitList = searchHits.getSearchHits();

      Page page = new PageImpl<>(new ArrayList<>(), pageable, totalCount);

      if (CollectionUtils.isNotEmpty(searchHitList)) { List fileList = new ArrayList<>(searchHitList.size());

       for (SearchHit<FileInfo> searchHit : searchHitList) {
       	fileList.add(searchHit.getContent());
       }
       page = new PageImpl<>(fileList, pageable, totalCount);
      

      } return page; } }


9. IFileRepository.java



import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import com.wjh.entity.FileInfo;

/**

  • @author
  • @date 2024/3/12
  • @since JDK 17 */ //@Repository public interface IFileRepository extends ElasticsearchRepository<FileInfo, String> { }

10. FileInfo.java



import java.io.Serial; import java.io.Serializable; import java.util.Date;

import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType;

import com.baomidou.mybatisplus.annotation.TableField;

import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString;

/**

  • Elasticsearch 实体类

  • @author

  • @date 2024/3/12

  • @since JDK 17 */ @Data @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true) @Document(indexName = "file_info", createIndex = false) public class FileInfo implements Serializable { @Serial private static final long serialVersionUID = 4651439852938664760L;

    /** 主键 */ @Field(name = "id", type = FieldType.Long) @Id private String id;

    /** 文件名称 */ @Field(name = "file_name", type = FieldType.Text, analyzer = "jieba_index", searchAnalyzer = "jieba_index") private String fileName;

    /**

    • 文件类型 */ @Field(name = "file_type", type = FieldType.Keyword) private String fileType;

    /**

    • 内容类型 */ @Field(name = "content_type", type = FieldType.Text) private String contentType;

    /**

    • 附件内容 */ @Field(name = "content", type = FieldType.Text, analyzer = "jieba_index", searchAnalyzer = "jieba_index") @TableField(exist = false) private String content;

    /**

    • 文件地址 */ @Field(name = "file_url", type = FieldType.Text) private String fileUrl;

    /**

    • 创建时间 */ @Field(name = "create_time", type = FieldType.Date) private Date createTime;

    /**

    • 更新时间 */ @Field(name = "update_time", type = FieldType.Date) private Date updateTime; }

11. JsonUtils.java



import java.util.ArrayList; import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.serializer.SerializerFeature;

/**

  • @author

  • @date 2022/5/29

  • @since JDK 17 */ public final class JsonUtils {

    private JsonUtils() { }

    /**

    • 根据JSON字符串解析出java对象
    • 需要提供java对象类型
    • @param text JSON字符串,不能为NULL
    • @param clazz java对象类型
    • @return java对象 */ public static final T parse(String text, Class clazz) { return JSON.parseObject(text, clazz); }

    /**

    • 根据字节数组解析出java对象
    • 需要提供java对象类型
    • @param input 字节数组
    • @param clazz java对象类型
    • @return java对象 */ public static final T parse(byte[] input, Class clazz) { return JSON.parseObject(input, clazz, new Feature[0]); }

    /**

    • 根据java对象转换成字节数组
    • 按照默认方式转换,只输出属性和属性值信息,不加入任何其他类型信息
    • @param object java对象
    • @return 字节数组 */ public static final byte[] toJSONBytes(Object object) { return JSON.toJSONBytes(object, new SerializerFeature[0]); }

    /**

    • 获取JSON串中指定的key对应的值
    • @param json
    • @param key
    • @return String
    • @author
    • @date 2018年11月12日
    • @since JDK 1.7 */ public static String getJsonValue(String json, String key) { if (StringUtils.isBlank(json) || StringUtils.isBlank(key)) { return null; } JSONObject jsonObj = JSONObject.parseObject(json); return jsonObj.getString(key); }

    /**

    • 获取JSON串中指定的key对应的值

    • @param json 数组

    • @param key

    • @return String

    • @author

    • @date 2018年12月12日

    • @since JDK 1.7 */ public static List getJsonArrayValue(String json, String key) {

      if (StringUtils.isBlank(json) || StringUtils.isBlank(key)) { return null; }

      List list = new ArrayList<>();

      JSONArray jsonArray = JSON.parseArray(json);

      if (jsonArray != null) {

       for (int i = 0; i < jsonArray.size(); i++) {
      
       	JSONObject jsonObj = jsonArray.getJSONObject(i);
      
       	list.add(jsonObj.getString(key));
       }
      

      } return list; }

    public static String toJsonStringFormat(Object obj) { // 自定义时间格式 JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

     return JSON.toJSONString(obj, //
     		// SerializerFeature.PrettyFormat, // 格式化结果
     		SerializerFeature.WriteMapNullValue, // 输出值为null的字段
     		SerializerFeature.WriteNullStringAsEmpty, // 字符类型字段如果为null,输出为”“,而非null
     		// SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null,输出为0,而非null
     		// SerializerFeature.DisableCircularReferenceDetect, // 消除对同一对象循环引用的问题
     		SerializerFeature.WriteNullListAsEmpty, // List字段如果为null,输出为[],而非null
     		SerializerFeature.WriteDateUseDateFormat, // 自定义时间格式
     		SerializerFeature.DisableCircularReferenceDetect // 消除循环引用
     );
    

    } }


12. DateUtil.java



import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;

/**

  • 日期工具类

  • @author zsq */ public class DateUtil {

    public static final String formatPattern = "yyyy-MM-dd HH:mm:ss";

    public static final String formatPattern2 = "HH:mm:ss";

    public static final String formatPattern3 = "yyyy-MM-dd";

    public static final String formatPattern4 = "yyyy-MM-dd HH:mm";

    public static final String formatPattern5 = "HH:mm";

    /**

    • 避免高并发下,多线程引发的时间错误,报错问题,SimpleDateFormat是线程不安全的 */ public static ThreadLocal DATE_FORMAT = new ThreadLocal(){ @Override protected DateFormat initialValue() { return new SimpleDateFormat(formatPattern); } };

    /**

    • 避免高并发下,多线程引发的时间错误,报错问题,SimpleDateFormat是线程不安全的 */ public static ThreadLocal DATE_FORMAT_3 = new ThreadLocal(){ @Override protected DateFormat initialValue() { return new SimpleDateFormat(formatPattern3); } };

    /**

    • 避免高并发下,多线程引发的时间错误,报错问题,SimpleDateFormat是线程不安全的 */ public static ThreadLocal DATE_FORMAT_4 = new ThreadLocal(){ @Override protected DateFormat initialValue() { return new SimpleDateFormat(formatPattern4); } };

    /**

    • 避免高并发下,多线程引发的时间错误,报错问题,SimpleDateFormat是线程不安全的 */ public static ThreadLocal DATE_FORMAT_5 = new ThreadLocal(){ @Override protected DateFormat initialValue() { return new SimpleDateFormat(formatPattern5); } };

    /**

    • 获取当前时间字符串
    • @return */ public static String getNowTimeStr(){ Date nowTime = Calendar.getInstance().getTime(); String nowTimeStr = DATE_FORMAT.get().format(nowTime); return nowTimeStr; }

    /**

    • 格式化日期对象
    • @param time
    • @return */ public static String format(Date time){ return format(time, formatPattern); }

    /**

    • 格式化日期对象
    • @param time
    • @param pattern
    • @return */ public static String format(Date time, String pattern){ DateFormat dateFormat = new SimpleDateFormat(pattern); String str = dateFormat.format(time); return str; }

    /**

    • 格式化日期对象
    • @param time
    • @return */ public static String format(Date time, DateFormat dateFormat){ String str = dateFormat.format(time); return str; }

    /**

    • 字符串转日期对象
    • @param timeStr
    • @param pattern
    • @return */ public static Date parseDate(String timeStr, String pattern) { try { DateFormat dateFormat = new SimpleDateFormat(pattern); Date parseDate = dateFormat.parse(timeStr); return parseDate; } catch (Exception e) { return null; } }

    /**

    • 字符串转日期对象
    • @param timeStr
    • @param dateFormat
    • @return */ public static Date parseDate(String timeStr, DateFormat dateFormat) throws ParseException { Date parseDate = dateFormat.parse(timeStr); return parseDate; }

    /**

    • 字符串转日期对象
    • @param timeStr
    • @return */ public static Date parseDate(String timeStr) throws ParseException { return parseDate(timeStr, formatPattern); }

    /**

    • 两个日期对象相差秒
    • @return */ public static long diffSecond(Date begin, Date end){ long diffMillisecond = end.getTime() - begin.getTime(); return diffMillisecond / 1000L; }

    /**

    • 判断日期在两个日期之间

    • @param begin 开始日期

    • @param mid 判断的日期

    • @param end 结束日期

    • @return 是否存在俩日期之间 */ public static boolean betweenDays(Date begin, Date mid, Date end){ if(mid.getTime() >= begin.getTime() && mid.getTime() < end.getTime()){ return true; }

      return false; }

    /**

    • 获取当前日期之前或之后的指定天数的日期
    • @param num 指定天数
    • @return 指定天数之前或之后的日期 */ public static Date getBeforeOrAfterDay(int num) { Calendar c = Calendar.getInstance(); c.add(Calendar.DAY_OF_MONTH, num); return c.getTime(); }

}


13. EsPageRequest.java



import java.io.Serial; import java.io.Serializable;

import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString;

/**

  • 分页查询 公共请求参数

  • @author

  • @date 2024/3/13

  • @since JDK 17 */ @Data @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true) public class EsPageRequest implements Serializable { @Serial private static final long serialVersionUID = 2403543093430201749L;

    /** 第几页 */ @Schema(description = "第几页", example = "1") private Integer pageNo;

    /** 每页数量 */ @Schema(description = "每页数量", example = "10") private Integer pageSize;

    /** 查询起始日期(yyyy-MM-dd) */ @Schema(description = "查询起始日期(yyyy-MM-dd)", example = "2024-01-01") private String beginDate;

    /** 查询截止日期(yyyy-MM-dd) */ @Schema(description = "查询截止日期(yyyy-MM-dd)", example = "2024-12-31") private String endDate; }


14. KeyPageRequest.java



import java.io.Serial;

import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString;

/**

  • 根据关键字分页查询 请求参数

  • @author

  • @date 2024/3/13

  • @since JDK 17 */ @Data @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true) public class KeyPageRequest extends EsPageRequest { @Serial private static final long serialVersionUID = 6781615780605296835L;

    /** 关键字 */ @Schema(description = "关键字") private String keyword; }


15. FilePageRequest.java



import java.io.Serial;

import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString;

/**

  • 分页查询文件信息 请求参数
  • @author
  • @date 2024/3/13
  • @since JDK 17 */ @Data @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true) public class FilePageRequest extends EsPageRequest {

Java高频面试专题合集解析:

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

更多Java架构进阶资料展示

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

相关阅读docs.qq.com/doc/DSmxTbFJ1cmN1R2dB