搜索消息
搜索消息
本文介绍环信即时通讯 IM React Native SDK 如何搜索本地消息。
技术原理
环信即时通讯 IM React Native SDK 通过 ChatManager 类支持搜索用户设备上存储的消息数据,其中包含如下主要方法:
ChatManager#getMsgsWithKeyword: 根据搜索范围搜索所有会话中的消息。ChatConversation#getMsgsWithKeyword: 根据搜索范围搜索当前会话中的消息。ChatManager.searchMessages:搜索所有会话的多种类型的消息。ChatManager.searchMessagesInConversation:搜索指定会话的多种类型的消息。
前提条件
开始前,请确保满足以下条件:
实现方法
根据搜索范围搜索所有会话中的消息
你可以调用 ChatManager#getMsgsWithKeyword 方法,除了设置关键字、消息时间戳、消息数量、发送方、搜索方向等条件搜索所有会话中的消息时,你还可以选择搜索范围,如只搜索消息内容、只搜索消息扩展信息以及同时搜索消息内容以及扩展信息。
提示
若使用该功能,需将 SDK 升级至 V1.4.0 或以上版本。
ChatClient.getInstance()
.chatManager.getMsgsWithKeyword({
keywords, // 搜索关键字
direction, // 搜索方向
timestamp, // 搜索消息的时间戳,从该时间戳开始按照搜索方向 `direction` 搜索。
maxCount: 20, // 请求的消息数量
from: "", // 消息发送者
searchScope: ChatMessageSearchScope.All, // 搜索范围,详见 `ChatMessageSearchScope` 类型。
})
.then((res) => {
// todo: 操作成功, 处理返回的结果
})
.catch((error) => {
// todo: 发生错误
});
根据搜索范围搜索当前会话中的消息
除了设置关键字、消息时间戳、消息数量、发送方、搜索方向等条件搜索当前会话中的消息,你还可以选择搜索范围,如只搜索消息内容、只搜索消息扩展信息以及同时搜索消息内容以及扩展信息。你可以通过以下两种方式获取消息。
提示
若使用该功能,需将 SDK 升级至 V1.4.0 或以上版本。
- 方式一:
// 直接调用
ChatClient.getInstance()
.chatManager.getConvMsgsWithKeyword({
convId, // 会话ID。
convType, // 会话类型:单聊为 `PeerChat`,群聊为 `GroupChat`。
keywords, // 搜索关键字
direction, // 搜索方向
timestamp, // 搜索消息的时间戳,从该时间戳开始按照搜索方向 `direction` 搜索。
count: 20, // 请求的消息数量
sender: "", // 消息发送者
isChatThread: false, // 是否是子区消息。子区消息只在子区中使用。
searchScope: ChatMessageSearchScope.All, // 搜索范围,详见 `ChatMessageSearchScope` 类型。
})
.then((res) => {
// todo: 操作成功, 处理返回的结果
})
.catch((error) => {
// todo: 发生错误
});
- 方式二:
// 通过会话对象调用
const conv = ChatClient.getInstance().chatManager.getConversation(
convId,
convType
);
conv
.getMsgsWithKeyword({
keywords, // 搜索关键字
direction, // 搜索方向
timestamp, // 搜索消息的时间戳,从该时间戳开始按照搜索方向 `direction` 搜索。
count: 20, // 请求的消息数量
sender: "", // 消息发送者
searchScope: ChatMessageSearchScope.All, // 搜索范围,详见 `ChatMessageSearchScope` 类型。
})
.then((res) => {
// todo: 操作成功, 处理返回的结果
})
.catch((error) => {
// todo: 发生错误
});
根据消息类型搜索所有会话中的消息
你可以调用 ChatManager#searchMessages 方法除了设置消息时间戳、消息数量、发送方、搜索方向等条件搜索当前会话中的消息,你还可以设置单个或多个消息类型搜索本地数据库中所有会话的消息。
提示
若使用该功能,需将 SDK 升级至 V1.6.0 或以上版本。
ChatClient.getInstance()
.chatManager.searchMessages({
msgTypes: [ChatMessageType.TXT],
timestamp: 1725009277205,
})
.then((msgs: ChatMessage[]) => {
console.log("success:", msgs);
})
.catch((e) => {
console.warn(e);
});
根据消息类型搜索当前会话中的消息
你可以调用 ChatManager#searchMessagesInConversation 方法除了设置消息时间戳、消息数量、发送方、搜索方向等条件搜索当前会话中的消息,你还可以设置单个或多个消息类型搜索本地数据库中单个会话的消息。
提示
若使用该功能,需将 SDK 升级至 V1.6.0 或以上版本。
ChatClient.getInstance()
.chatManager.searchMessagesInConversation({
convId: "foo",
convType: 0,
msgTypes: [ChatMessageType.TXT],
timestamp: 1725009277205,
})
.then((msgs: ChatMessage[]) => {
console.log("success:", msgs);
})
.catch((e) => {
console.warn(e);
});
消息关键字搜索规则
调用以下消息搜索 API 搜索不同类型的消息时,其中的 keywords 参数对应不同的内容。
只搜索消息内容
| 消息类型 | 关键字匹配的消息内容 | 关键字搜索内容示例 |
|---|---|---|
| 文本消息 | ChatTextMessageBody.content | 文本消息的实际内容“你好世界”。 |
| 图片消息 | ChatFileMessageBody.displayName | 图片文件名“photo.jpg” |
| 语音消息 | ChatFileMessageBody.displayName | 语音文件名“audio.amr” |
| 视频消息 | ChatFileMessageBody.displayName | 视频文件名“video.mp4” |
| 文件消息 | ChatFileMessageBody.displayName | 文件名“report.pdf” |
| 位置消息 | ChatLocationMessageBody.address | 地址\建筑物名称“北京市朝阳区\国贸大厦” |
| 自定义消息 | ChatCustomMessageBody.event | 自定义事件名“gift” |
| 合并消息 | ChatCombineMessageBody.title + ChatCombineMessageBody.summary | 标题\摘要“聊天记录\包含5条消息” |
只搜索扩展信息
若只搜索消息的扩展属性(attributes)JSON 字符串,keywords 字段匹配用户自定义添加的扩展属性,例如:
{"key1":"value1", "key2":"value2"}
全搜索
同时搜索消息内容和扩展信息,任一匹配即返回。
