9.7 KiB
9.7 KiB
消息搜索模块完成总结
完成时间: 2024年12月26日
模块编号: 模块15
开发状态: ✅ 已完成
代码质量: ✅ 优秀(无编译错误,标准三层架构)
📋 模块概述
消息搜索模块是直播IM系统的重要辅助功能,提供了强大的消息检索能力,帮助用户快速找到历史聊天记录。
核心功能
- 私聊消息搜索 - 搜索所有私聊会话中的消息
- 群组消息搜索 - 搜索所有群组中的消息
- 会话内搜索 - 在指定会话中精确搜索
- 群组内搜索 - 在指定群组中精确搜索
- 搜索历史管理 - 自动保存和管理搜索历史
🎯 已完成功能清单
1. 搜索功能 ✅
- 搜索私聊消息(全局搜索)
- 搜索群组消息(全局搜索)
- 在指定会话中搜索
- 在指定群组中搜索
- 按关键词模糊查询
- 按消息类型过滤(text/image/voice/video/file)
- 按时间范围过滤
- 分页查询支持
2. 搜索历史 ✅
- 自动保存搜索历史
- 获取搜索历史列表
- 清除搜索历史
- Redis存储(ZSet按时间排序)
- 自动过期(30天)
- 限制历史数量(最多20条)
3. 权限验证 ✅
- 验证用户身份
- 验证会话权限(只能搜索自己的会话)
- 验证群组成员身份
- 排除已删除的消息
- 排除已撤回的消息
🏗️ 技术架构
架构设计
Controller层 (MessageSearchController)
↓
Service层 (MessageSearchService)
↓
DAO层 (PrivateMessageDao, GroupMessageDao)
↓
数据库 (MySQL) + 缓存 (Redis)
已实现的类
1. Controller层
MessageSearchController - 消息搜索接口
- 位置:
crmeb-front/src/main/java/com/zbkj/front/controller/MessageSearchController.java - 功能: 提供RESTful API接口
- 特点:
- 统一异常处理
- 参数校验
- Swagger文档注解
2. Service层
MessageSearchService - 消息搜索服务接口
- 位置:
crmeb-service/src/main/java/com/zbkj/service/service/MessageSearchService.java - 功能: 定义搜索服务接口
MessageSearchServiceImpl - 消息搜索服务实现
- 位置:
crmeb-service/src/main/java/com/zbkj/service/service/impl/MessageSearchServiceImpl.java - 功能: 实现搜索业务逻辑
- 特点:
- 使用MyBatis-Plus进行数据访问
- 无SQL语句,纯Java代码
- 完善的日志记录
- Redis搜索历史管理
📡 API接口清单
1. 搜索私聊消息
GET /api/front/messages/search/private
请求参数:
keyword(必填) - 搜索关键词messageType(可选) - 消息类型:text, image, voice, video, filestartTime(可选) - 开始时间(格式:yyyy-MM-dd HH:mm:ss)endTime(可选) - 结束时间(格式:yyyy-MM-dd HH:mm:ss)pageNum(可选) - 页码,默认1pageSize(可选) - 每页数量,默认20
响应示例:
{
"code": 200,
"message": "操作成功",
"data": {
"pageNum": 1,
"pageSize": 20,
"total": 5,
"list": [
{
"id": 1,
"conversationId": 1,
"senderId": 1,
"receiverId": 2,
"content": "你好,这是一条测试消息",
"messageType": "text",
"createTime": "2024-12-26 10:00:00"
}
]
}
}
2. 搜索群组消息
GET /api/front/messages/search/group
请求参数: 同上
3. 在指定会话中搜索
GET /api/front/messages/search/conversation/{conversationId}
路径参数:
conversationId(必填) - 会话ID
请求参数: 同搜索私聊消息
4. 在指定群组中搜索
GET /api/front/messages/search/group/{groupId}
路径参数:
groupId(必填) - 群组ID
请求参数: 同搜索私聊消息
5. 获取搜索历史
GET /api/front/messages/search/history
请求参数:
limit(可选) - 返回数量限制,默认10
响应示例:
{
"code": 200,
"message": "操作成功",
"data": [
"测试消息",
"你好",
"图片"
]
}
6. 清除搜索历史
DELETE /api/front/messages/search/history
响应示例:
{
"code": 200,
"message": "搜索历史已清除"
}
💡 技术亮点
1. 标准三层架构
- Controller层: 负责接收请求和返回响应
- Service层: 负责业务逻辑处理
- DAO层: 负责数据访问
2. MyBatis-Plus查询
使用LambdaQueryWrapper构建查询条件,无需编写SQL语句:
LambdaQueryWrapper<PrivateMessage> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.and(wrapper -> wrapper
.eq(PrivateMessage::getSenderId, userId)
.or()
.eq(PrivateMessage::getReceiverId, userId));
queryWrapper.like(PrivateMessage::getContent, keyword);
queryWrapper.orderByDesc(PrivateMessage::getCreateTime);
3. Redis搜索历史
使用Redis ZSet存储搜索历史,按时间排序:
// 保存搜索历史
long score = System.currentTimeMillis();
redisTemplate.opsForZSet().add(key, keyword, score);
// 获取搜索历史(按时间倒序)
Set<Object> history = redisTemplate.opsForZSet().reverseRange(key, 0, limit - 1);
4. 完善的权限验证
- 验证用户身份
- 验证会话权限
- 验证群组成员身份
- 排除已删除和已撤回的消息
5. 灵活的过滤条件
- 关键词模糊查询(LIKE)
- 消息类型过滤
- 时间范围过滤
- 分页查询
🔍 搜索逻辑说明
私聊消息搜索流程
- 参数校验 - 验证用户ID和关键词
- 保存搜索历史 - 自动保存到Redis
- 构建查询条件:
- 用户必须是发送者或接收者
- 关键词模糊匹配
- 消息类型过滤(可选)
- 时间范围过滤(可选)
- 排除已删除的消息
- 排除已撤回的消息
- 执行查询 - 使用MyBatis-Plus分页查询
- 返回结果 - 按时间倒序返回
群组消息搜索流程
- 参数校验 - 验证用户ID和关键词
- 获取用户群组 - 查询用户所在的所有群组
- 保存搜索历史 - 自动保存到Redis
- 构建查询条件:
- 只搜索用户所在的群组
- 关键词模糊匹配
- 消息类型过滤(可选)
- 时间范围过滤(可选)
- 排除已删除和已撤回的消息
- 执行查询 - 使用MyBatis-Plus分页查询
- 返回结果 - 按时间倒序返回
📊 性能优化
1. 数据库优化
- 使用索引加速查询(conversation_id、group_id、create_time)
- 分页查询,避免一次性加载大量数据
- 排除已删除和已撤回的消息,减少查询数据量
2. Redis缓存
- 搜索历史存储在Redis,快速访问
- 使用ZSet按时间排序,高效查询
- 自动过期(30天),节省内存
3. 查询优化
- 使用LIKE模糊查询(适合单机部署)
- 未来可升级为Elasticsearch全文搜索(支持更大规模)
🎨 使用示例
示例1:搜索包含"你好"的私聊消息
curl -X GET "http://localhost:8080/api/front/messages/search/private?keyword=你好&pageNum=1&pageSize=20" \
-H "Authorization: Bearer YOUR_TOKEN"
示例2:搜索指定时间范围的群组消息
curl -X GET "http://localhost:8080/api/front/messages/search/group?keyword=测试&startTime=2024-12-01%2000:00:00&endTime=2024-12-26%2023:59:59&pageNum=1&pageSize=20" \
-H "Authorization: Bearer YOUR_TOKEN"
示例3:在指定会话中搜索图片消息
curl -X GET "http://localhost:8080/api/front/messages/search/conversation/1?keyword=&messageType=image&pageNum=1&pageSize=20" \
-H "Authorization: Bearer YOUR_TOKEN"
示例4:获取搜索历史
curl -X GET "http://localhost:8080/api/front/messages/search/history?limit=10" \
-H "Authorization: Bearer YOUR_TOKEN"
示例5:清除搜索历史
curl -X DELETE "http://localhost:8080/api/front/messages/search/history" \
-H "Authorization: Bearer YOUR_TOKEN"
✅ 测试验证
功能测试清单
- 搜索私聊消息(全局搜索)
- 搜索群组消息(全局搜索)
- 在指定会话中搜索
- 在指定群组中搜索
- 按消息类型过滤
- 按时间范围过滤
- 分页查询
- 获取搜索历史
- 清除搜索历史
- 权限验证(非会话成员无法搜索)
- 权限验证(非群组成员无法搜索)
- 排除已删除的消息
- 排除已撤回的消息
代码质量检查
- 无编译错误
- 无警告信息
- 代码格式规范
- 注释完整清晰
- 异常处理完善
- 日志记录详细
🚀 未来优化方向
1. 搜索性能优化
- 引入Elasticsearch全文搜索引擎
- 支持高亮显示搜索结果
- 支持拼音搜索
- 支持同义词搜索
2. 搜索功能增强
- 支持搜索表情消息
- 支持搜索@提醒消息
- 支持搜索文件名
- 支持按发送者过滤
3. 用户体验优化
- 搜索建议(自动补全)
- 热门搜索关键词
- 搜索结果排序优化
- 搜索结果预览
📝 总结
消息搜索模块已经完全实现,具备以下特点:
- 功能完整 - 支持私聊、群组、会话内、群组内搜索
- 架构清晰 - 标准三层架构,代码结构清晰
- 性能优良 - 使用MyBatis-Plus和Redis,查询高效
- 权限严格 - 完善的权限验证,保护用户隐私
- 易于扩展 - 预留Elasticsearch升级接口
该模块为用户提供了强大的消息检索能力,显著提升了用户体验。
文档版本: v1.0
最后更新: 2024年12月26日
维护状态: ✅ 已完成