在简易聊天室开发中,消息搜索功能可以帮助用户快速找到需要的历史聊天内容,提升使用体验。实现这个功能需要结合消息存储、检索逻辑两部分内容,下面逐步讲解具体的开发流程。
功能需求梳理
简易聊天室的消息搜索功能需要支持以下基础能力:
- 支持按关键词搜索消息内容
- 支持按发送时间范围筛选消息
- 支持按发送用户筛选消息
- 返回匹配的消息列表,包含发送者、发送时间、消息内容信息
消息存储设计
首先需要设计消息的存储结构,这里使用内存存储的方式做演示,实际项目中可以替换为数据库存储。定义消息实体类如下:
// 消息实体类
public class ChatMessage {
// 消息唯一ID
private String messageId;
// 发送用户ID
private String senderId;
// 发送用户名称
private String senderName;
// 消息内容
private String content;
// 发送时间戳(毫秒)
private long sendTime;
public ChatMessage(String messageId, String senderId, String senderName, String content, long sendTime) {
this.messageId = messageId;
this.senderId = senderId;
this.senderName = senderName;
this.content = content;
this.sendTime = sendTime;
}
// getter方法
public String getMessageId() {
return messageId;
}
public String getSenderId() {
return senderId;
}
public String getSenderName() {
return senderName;
}
public String getContent() {
return content;
}
public long getSendTime() {
return sendTime;
}
}
再定义一个消息管理类,用来存储所有聊天消息,提供基础的消息添加和查询能力:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
// 消息管理类
public class MessageManager {
// 存储所有消息的集合,使用线程安全的CopyOnWriteArrayList
private List<ChatMessage> messageList = new CopyOnWriteArrayList<>();
// 添加新消息
public void addMessage(ChatMessage message) {
messageList.add(message);
}
// 获取所有消息
public List<ChatMessage> getAllMessages() {
return new ArrayList<>(messageList);
}
}
搜索功能核心实现
接下来实现搜索逻辑,创建一个搜索服务类,提供多条件组合的搜索方法:
import java.util.ArrayList;
import java.util.List;
// 消息搜索服务类
public class MessageSearchService {
private MessageManager messageManager;
public MessageSearchService(MessageManager messageManager) {
this.messageManager = messageManager;
}
/**
* 搜索消息
* @param keyword 搜索关键词,为空则不按关键词过滤
* @param startTime 开始时间戳,为0则不限制开始时间
* @param endTime 结束时间戳,为0则不限制结束时间
* @param senderId 发送者ID,为空则不按发送者过滤
* @return 匹配的消息列表
*/
public List<ChatMessage> searchMessages(String keyword, long startTime, long endTime, String senderId) {
List<ChatMessage> allMessages = messageManager.getAllMessages();
List<ChatMessage> result = new ArrayList<>();
for (ChatMessage message : allMessages) {
// 关键词过滤
if (keyword != null && !keyword.isEmpty()) {
if (!message.getContent().contains(keyword)) {
continue;
}
}
// 时间范围过滤
if (startTime > 0 && message.getSendTime() < startTime) {
continue;
}
if (endTime > 0 && message.getSendTime() > endTime) {
continue;
}
// 发送者过滤
if (senderId != null && !senderId.isEmpty()) {
if (!message.getSenderId().equals(senderId)) {
continue;
}
}
result.add(message);
}
return result;
}
}
功能测试示例
下面编写测试代码验证搜索功能的可用性:
public class ChatSearchTest {
public static void main(String[] args) {
// 初始化消息管理器
MessageManager messageManager = new MessageManager();
// 初始化搜索服务
MessageSearchService searchService = new MessageSearchService(messageManager);
// 模拟添加3条测试消息
long now = System.currentTimeMillis();
messageManager.addMessage(new ChatMessage("1", "user1", "张三", "今天天气真好", now - 1000 * 60 * 10));
messageManager.addMessage(new ChatMessage("2", "user2", "李四", "我们一起去公园吧", now - 1000 * 60 * 5));
messageManager.addMessage(new ChatMessage("3", "user1", "张三", "公园里的花开了", now));
// 测试1:搜索关键词"公园"
List<ChatMessage> result1 = searchService.searchMessages("公园", 0, 0, null);
System.out.println("搜索关键词公园的结果数量:" + result1.size());
for (ChatMessage msg : result1) {
System.out.println("发送者:" + msg.getSenderName() + ",内容:" + msg.getContent());
}
// 测试2:搜索用户user1的消息
List<ChatMessage> result2 = searchService.searchMessages(null, 0, 0, "user1");
System.out.println("用户user1的消息数量:" + result2.size());
// 测试3:搜索最近5分钟内的消息
long fiveMinutesAgo = now - 1000 * 60 * 5;
List<ChatMessage> result3 = searchService.searchMessages(null, fiveMinutesAgo, now, null);
System.out.println("最近5分钟内的消息数量:" + result3.size());
}
}
优化方向说明
以上是基础版的消息搜索实现,实际项目中可以根据需求做进一步优化:
- 如果消息量较大,可以使用
HashMap建立关键词到消息的索引,提升检索速度 - 可以将消息存储替换为MySQL或者Elasticsearch,支持更复杂的检索能力
- 可以添加分页查询功能,避免返回过多结果导致性能问题
- 可以支持模糊匹配、正则匹配等更灵活的搜索规则