Search messages
The Nexconn SDK supports searching messages by keyword, message type, sender, and time range.
Search within a channel
Use createSearchMessagesQuery() to create a paginated search query.
- Kotlin
- Java
kotlin
val channel = DirectChannel("userId")
val params = SearchMessagesQueryParams(
keyword = "hello",
channelTypes = listOf(channel.channelType),
channelIds = listOf(channel.channelId),
senderUserIds = listOf("user_001"),
messageTypes = listOf(MessageType.TEXT, MessageType.IMAGE),
startTime = startTimestamp,
endTime = endTimestamp,
pageSize = 20,
isAscending = false // false: newest first, true: oldest first
)
val query = BaseChannel.createSearchMessagesQuery(params)
query.loadNextPage { pageResult, error ->
if (error == null && pageResult != null) {
val messages = pageResult.data
Log.d("Search", "Found ${messages.size} messages")
if (messages.size >= params.pageSize) {
// Load more results
}
}
}
Java
DirectChannel channel = new DirectChannel("userId");
SearchMessagesQueryParams params = new SearchMessagesQueryParams(
"hello",
startTimestamp,
endTimestamp,
Collections.singletonList(channel.getChannelType()),
Collections.singletonList(channel.getChannelId()),
null,
Collections.singletonList("user_001"),
Arrays.asList(MessageType.TEXT, MessageType.IMAGE),
20,
false
);
SearchMessagesQuery query = BaseChannel.createSearchMessagesQuery(params);
query.loadNextPage((pageResult, error) -> {
if (error == null && pageResult != null) {
List<Message> messages = pageResult.getData();
Log.d("Search", "Found " + messages.size() + " messages");
}
});
Parameters
SearchMessagesQueryParams
| Parameter | Type | Description |
|---|---|---|
keyword | String | The search keyword (required). |
startTime | Long | Start timestamp in milliseconds. Default: 0 (no limit). |
endTime | Long | End timestamp in milliseconds. Default: 0 (no limit). |
channelTypes | List<ChannelType>? | Filter by channel types. null searches all types. |
channelIds | List<String>? | Filter by channel IDs. null searches all channels. |
subChannelIds | List<String>? | Sub-channel ID filter (community channels). null searches all sub-channels. |
senderUserIds | List<String>? | Filter by sender IDs. null means no sender filter. |
messageTypes | List<String>? | Filter by message types. null means no type filter. |
pageSize | Int | Results per page. Default: 20. Range: (0, 100]. |
isAscending | Boolean | Sort order. Default: false (newest first). |
Search across all channels
Use the static BaseChannel.createSearchMessagesQuery() to search globally.
- Kotlin
- Java
kotlin
val params = SearchMessagesQueryParams(
keyword = "hello",
channelTypes = listOf(ChannelType.DIRECT, ChannelType.GROUP),
pageSize = 20
)
val query = BaseChannel.createSearchMessagesQuery(params)
query.loadNextPage { pageResult, error ->
if (error == null && pageResult != null) {
val messages = pageResult.data
Log.d("Search", "Global search found ${messages.size} messages")
}
}
Java
SearchMessagesQueryParams params = new SearchMessagesQueryParams(
"hello",
0L,
0L,
Arrays.asList(ChannelType.DIRECT, ChannelType.GROUP),
null,
null,
null,
null,
20,
false
);
SearchMessagesQuery query = BaseChannel.createSearchMessagesQuery(params);
query.loadNextPage((pageResult, error) -> {
if (error == null && pageResult != null) {
List<Message> messages = pageResult.getData();
Log.d("Search", "Global search found " + messages.size() + " messages");
}
});
Important notes
- Searchable message types: text, file, and rich text messages.
- Custom messages must implement
MessageContent.getSearchableWord()to be searchable. - Search operates on the local database only.
- Use pagination to avoid loading too many results at once.