zhibo/Zhibo/zhibo-h/消息搜索模块完成总结.md

9.7 KiB
Raw Blame History

消息搜索模块完成总结

完成时间: 2024年12月26日
模块编号: 模块15
开发状态: 已完成
代码质量: 优秀(无编译错误,标准三层架构)


📋 模块概述

消息搜索模块是直播IM系统的重要辅助功能提供了强大的消息检索能力帮助用户快速找到历史聊天记录。

核心功能

  1. 私聊消息搜索 - 搜索所有私聊会话中的消息
  2. 群组消息搜索 - 搜索所有群组中的消息
  3. 会话内搜索 - 在指定会话中精确搜索
  4. 群组内搜索 - 在指定群组中精确搜索
  5. 搜索历史管理 - 自动保存和管理搜索历史

🎯 已完成功能清单

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, file
  • startTime (可选) - 开始时间格式yyyy-MM-dd HH:mm:ss
  • endTime (可选) - 结束时间格式yyyy-MM-dd HH:mm:ss
  • pageNum (可选) - 页码默认1
  • pageSize (可选) - 每页数量默认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
  • 消息类型过滤
  • 时间范围过滤
  • 分页查询

🔍 搜索逻辑说明

私聊消息搜索流程

  1. 参数校验 - 验证用户ID和关键词
  2. 保存搜索历史 - 自动保存到Redis
  3. 构建查询条件:
    • 用户必须是发送者或接收者
    • 关键词模糊匹配
    • 消息类型过滤(可选)
    • 时间范围过滤(可选)
    • 排除已删除的消息
    • 排除已撤回的消息
  4. 执行查询 - 使用MyBatis-Plus分页查询
  5. 返回结果 - 按时间倒序返回

群组消息搜索流程

  1. 参数校验 - 验证用户ID和关键词
  2. 获取用户群组 - 查询用户所在的所有群组
  3. 保存搜索历史 - 自动保存到Redis
  4. 构建查询条件:
    • 只搜索用户所在的群组
    • 关键词模糊匹配
    • 消息类型过滤(可选)
    • 时间范围过滤(可选)
    • 排除已删除和已撤回的消息
  5. 执行查询 - 使用MyBatis-Plus分页查询
  6. 返回结果 - 按时间倒序返回

📊 性能优化

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. 用户体验优化

  • 搜索建议(自动补全)
  • 热门搜索关键词
  • 搜索结果排序优化
  • 搜索结果预览

📝 总结

消息搜索模块已经完全实现,具备以下特点:

  1. 功能完整 - 支持私聊、群组、会话内、群组内搜索
  2. 架构清晰 - 标准三层架构,代码结构清晰
  3. 性能优良 - 使用MyBatis-Plus和Redis查询高效
  4. 权限严格 - 完善的权限验证,保护用户隐私
  5. 易于扩展 - 预留Elasticsearch升级接口

该模块为用户提供了强大的消息检索能力,显著提升了用户体验。


文档版本: v1.0
最后更新: 2024年12月26日
维护状态: 已完成