全文搜索消息

更新时间: 2025/07/11 11:36:03

网易云信 IM 支持对 客户端本地网易云信服务器 存储的历史消息进行检索,提供精准、高效的搜索体验,帮助用户快速定位至目标信息。

本文介绍如何调用 NIM SDK 的接口实现历史消息的搜索。

支持平台

本文内容适用的开发平台或框架如下表所示,涉及的接口请参考下文 相关接口 章节:

安卓 iOS macOS/Windows Web/uni-app/小程序 Node.js/Electron 鸿蒙 Flutter
✔️️️️️ ✔️️️️️ ✔️️️️️ ✔️️️️️ ✔️️️️️ ✔️️️️️ ✔️️️️️

前提条件

若需要使用 云端 历史消息全文搜索功能,需要提前在 网易云信控制台 开通 全文云端消息检索 功能,具体请参考 配置基础功能/全局功能

云端历史消息的存储时长在不同的套餐包中不同,各套餐包中的限制具体请参考 增值服务

全文搜索云端历史消息

调用 searchCloudMessagesExsearchCloudMessages 方法,对指定会话、对象的云端历史消息进行全局关键字内容搜索。

暂不支持搜索超大群历史消息。

Android
JavaV2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class);

// 创建搜索参数
V2NIMMessageSearchExParams searchParams = V2NIMMessageSearchExParams.V2NIMMessageSearchExParamsBuilder
        // 设置会话ID
        .builder("conversationId")
        // 设置关键词列表
        .withKeywordList(Arrays.asList("关键词1", "关键词2"))
        // 设置关键词匹配类型
        .withKeywordMatchType(V2NIMSearchKeywordMathType.V2NIM_SEARCH_KEYWORD_MATH_TYPE_OR)
        // 设置发送者账号列表
        .withSenderAccountIds(Arrays.asList("发送者ID1", "发送者ID2"))
        // 设置消息类型
        .withMessageTypes(Arrays.asList(V2NIMMessageType.V2NIM_MESSAGE_TYPE_TEXT, V2NIMMessageType.V2NIM_MESSAGE_TYPE_IMAGE))
        // 设置搜索开始时间(毫秒时间戳)
        .withSearchStartTime(System.currentTimeMillis() - 7 * 24 * 60 * 60 * 1000)
        // 设置搜索时间跨度(毫秒)
        .withSearchTimePeriod(7 * 24 * 60 * 60 * 1000)
        // 设置分页大小限制
        .withLimit(20)
        // 设置分页标记(首次搜索传空)
        .withPageToken("")
        // 设置消息子类型
        .withMessageSubtypes(Arrays.asList(1, 2))
        .build();

v2MessageService.searchCloudMessagesEx(searchParams,
        new V2NIMSuccessCallback<V2NIMMessageSearchResult>() {
            @Override
            public void onSuccess(V2NIMMessageSearchResult result) {
                // 获取搜索到的消息列表
                List<V2NIMMessage> messages = result.getMessages();
                // 获取下一页的分页标记
                String nextPageToken = result.getNextPageToken();
                
                // 处理搜索结果...
                for (V2NIMMessage message : messages) {
                    // 处理每条消息
                }
                
                // 如果需要加载下一页
                if (nextPageToken != null && !nextPageToken.isEmpty()) {
                    // 使用nextPageToken继续加载下一页
                }
            }
        },
        new V2NIMFailureCallback() {
            @Override
            public void onFailure(V2NIMError error) {
                // 处理错误
                int code = error.getCode();
                String message = error.getMessage();
                // 处理搜索失败...
            }
        });
iOS
Objective-CV2NIMMessageSearchExParams *params = [[V2NIMMessageSearchExParams alloc] init];
// 按需设置搜索参数
// params.conversationId = conversationId;
// params.keywordList = keywordList;
// params.keywordMatchType = keywordMatchType;
// params.senderAccountIds = senderAccountIds;
// params.messageTypes = messageTypes;
// params.searchStartTime = searchStartTime;
// params.searchTimePeriod = searchTimePeriod;
// params.limit = limit;

