消息全文检索

网易云通信 SDK 2.7.0 加入基于 Lucene 的全文检索插件,支持聊天消息的全文检索,目前开放的查询接口适用于两类需求(与微信类似):

检索所有会话,返回所有匹配关键字的会话、每个会话匹配关键字的消息条数。如果会话只有一条消息匹配,那么直接返回该消息内容,返回的会话数量可以指定,也可以一次性列出所有会话。会话间的排序规则,按照每个会话最近一条匹配消息的时间倒序排列。需要支持多个关键字查询,采用空格隔开,关键字之间是 AND 关系。

检索单个会话,返回所有匹配关键字的消息,并高亮显示被击中的关键字,可以跳转到该消息的上下文。

网易云通信 SDK 目前主要针对上述两种需求提供查询服务,只要集成了全文检索插件,SDK 会自动同步所有聊天记录到全文检索索引中。

注意:全文检索插件最低需要 Android 14 (Android 4.0),APP 构建时 targetSdkVersion 强烈建议指向 19 及以上。

在 2.8.0 版本我们已经对依赖的 Lucene 源码做了大幅度的精简,约 1M+ 的大小,对于大的工程,仍然可能造成方法数 65535 的限制,此时可能需要 Multi dex 的支持。

插件集成

有两种方式,选其一即可:

方式一: libs 中引入 nim-lucene-4.4.0.jar。

方式二: 在 build.gradle 中集成:

dependencies {
    ...
    compile 'com.netease.nimlib:lucene:4.4.0'
}

如果构建 APP 时有使用代码混淆,需要在proguard.cfg中加入

-dontwarn org.apache.lucene.**
-keep class org.apache.lucene.** {*;}

接口说明

全文检索接口为:LuceneService,具体 API 如下(下面只列出异步版本,同步版本 API 也提供),针对需求2,强烈建议您使用分页查询接口:

/**
 * 检索所有会话,返回每个会话与检索串匹配的消息数及最近一条匹配的消息记录。(异步函数)
 *
 * @param query 待检索的字符串
 * @param limit 最多返回多少条记录
 * @return InvocationFuture 可以设置回调函数,回调时返回聊天消息全文检索结果集
*/
public InvocationFuture<List<MsgIndexRecord>> searchAllSession(String query, int limit);

/**
 * 检索指定的会话,返回该会话中与检索串匹配的所有消息记录。(异步函数)
 *
 * @param query       待检索的字符串
 * @param sessionType 待检索的会话类型(个人/群组)
 * @param sessionId   待检索的会话ID
 * @return 聊天消息全文检索结果集
*/
public InvocationFuture<List<MsgIndexRecord>> searchSession(String query, SessionTypeEnum sessionType, String sessionId);

/**
 * 指定会话关键字查询(分页返回匹配记录)(异步)
 *
 * @param query       待检索的字符串
 * @param sessionType 待检索的会话类型(个人/群组)
 * @param sessionId   待检索的会话ID
 * @param pageIndex   页码(从第一页开始)
 * @param pageSize    分页大小
 * @return InvocationFuture 可以设置回调函数,回调时返回聊天消息全文检索结果集
*/
public InvocationFuture<List<MsgIndexRecord>> searchSessionPage(String query, SessionTypeEnum sessionType, String sessionId, int pageIndex, int pageSize);

/**
 * 指定会话关键字查询(分页查询:根据锚点,返回下一页匹配记录)(异步)
 *
 * @param query       待检索的字符串
 * @param sessionType 待检索的会话类型(个人/群组)
 * @param sessionId   待检索的会话ID
 * @param anchor      首页传null,下一页传上一页的最后一条记录
 * @param pageSize    分页大小
 * @return InvocationFuture 可以设置回调函数,回调时返回聊天消息全文检索结果集
*/
public InvocationFuture<List<MsgIndexRecord>> searchSessionNextPage(String query, SessionTypeEnum sessionType, String sessionId, MsgIndexRecord anchor, int pageSize);

/**
 * 指定会话关键字查询匹配记录总数(同步)
 *
 * @param query       待检索的字符串
 * @param sessionType 待检索的会话类型(个人/群组)
 * @param sessionId   待检索的会话ID
 * @return 匹配的记录总数
*/
public int searchSessionMatchCount(String query, SessionTypeEnum sessionType, String sessionId);

/**
 * 指定会话关键字查询匹配记录总页数(同步)
 *
 * @param query       待检索的字符串
 * @param sessionType 待检索的会话类型(个人/群组)
 * @param sessionId   待检索的会话ID
 * @param pageSize    分页每页记录数
 * @return 匹配的记录总页数
*/
public int searchSessionPageCount(String query, SessionTypeEnum sessionType, String sessionId, int pageSize);

/**
 * 获取所有缓存数据的大小
 * @return 缓存数据字节数
 */
public long getCacheSize();

/**
 * 删除所有缓存数据
 */
public void clearCache();