feat(search): 增加笔记发布时间范围筛选功能

- 在 DateConstants 中新增 MM-dd 和 HH:mm 时间格式常量
- 在 DateUtils 中增加 localDateTime2String 和 formatRelativeTime 方法- 新增 NotePublishTimeRangeEnum 枚举类用于定义发布时间范围
- 在搜索服务中实现按发布时间范围筛选逻辑
- 修改 SearchNoteReqVO 添加 publishTimeRange 参数
- 修改 SearchNoteRspVO 将 updateTime 改为字符串类型并新增评论数和收藏数字段
- 更新搜索结果处理逻辑以支持新的时间格式化和数据展示
This commit is contained in:
2025-11-02 14:40:42 +08:00
parent 1335582827
commit 7c62f1dcf9
6 changed files with 163 additions and 5 deletions

View File

@@ -0,0 +1,37 @@
package com.hanserwei.hannote.search.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
@Getter
@AllArgsConstructor
public enum NotePublishTimeRangeEnum {
// 一天内
DAY(0),
// 一周内
WEEK(1),
// 半年内
HALF_YEAR(2),
;
private final Integer code;
/**
* 根据类型 code 获取对应的枚举
*
* @param code 类型 code
* @return 枚举
*/
public static NotePublishTimeRangeEnum valueOf(Integer code) {
for (NotePublishTimeRangeEnum notePublishTimeRangeEnum : NotePublishTimeRangeEnum.values()) {
if (Objects.equals(code, notePublishTimeRangeEnum.getCode())) {
return notePublishTimeRangeEnum;
}
}
return null;
}
}

View File

@@ -29,4 +29,9 @@ public class SearchNoteReqVO {
*/
private Integer sort;
/**
* 发布时间范围null不限 / 0一天内 / 1一周内 / 2半年内
*/
private Integer publishTimeRange;
}

View File

@@ -7,8 +7,6 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@@ -51,7 +49,7 @@ public class SearchNoteRspVO {
* 最后一次编辑时间
*/
@JsonAlias("update_time")
private LocalDateTime updateTime;
private String updateTime;
/**
* 被点赞总数
@@ -59,4 +57,14 @@ public class SearchNoteRspVO {
@JsonAlias("like_total")
private String likeTotal;
/**
* 被评论数
*/
private String commentTotal;
/**
* 被收藏数
*/
private String collectTotal;
}

View File

@@ -11,8 +11,11 @@ import co.elastic.clients.elasticsearch.core.search.Highlight;
import co.elastic.clients.elasticsearch.core.search.HighlightField;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.util.NamedValue;
import com.hanserwei.framework.common.constant.DateConstants;
import com.hanserwei.framework.common.response.PageResponse;
import com.hanserwei.framework.common.utils.DateUtils;
import com.hanserwei.framework.common.utils.NumberUtils;
import com.hanserwei.hannote.search.enums.NotePublishTimeRangeEnum;
import com.hanserwei.hannote.search.enums.NoteSortTypeEnum;
import com.hanserwei.hannote.search.index.NoteIndex;
import com.hanserwei.hannote.search.model.vo.SearchNoteReqVO;
@@ -20,6 +23,7 @@ import com.hanserwei.hannote.search.model.vo.SearchNoteRspVO;
import com.hanserwei.hannote.search.service.NoteService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.io.IOException;
@@ -46,6 +50,8 @@ public class NoteServiceImpl implements NoteService {
Integer type = searchNoteReqVO.getType();
// 排序方式
Integer sort = searchNoteReqVO.getSort();
// 发布时间范围
Integer publishTimeRange = searchNoteReqVO.getPublishTimeRange();
// --- 2. 分页参数 ---
int pageSize = 10;
@@ -93,6 +99,31 @@ public class NoteServiceImpl implements NoteService {
)
);
}
// 按发布时间范围过滤
NotePublishTimeRangeEnum notePublishTimeRangeEnum = NotePublishTimeRangeEnum.valueOf(publishTimeRange);
if (Objects.nonNull(notePublishTimeRangeEnum)) {
// 结束时间
String endTime = LocalDateTime.now().format(DateConstants.DATE_FORMAT_Y_M_D_H_M_S);
// 开始时间
String startTime = null;
switch (notePublishTimeRangeEnum) {
case DAY -> startTime = DateUtils.localDateTime2String(LocalDateTime.now().minusDays(1)); // 一天之前的时间
case WEEK -> startTime = DateUtils.localDateTime2String(LocalDateTime.now().minusWeeks(1)); // 一周之前的时间
case HALF_YEAR ->
startTime = DateUtils.localDateTime2String(LocalDateTime.now().minusMonths(6)); // 半年之前的时间
}
// 设置时间范围
if (StringUtils.isNoneBlank(startTime)) {
String finalStartTime = startTime;
boolQueryBuilder.filter(f -> f.range(r -> r
.term(t -> t.field(NoteIndex.FIELD_NOTE_CREATE_TIME)
.gte(finalStartTime)
.lte(endTime)))
);
}
}
BoolQuery boolQuery = boolQueryBuilder.build();
// --- 4. 构建排序 (Sort) 和 FunctionScore ---
Query finalQuery;
@@ -238,8 +269,10 @@ public class NoteServiceImpl implements NoteService {
String highlightTitle = source.getHighlightTitle();
String avatar = source.getAvatar();
String nickname = source.getNickname();
LocalDateTime updateTime = source.getUpdateTime();
String updateTime = source.getUpdateTime();
String likeTotal = source.getLikeTotal();
String collectTotal = source.getCollectTotal();
String commentTotal = source.getCommentTotal();
searchNoteRspVOS.add(SearchNoteRspVO.builder()
.noteId(noteId)
.cover(cover)
@@ -247,9 +280,11 @@ public class NoteServiceImpl implements NoteService {
.highlightTitle(highlightTitle)
.avatar(avatar)
.nickname(nickname)
.updateTime(updateTime)
.updateTime(DateUtils.formatRelativeTime(LocalDateTime.parse(updateTime, DateConstants.DATE_FORMAT_Y_M_D_H_M_S)))
.highlightTitle(highlightedTitle)
.likeTotal(likeTotal == null ? "0" : NumberUtils.formatNumberString(Long.parseLong(likeTotal)))
.collectTotal(collectTotal == null ? "0" : NumberUtils.formatNumberString(Long.parseLong(collectTotal)))
.collectTotal(commentTotal == null ? "0" : NumberUtils.formatNumberString(Long.parseLong(commentTotal)))
.build());
}