[[NIMSDK sharedSDK].v2MessageService searchCloudMessagesEx:params success:^(V2NIMMessageSearchResult * _Nonnull result) {
    // 如果需要翻页查询,从 V2NIMMessageSearchResult 获取 nextPageToken,用于下一页查询
    NSString *pageToken = result.nextPageToken;
    // 处理搜索结果
} failure:^(V2NIMError * _Nonnull error) {

}];
macOS/Windows
C++V2NIMMessageSearchExParams params;
nstd::vector<nstd::string> keywordList;
keywordList.push_back("keyword");
params.keywordList = keywordList;
params.messageLimit = 20;
messageService.searchCloudMessagesEx(
    params,
    [](nstd::vector<V2NIMMessage> messages) {
        for (auto&& message : messages) {
            // do something
        }
    },
    [](V2NIMError error) {
        // search cloud messages failed, handle error
    });
Web/uni-app/小程序
TypeScripttry {
const res: V2NIMMessageSearchResult = await nim.V2NIMMessageService.searchCloudMessagesEx({
    conversationId: 'cjl|1|cjl1',
    keywordList: ['周', '杰', '伦'],
    keywordMatchType: undefined,
    senderAccountIds: ['cjl1', 'cjl2'],
    messageTypes: [],
    searchStartTime: 1234567890, // timestamp
    searchTimePeriod: 7 * 24 * 60 * 60 * 1000, // 7 day
    limit: 1,
    pageToken: undefined
});
// todo: Success
} catch (err) {
// todo: error
}
Node.js/Electron
TypeScriptconst result = await v2.messageService.searchCloudMessagesEx({
   keywordList: ['keyword1', 'keyword2'],
   messageTypes: [0, 1, 2],
   messageSubtypes: [1, 2],
   limit: 10
})
HarmonyOS
TypeScriptconst params: V2NIMMessageSearchExParams = {
  conversationId: 'cjl|1|cjl1',
  keywordList: ['周', '杰', '伦'],
  keywordMatchType: undefined,
  senderAccountIds: ['cjl1', 'cjl2'],
  messageTypes: [],
  searchStartTime: 1234567890, // timestamp
  searchTimePeriod: 7 * 24 * 60 * 60 * 1000, // 7 day
  limit: 1,
  pageToken: undefined
}
const messageResult: V2NIMMessageSearchResult = await nim.messageService.searchCloudMessagesEx(params)
Flutter
Dart// 创建搜索参数
final params = NIMMessageSearchExParams(
  conversationId: 'cjl|1|cjl1',
  keywordList: ['周', '杰', '伦'],
);

// 执行云端消息搜索
NimCore.instance.messageService
    .searchCloudMessagesEx(params)
    .then((result) {
  if (result.isSuccess && result.data != null) {
    // 搜索成功
    final searchResult = result.data!;
    print('searchCloudMessages result: ${searchResult.toJson()}');
    print('count: ${searchResult.count}');
    print('hasMore: ${searchResult.hasMore}');
    print('nextPageToken: ${searchResult.nextPageToken}');

    // 处理搜索到的消息
    searchResult.items?.forEach((e) {
      //会话 id
      print('conversationId: ${e.conversationId}');
      //单个会话的返回数量
      print('count: ${e.count}');
      e.messages?.forEach((message) {
        print('message: ${message.toJson()}');
      });
    });
  } else {
    // 搜索失败
    print('searchCloudMessages failed: ${result.code}, ${result.errorDetails}');
  }
});

全文搜索本地历史消息

调用 searchLocalMessages 方法,可以对指定会话、对象的本地历史消息进行全局关键字内容搜索。

Android、iOS 以及鸿蒙平台下,若需要使用本地搜索功能,需要在集成 SDK 时单独引入 检索库。具体请参考集成 SDK 文档(Android | iOS | 鸿蒙)。


安卓
Java//        String conversationId;
//        List<String> keywordList;
//        V2NIMSearchKeywordMathType keywordMatchType;
//        List<String> senderAccountIds;
//        List<V2NIMMessageType> messageTypes;
//        long searchStartTime;
//        long searchTimePeriod;
//        int limit;
        V2NIMMessageSearchExParams params = V2NIMMessageSearchExParams.V2NIMMessageSearchExParamsBuilder.builder()
        // 按需设置搜索参数
//        .withConversationId(conversationId)
//        .withKeywordList(keywordList)
//        .withMessageTypes(keywordMatchType)
//        .withSenderAccountIds(senderAccountIds)
//        .withMessageTypes(messageTypes)
//        .withSearchStartTime(searchStartTime)
//        .withSearchTimePeriod(searchTimePeriod)
//        .withLimit(limit)
        .build();

        NIMClient.getService(V2NIMMessageService.class).searchLocalMessages(params, new V2NIMSuccessCallback<V2NIMMessageSearchResult>() {
            @Override
            public void onSuccess(V2NIMMessageSearchResult v2NIMMessageSearchResult) {
                // 如果需要翻页查询,从 V2NIMMessageSearchResult 获取 nextPageToken,用于下一页查询
                String pageToken = v2NIMMessageSearchResult.getNextPageToken();
            }
        }, new V2NIMFailureCallback() {
            @Override
            public void onFailure(V2NIMError error) {

            }
        });
