Skip to main content

Message Search

You can use the IMLib SDK's search interfaces to retrieve message lists that match specified criteria such as keywords or message types within conversations, with support for time-based searches. You can also search for message lists in specific conversations based on user userId.

To enable keyword search for messages, the MessageContent must implement the getSearchableWord method:

  • Built-in message types including text messages (TextMessage), file messages (FileMessage), and rich content messages (RichContentMessage) have implemented the MessageContent#getSearchableWord method by default.
  • Custom message types can also support keyword search by implementing this method. For details, see Custom Message Types.
  1. Search all locally stored conversations by keyword to obtain a list of conversations containing the keyword.
  2. Using the conversation list returned from the search, call the single conversation search method to find messages that match the criteria.

Search for Matching Conversations​

You can use searchConversations to search locally stored conversations that match the specified keyword and message type criteria, returning a list of SearchConversationResult. Starting from version 5.20.0, ultra group conversation information is supported. To enable ultra group functionality, please submit a [ticket].

Interface​

RongIMClient.getInstance().searchConversations(keyword, conversationTypes, messageTypeObjectNames,callback);

Parameter Description​

ParameterTypeDescription
keywordStringThe keyword to search for.
conversationTypesConversation.ConversationType[]A list of conversation types, including ConversationType.
objectNamesString[]A list of message types. By default, only built-in types are supported: RC:TxtMsg (text messages), RC:FileMsg (file messages), and RC:ImgTextMsg (rich content messages).
callbackRongIMClient.ResultCallback<List<SearchConversationResult>>Callback. The search result is a list of SearchConversationResult.

Example Code​

String keyword = "Search keyword";

Conversation.ConversationTypes[] conversationTypes = {ConversationTypes.PRIVATE, ConversationTypes.GROUP};
String[] messageTypeObjectNames = {"RC:TxtMsg"};

RongIMClient.getInstance().searchConversations(keyword, conversationTypes, messageTypeObjectNames,
new RongIMClient.ResultCallback<List<SearchConversationResult>>() {

@Override
public void onSuccess(List<SearchConversationResult> searchConversationResults) {

}

@Override
public void onError(RongIMClient.ErrorCode errorCode) {

}
});

Search Within a Specific Conversation​

You can use different method strategies to search for messages that match specified criteria within a single conversation.

Search Messages by Keyword​

You can search for messages containing a specified keyword within a local database for a given conversation, supporting searches for historical messages before a specified timestamp. The callback returns a list of messages matching the search criteria.

Interface​

RongIMClient.getInstance().searchMessages(conversationType, targetId, keyword, count, beginTime,callback);

Parameter Description​

ParameterTypeDescription
conversationTypeConversationTypeThe conversation type.
targetIdStringThe conversation ID.
keywordStringThe keyword to search for.
countintThe number of results per page. It is recommended to limit this to 100 messages. Passing 0 returns all matching messages.
beginTimelongThe starting timestamp for the search. Passing 0 starts the search from the latest message. A non-zero value searches backward from this timestamp.
callbackRongIMClient.ResultCallback<List<Message>>Callback. The search result is a list of Message.

Example Code​

ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "Conversation ID";
String keyword = "Search keyword";
int count = 20;
long beginTime = 122323344;

RongIMClient.getInstance().searchMessages(conversationType, targetId, keyword, count, beginTime,
new RongIMClient.ResultCallback<List<Message>>() {

@Override
public void onSuccess(List<Message> messages) {

}

@Override
public void onError(RongIMClient.ErrorCode errorCode) {

}
});

Search Messages by Keyword Within a Specified Time Range​

You can search for local messages within a specified time range that match the keyword in a given conversation. The callback returns a list of messages matching the search criteria.

Interface​

RongCoreClient.getInstance().searchMessages(conversationType, targetId, keyword, startTime, endTime, offset, limit,callback);

Parameter Description​

The limit parameter controls the number of search results returned, with a valid range of [1-100]. Values exceeding 100 default to the maximum of 100.

ParameterTypeDescription
conversationTypeConversationTypeThe conversation type.
targetIdStringThe conversation ID.
keywordStringThe keyword to search for.
startTimelongThe start timestamp.
endTimelongThe end timestamp.
offsetintThe offset.
limitintThe number of search results to return. limit must be greater than 0, with a maximum of 100. Values exceeding 100 default to 100.
callbackIRongCallback.ResultCallback<List<Message>>Callback. The search result is a list of Message.

