浏览 SDKs · WASM
SDKsWASM

搜索消息

在本地已同步消息中按关键词与会话条件搜索。

复制

WASM SDK 通过 searchLocalMessages() 搜索当前用户本地可见的消息。群组消息搜索的目标参数是群聊对应的 conversationID,不是发送消息时使用的 groupID。如果界面只保存了 groupID,先按获取会话 ID取得群会话 ID。

搜索范围来自 SDK 已同步到浏览器本地缓存的消息。需要跨用户审计、服务端全量检索、复杂权限过滤或全局排序时,应由后端搜索服务承担,再把命中的 conversationIDclientMsgID 返回给客户端定位。

创建搜索查询

keywordList 接收一个或多个关键词。搜索框通常只代表一次用户输入,建议先去掉首尾空格并过滤空值,避免把空关键词传给 SDK。

import { MessageType } from '@openim/wasm-client-sdk';

type SearchGroupMessagesOptions = {
  conversationID: string;
  keyword: string;
  pageIndex?: number;
  count?: number;
  senderUserIDList?: string[];
};

const searchGroupMessagesByKeyword = async ({
  conversationID,
  keyword,
  pageIndex = 1,
  count = 20,
  senderUserIDList,
}: SearchGroupMessagesOptions) => {
  const normalizedKeyword = keyword.trim();

  if (!normalizedKeyword) {
    return {
      totalCount: 0,
      messages: [],
    };
  }

  const { data } = await openimsdk.searchLocalMessages({
    conversationID,
    keywordList: [normalizedKeyword],
    senderUserIDList,
    messageTypeList: [MessageType.TextMessage, MessageType.AtTextMessage],
    pageIndex,
    count,
  });

  return toSearchRows(data);
};

高级搜索

searchLocalMessages() 支持在关键词之外限制发送者、消息类型和时间窗口。这些条件可用于按群成员筛选、仅搜索文本消息,或按时间段缩小搜索范围。

const { data } = await openimsdk.searchLocalMessages({
  conversationID,
  keywordList: ['release'],
  senderUserIDList: [senderUserID],
  messageTypeList: [MessageType.TextMessage],
  searchTimePosition,
  searchTimePeriod,
  pageIndex: 1,
  count: 20,
});

如果搜索入口允许搜索图片、文件或自定义消息,把对应的 MessageType 加入 messageTypeList。如果不需要限制消息类型,可以省略该字段,让 SDK 按默认消息类型范围搜索本地缓存。

参数说明

参数类型是否必填说明
conversationIDstring要搜索的会话 ID。
keywordListstring[]关键词列表;单个搜索框通常传入一个清理后的关键词。
keywordListMatchTypenumber多关键词匹配方式,使用 SDK 的数字约定;不需要特殊匹配时可省略。
senderUserIDListstring[]只搜索这些用户发送的消息。
messageTypeListMessageType[]只搜索指定类型的消息,例如文本消息和 @ 文本消息。
searchTimePositionnumber搜索时间窗口的起点时间戳。
searchTimePeriodnumbersearchTimePosition 开始的时间跨度。
pageIndexnumber搜索结果页码。
countnumber每页返回数量。

处理分页结果

返回的 SearchMessageResult 包含 totalCountsearchResultItems。每个结果项对应一个会话,并在 messageList 中携带匹配到的 MessageItem[]

字段类型说明
totalCountnumber当前搜索条件下匹配的消息总数。
searchResultItemsSearchMessageResultItem[](可选)searchLocalMessages() 返回的按会话分组结果。
findResultItemsSearchMessageResultItem[](可选)findMessageList() 按 ID 查找时返回的分组结果。

每个 SearchMessageResultItem 的结构如下:

字段类型说明
conversationIDstring结果所属的会话 ID。
conversationTypeSessionType结果所属的会话类型。
showNamestring会话展示名称快照。
faceURLstring会话展示头像快照。
messageCountnumber当前结果项中的匹配消息数量。
messageListMessageItem[]匹配消息,字段含义见消息概览
import type { SearchMessageResult } from '@openim/wasm-client-sdk';

const toSearchRows = (result: SearchMessageResult) => {
  return {
    totalCount: result.totalCount,
    messages: (result.searchResultItems ?? []).flatMap((item) => {
      return item.messageList.map((message) => ({
        conversationID: item.conversationID,
        clientMsgID: message.clientMsgID,
        senderUserID: message.sendID,
        sentAt: message.sendTime,
        message,
      }));
    }),
  };
};

分页时继续传入相同的 conversationIDkeywordList 和筛选条件,只递增 pageIndex。如果用户修改关键词、成员筛选或时间范围,应把 pageIndex 重置为 1,并清空旧结果,避免不同条件的结果混在一起。

searchLocalMessages() 的 Promise 成功后,使用返回值建立搜索结果快照。查询不会触发消息事件;同一搜索页内按 conversationID + clientMsgID 去重,不要按结果位置保存选中项。

处理搜索结果变化

搜索命中的消息可能在页面打开后被撤回、删除,搜索范围也可能因新同步的消息发生变化。聊天页面应通过接收消息批量删除消息撤回消息中的统一事件处理器更新结果;本页只负责搜索查询和分页,不重复注册消息事件。

跳转到某条搜索结果时,使用结果中的 conversationIDclientMsgID 定位目标会话与消息。需要展示该消息前后的聊天记录时,把搜索命中的 MessageItem 作为起点读取上下文;参数、示例和返回结构见读取消息上下文。不要用 findMessageList() 拼接附近的聊天记录。

需要显示当前时刻的搜索结果时,可以用相同条件重新执行当前页搜索。搜索 Promise、消息事件增量和重新查询是三条独立路径,重新登录后的消息变化由事件同步。

相关页面