iOS
Objective-CV2NIMMessageSearchExParams *params = [[V2NIMMessageSearchExParams alloc] init];
// 按需设置搜索参数
// params.conversationId = conversationId;
// params.keywordList = keywordList;
// params.keywordMatchType = keywordMatchType;
// params.senderAccountIds = senderAccountIds;
// params.messageTypes = messageTypes;
// params.searchStartTime = searchStartTime;
// params.searchTimePeriod = searchTimePeriod;
// params.limit = limit;

[[NIMSDK sharedSDK].v2MessageService searchLocalMessages:params success:^(V2NIMMessageSearchResult * _Nonnull result) {
        // 如果需要翻页查询,从 V2NIMMessageSearchResult 获取 nextPageToken,用于下一页查询
        NSString *pageToken = result.nextPageToken;
        // 处理搜索结果
    } failure:^(V2NIMError * _Nonnull error) {

    }];
macOS/Windows
C++V2NIMMessageSearchExParams params;
nstd::vector<nstd::string> keyword_list;
keywordList.push_back("keyword");
params.keywordList = keyword_list;
params.limit = 20;
messageService.searchLocalMessages(
    params,
    [](const V2NIMMessageSearchResult& result) {
        for (auto&& message : result.items) {
            // do something
        }
    },
    [](const V2NIMError& error) {
        // search local messages failed, handle error
    });
Web/uni-app/小程序

因平台属性,暂不支持。

Node.js/Electron
TypeScriptconst result = await v2.messageService.searchLocalMessages({
   keywordList: ['keyword1', 'keyword2'],
})
鸿蒙
TypeScriptconst params: V2NIMMessageSearchExParams = {
  conversationId: 'cjl|1|cjl1',
  keywordList: ['周', '杰', '伦'],
  keywordMatchType: undefined,
  senderAccountIds: ['cjl1', 'cjl2'],
  messageTypes: [],
  searchStartTime: 1234567890, // timestamp
  searchTimePeriod: 7 * 24 * 60 * 60 * 1000, // 7 day
  limit: 1,
  pageToken: undefined
}
const messageResult: V2NIMMessageSearchResult = await nim.messageService.searchLocalMessages(params)
Flutter
Dart// 创建搜索参数
final params = NIMMessageSearchExParams(
  conversationId: 'cjl|1|cjl1',
  keywordList: ['周', '杰', '伦'],
);

// 执行本地消息搜索
NimCore.instance.messageService
    .searchLocalMessages(params)
    .then((result) {
  if (result.isSuccess && result.data != null) {
    // 搜索成功
    final searchResult = result.data!;
    print('searchLocalMessages result: ${searchResult.toJson()}');
    print('count: ${searchResult.count}');
    print('hasMore: ${searchResult.hasMore}');
    print('nextPageToken: ${searchResult.nextPageToken}');

    // 处理搜索到的消息
    searchResult.items?.forEach((e) {
      //会话 id
      print('conversationId: ${e.conversationId}');
      //单个会话的返回数量
      print('count: ${e.count}');
      e.messages?.forEach((message) {
        print('message: ${message.toJson()}');
      });
    });
  } else {
    // 搜索失败
    print('searchLocalMessages failed: ${result.code}, ${result.errorDetails}');
  }
});

相关接口

安卓/iOS/macOS/Windows/Web/uni-app/小程序/Node.js/Electron/鸿蒙
API 说明
searchCloudMessages 全文搜索云端历史消息
searchCloudMessagesEx 全文搜索云端历史消息
注: 较 searchCloudMessages 方法,入参支持传入多个 keyword
searchLocalMessages 全文搜索本地历史消息(除 Web 端)
Flutter
API 说明
searchCloudMessages 全文搜索云端历史消息
searchCloudMessagesEx 全文搜索云端历史消息
注: 较 searchCloudMessages 方法,入参支持传入多个 keyword
searchLocalMessages 全文搜索本地历史消息
此文档是否对你有帮助?
有帮助
去反馈
  • 支持平台
  • 前提条件
  • 全文搜索云端历史消息
  • 全文搜索本地历史消息
  • 相关接口