Example Code​

ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "Conversation ID";
String keyword = "123";
long startTime = 0;
long endTime = 1585815113;
int offset = 0;
int limit = 80;

RongCoreClient.getInstance().searchMessages(conversationType, targetId, keyword, startTime, endTime, offset, limit,
new IRongCoreCallback.ResultCallback<List<Message>>(){

@Override
public void onSuccess(List<Messag> messages) {

}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {

}
});

Search Messages by User ID​

You can search for messages sent by a specified user userId within a given conversation, supporting searches for local historical messages before a specified timestamp. The callback returns a list of messages matching the search criteria.

Interface​

RongIMClient.getInstance().searchMessagesByUser(conversationType, targetId, userId, count, beginTime,callback);

Parameter Description​

ParameterTypeDescription
conversationTypeConversationTypeThe conversation type.
targetIdStringThe conversation ID.
userIdStringThe user ID to query.
countintThe number of search results to return. The maximum is 100. Values exceeding 100 default to 100.
beginTimelongThe starting timestamp for the search. Passing 0 starts the search from the latest message. A non-zero value searches backward from this timestamp.
callbackIRongCallback.ResultCallback<List<Message>>Callback. The search result is a list of Message.

Example Code​

ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "Conversation ID";
String userId = "User ID to query";
int count = 20;
long beginTime = 1585815113;

RongIMClient.getInstance().searchMessagesByUser(conversationType, targetId, userId, count, beginTime,
new RongIMClient.ResultCallback<Message>() {

@Override
public void onSuccess(List<Message> messages) {

}

@Override
public void onError(RongIMClient.ErrorCode errorCode) {

}
});

Custom Search​

tip

Supported since RongCoreClient version 5.22.0.

You can customize search conditions through the SearchMessageParams object and pass it to the searchMessagesWithParams() interface for message searching.

Parameter Description​

ParameterTypeDescription
paramsSearchMessageParamsParameter object
callbackIRongCoreCallback.ExResultCallbackResult callback
  • callback parameter description:
    • messages: List of returned search results.
    • matchCount: Total number of matches for the search conditions.
    • code: Error code.

Parameter Object Description​

The parameter object supports flexible combination of search conditions, including keywords, quantity, sorting, offset, time range, conversation filtering, message filtering, etc.

ParameterTypeDescription
keywordStringSearch keyword
limitIntNumber of search results
offsetIntSearch offset
orderOrderSorting method
timeRangeTimeRangeSearch time range (optional)
conversationFilterConversationFilterConversation filter (optional)
messageFilterMessageFilterMessage filter (optional)
  • Detailed description of timeRange:
// Timeline query:
// 0--------startTime--------------------endTime---------Now()
// Ascending order (order == RCOrderAscending) query:
// 0--------startTime|---->--------------endTime---------Now()
// Descending order (order == RCOrderDescending) query:
// 0--------startTime--------------<----|endTime---------Now()
// Descending order with offset query:
// 0--------startTime----------<----|----endTime---------Now()

Example Code​

SearchMessageParams params = new SearchMessageParams();
params.setKeyword("123");
params.setLimit(10);
params.setOffset(0);
params.setOrder(SearchMessageParams.Order.DESC);

ConversationFilter conversationFilter = new ConversationFilter();
List<Conversation.ConversationType> conversationTypes = new ArrayList<>();
conversationTypes.add(Conversation.ConversationType.PRIVATE);
conversationTypes.add(Conversation.ConversationType.GROUP);

List<String> targetIds = new ArrayList<>();
targetIds.add("targetId2");
targetIds.add("targetId2");

conversationFilter.setConversationTypes(conversationTypes);
conversationFilter.setTargetIds(targetIds);
params.setConversationFilter(conversationFilter);

TimeRange timeRange = new TimeRange();
timeRange.setStartTime(0);
params.setTimeRange(timeRange);

RongCoreClient.getInstance().searchMessagesWithParams(params, new IRongCoreCallback.ExResultCallback<List<Message>, Integer>() {
@Override
public void onSuccess(List<Message> messages, Integer matchCount) {
// Business processing...
}
@Override
public void onError(IRongCoreEnum.CoreErrorCode error) {
// Error handling...
}
});