当前位置: 首页 > article >正文

uniapp 集成腾讯云 IM 消息搜索功能

UniApp 集成腾讯云 IM 消息搜索功能实战指南

一、功能实现原理

腾讯云 IM 通过 消息漫游 + 服务端搜索接口 实现消息检索,核心机制如下:

  1. 数据存储:消息默认存储7天(可扩展至30天)
  2. 索引构建:基于消息内容自动建立倒排索引
  3. 检索接口:提供关键词匹配、时间范围、发送者等多维度查询
  4. 结果排序:按消息时间戳倒序排列

二、核心实现步骤

1. 初始化搜索模块

// services/search.js
import { initIM } from './im'const tim = initIM()// 配置搜索参数
const SEARCH_CONFIG = {MAX_KEYWORD_LENGTH: 30,    // 最大关键词长度DEFAULT_PAGE_SIZE: 20,     // 默认分页大小MAX_HISTORY_DAYS: 7        // 最大历史查询天数
}// 创建搜索实例
export function createSearchEngine(options) {return {conversationID: options.conversationID,keyword: '',timeRange: {startTime: Date.now() - 7 * 24 * 3600 * 1000,endTime: Date.now()},page: 1,pageSize: SEARCH_CONFIG.DEFAULT_PAGE_SIZE}
}

2. 执行消息搜索

export async function executeSearch(engine) {const tim = initIM()try {const res = await tim.getMessageList({conversationID: engine.conversationID,keyword: engine.keyword,nextSeq: engine.page === 1 ? 0 : engine.nextSeq,count: engine.pageSize})return {messages: res.data.messageList || [],hasNext: res.data.isCompleted === 0,nextSeq: res.data.nextSeq}} catch (error) {console.error('搜索失败:', error)throw new Error('消息搜索失败,请检查网络')}
}

3. 搜索结果渲染

<template><view class="search-results"><scroll-view scroll-y@scrolltolower="loadMore"><view v-for="(msg, index) in results":key="msg.clientMsgID"class="search-item"><view class="highlight-text">{{ msg.payload.text.replace(new RegExp(engine.keyword, 'gi'), (match) => `<mark>${match}</mark>`) }}</view><view class="meta-info">{{ formatTime(msg.time) }} - {{ msg.from }}</view></view><view v-if="loading" class="loading-tip">加载中...</view><view v-if="!hasNext" class="end-tip">没有更多结果了</view></scroll-view></view>
</template><script>
export default {data() {return {engine: createSearchEngine({conversationID: 'current_conv_id'}),results: [],loading: false,hasNext: true}},methods: {async loadMore() {if (this.loading || !this.hasNext) returnthis.loading = trueconst res = await executeSearch(this.engine)this.results = [...this.results, ...res.messages]this.hasNext = res.hasNextthis.loading = false}}
}
</script>

三、关键问题处理

1. 性能优化策略

// 防抖搜索(输入框场景)
let searchDebounce = nullexport function debouncedSearch(engine, callback) {clearTimeout(searchDebounce)searchDebounce = setTimeout(async () => {engine.page = 1const res = await executeSearch(engine)callback(res.messages, res.hasNext)}, 300) // 300ms防抖
}

2. 复杂查询构建

// 高级查询构造器
export function buildAdvancedQuery(options) {const tim = initIM()return {conversationID: options.convID,keyword: options.keyword || '',filter: {fromAccount: options.from || [],timeRange: options.timeRange || {startTime: Date.now() - 7 * 24 * 3600 * 1000,endTime: Date.now()}},pageIndex: options.page || 1,pageSize: options.pageSize || 20}
}// 使用示例
const query = buildAdvancedQuery({convID: 'group123',from: 'userA',timeRange: {startTime: new Date(2023, 0, 1).getTime(),endTime: new Date(2023, 1, 1).getTime()}
})

3. 敏感词过滤

// 集成腾讯云内容安全
export async function checkSensitiveWords(text) {const res = await axios.post('https://cms.tencentcloudapi.com/', {Action: 'TextModeration',Content: text,// 其他必要参数...})return res.data.Suggestion === 'Pass'
}// 搜索前校验
export async function validateSearchKeyword(keyword) {if (await checkSensitiveWords(keyword)) {return keyword}throw new Error('包含敏感词汇')
}

四、高级功能扩展

1. 语音消息转文本搜索

// 集成语音识别服务
export async function transcribeAudioMessage(fileKey) {const res = await axios.post('https://asr.tencentcloudapi.com/', {Action: 'SentenceRecognition',ProjectId: 0,SubServiceType: 2,EngSerViceType: '16k_zh',SourceType: 1,Url: fileKey})return res.data.Result
}// 修改搜索逻辑
async function searchAudioMessages(engine) {const { messages } = await executeSearch(engine)const transcriptions = await Promise.all(messages.filter(msg => msg.type === 'TIMAudioElem').map(async msg => ({...msg,transcription: await transcribeAudioMessage(msg.payload.fileKey)})))return transcriptions
}

2. 搜索结果聚合

// 按发送者聚合结果
function groupBySender(messages) {return messages.reduce((acc, msg) => {if (!acc[msg.from]) acc[msg.from] = []acc[msg.from].push(msg)return acc}, {})
}// 按日期聚合
function groupByDate(messages) {return messages.reduce((acc, msg) => {const dateKey = dayjs(msg.time).format('YYYY-MM-DD')if (!acc[dateKey]) acc[dateKey] = []acc[dateKey].push(msg)return acc}, {})
}

3. 搜索历史管理

// 本地存储搜索历史
export function saveSearchHistory(keyword) {const history = uni.getStorageSync('search_history') || []const newHistory = [...new Set([keyword, ...history.slice(0, 49)])]uni.setStorageSync('search_history', newHistory)
}// 清除历史记录
export function clearSearchHistory() {uni.removeStorageSync('search_history')
}

五、常见问题排查

  1. Q: 搜索结果不完整
    A: 检查时间范围设置,确保endTime > startTime,且在有效期内(默认7天)

  2. Q: 特殊字符搜索异常
    A: 对关键词进行URL编码处理:encodeURIComponent(keyword)

  3. Q: 群聊消息搜索失败
    A: 确认群类型是否为Private(私有群),Public群需群主操作

  4. Q: 消息内容高亮失效
    A: 确保使用v-html指令渲染,并做好XSS防护:v-html="highlightedText"

六、性能优化建议

  1. 对超过1000条的会话禁用全局搜索
  2. 实现搜索结果虚拟滚动(仅渲染可视区域)
  3. 对高频关键词建立本地缓存(使用uni.setStorage
  4. 使用Web Worker处理复杂文本分析
  5. 限制最大并发搜索数为3

相关文章:

uniapp 集成腾讯云 IM 消息搜索功能

UniApp 集成腾讯云 IM 消息搜索功能实战指南 一、功能实现原理 腾讯云 IM 通过 消息漫游 服务端搜索接口 实现消息检索&#xff0c;核心机制如下&#xff1a; 数据存储&#xff1a;消息默认存储7天&#xff08;可扩展至30天&#xff09;索引构建&#xff1a;基于消息内容自…...

robot_lab——rsl_rl的train.py整体逻辑

文章目录 Go2机器人训练流程详细分析概述1. 训练启动流程1.1 命令行参数解析RSL-RL相关参数组Isaac Sim应用启动参数组 1.2 RL配置1.3 Isaac Sim启动 2. 环境配置加载2.1 Hydra配置系统 3. 环境创建与初始化3.1 Gym环境创建3.2 Manager系统初始化3.2.1 ObservationManager3.2.2…...

AI推荐系统演进史:从协同过滤到图神经网络与强化学习的融合

每一次滑动手机屏幕&#xff0c;电商平台向你推荐心仪商品的背后&#xff0c;是超过百亿量级的浮点运算。从早期的“猜你喜欢”到如今的“比你更懂你”&#xff0c;商品推荐引擎已悄然完成从简单规则到深度智能的技术跃迁。 一、协同过滤&#xff1a;推荐系统的基石与演进 协同…...

Java-IO流之压缩与解压缩流详解

Java-IO流之压缩与解压缩流详解 一、压缩与解压缩概述1.1 基本概念1.2 Java中的压缩类库1.3 核心类与接口 二、ZIP压缩与解压缩2.1 ZIP格式简介2.2 使用ZipOutputStream创建ZIP文件2.3 使用ZipInputStream读取ZIP文件 三、GZIP压缩与解压缩3.1 GZIP格式简介3.2 使用GZIPOutputS…...

.NET 原生驾驭 AI 新基建实战系列(三):Chroma ── 轻松构建智能应用的向量数据库

在人工智能AI和机器学习ML迅猛发展的今天&#xff0c;数据的存储和检索需求发生了巨大变化。传统的数据库擅长处理结构化数据&#xff0c;但在面对高维向量数据时往往力不从心。向量数据库作为一种新兴技术&#xff0c;专为AI应用设计&#xff0c;能够高效地存储和查询高维向量…...

有声书画本

有声书画本服务标准 有声喵连接 一、基础服务&#xff08;5r/w字&#xff09; 核心&#xff1a; 基础删&#xff08;快捷键AltD&#xff09;调&#xff0c;优化播讲流畅度 执行&#xff1a; 删除冗余旁白 删除角色动作/心理的重复描述&#xff08;例&#xff1a;小明冷笑道…...

StarRocks与Apache Iceberg:构建高效湖仓一体的实时分析平台

## 引言&#xff1a;数据湖的挑战与演进 在数据驱动的时代&#xff0c;企业数据湖需要同时满足海量存储、高性能查询、多引擎协作和实时更新等复杂需求。传统基于 Hive 的数据湖方案面临元数据管理低效、缺乏 ACID 事务支持、查询性能瓶颈等问题。在此背景下&#xff0c;**Sta…...

WebRTC 与 WebSocket 的关联关系

WebRTC&#xff08;Web Real-Time Communication&#xff09;与 WebSocket 作为重要技术&#xff0c;被广泛应用于各类实时交互场景。虽然它们在功能和特性上存在明显差异&#xff0c;但在实际应用中也有着紧密的关联&#xff0c;共同为用户提供流畅的实时交互体验。 一、WebR…...

8.RV1126-OPENCV 视频中添加LOGO

一.视频中添加 LOGO 图像大体流程 首先初始化VI,VENC模块并使能&#xff0c;然后创建两个线程&#xff1a;1.把LOGO灰度化&#xff0c;然后获取VI原始数据&#xff0c;其次把VI数据Mat化并创建一个感兴趣区域&#xff0c;最后把LOGO放感兴趣区域里并把数据发送给VENC。2.专门获…...

API管理是什么?API自动化测试怎么搭建?

目录 一、API管理是什么 &#xff08;一&#xff09;API管理的定义 &#xff08;二&#xff09;API管理的重要性 二、API管理的主要内容 &#xff08;一&#xff09;API设计 1. 遵循标准规范 2. 考虑可扩展性 3. 保证接口的易用性 &#xff08;二&#xff09;API开发 …...

Next.js+prisma开发一

1.初始化Next.js项目 #按版本安装 npx create-next-app13.4.5 如果最新版本 执行&#xff1a;npx create-next-applatest2. 安装Prima和客户端 npm install prisma --save-dev npm install prisma/client3.初始化Prisma&#xff0c;以SQLit举例 # 初始化 Prisma 并配置 SQLi…...

GIC v3 v4 虚拟化架构

ARMV8-A架构中包含了对虚拟化的支持。为了与架构保持匹配&#xff0c;GICV3也对虚拟化做了支持。新增了以下特性&#xff1a; 对CPU interface的硬件虚拟化虚拟中断maintenance 中断&#xff1a;用于通知监管程序&#xff08;例如hypervisor&#xff09;一些特定的虚拟机事件 …...

2025远离Deno和Fresh

原创作者&#xff1a;庄晓立&#xff08;LIIGO&#xff09; 原创时间&#xff1a;2025年6月6日 原创链接&#xff1a;https://blog.csdn.net/liigo/article/details/148479884 版权所有&#xff0c;转载请注明出处&#xff01; 相识 Deno&#xff0c;是Nodejs原开发者Ryan Da…...

相机camera开发之差异对比核查一:测试机和对比机的硬件配置差异对比

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、背景 二、:Camera硬件配置差异 2.1:硬件配置差异核查项 2.2 :核查方式 2.3 :高通camx平台核查 2.4 :MTK平台核查...

Flask+LayUI开发手记(七):头像的上传及突破static目录限制

看了看&#xff0c;上篇开发手记是去年8月份写的&#xff0c;到现在差2个月整一年了。停更这么长时间&#xff0c;第一个原因是中间帮朋友忙一个活&#xff0c;那个技术架构是用springboot的&#xff0c;虽然前端也用layUI&#xff0c;但和Flask-python完全不搭界&#xff0c;所…...

uv管理spaCy语言模型

本文记录如何在使用uv管理python项目dependencies时&#xff0c;把spaCy的模型也纳入其中. spaCy 一、spaCy简介 spaCy是一个开源的自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它主要用于处理文本数据。它支持多种语言&#xff0c;包括英语、中文等。它是由Expl…...

MiniExcel模板填充Excel导出

目录 1.官方文档 2. 把要导出的数据new一个匿名对象 3.导出 4.注意事项 5.模板制作 6.结果 1.官方文档 https://gitee.com/dotnetchina/MiniExcel/#%E6%A8%A1%E6%9D%BF%E5%A1%AB%E5%85%85-excel // 1. By POCO var value new {Name "Jack",CreateDate n…...

NoSQL之redis哨兵

一、哨兵的核心功能 监控&#xff08;Monitoring&#xff09; 持续检查主节点和从节点的运行状态&#xff08;是否存活、延迟等&#xff09;。 自动故障转移&#xff08;Automatic Failover&#xff09; 当主节点不可用时&#xff0c;自动选举一个从节点升级为主节点。 更新…...

MCP协议重构AI Agent生态:万能插槽如何终结工具孤岛?

前言 在人工智能技术快速发展的2025年&#xff0c;MCP(Model Context Protocol&#xff0c;模型上下文协议)正逐渐成为AI Agent生态系统的关键基础设施。这一由Anthropic主导的开放协议&#xff0c;旨在解决AI模型与外部工具和数据源之间的连接难题&#xff0c;被业界形象地称…...

阿里云事件总线 EventBridge 正式商业化,构建智能化时代的企业级云上事件枢纽

作者&#xff1a;肯梦、稚柳 产品演进历程&#xff1a;在技术浪潮中的成长之路 早在 2018 年&#xff0c;Gartner 评估报告便将事件驱动模型&#xff08;Event-Driven Model&#xff09;列为十大战略技术趋势之一&#xff0c;指出事件驱动架构&#xff08;EDA&#xff0c;Eve…...

CentOS8.3+Kubernetes1.32.5+Docker28.2.2高可用集群二进制部署

一、准备工作 1.1 主机列表 HostnameHost IPDocker IPRolek8s31.vm.com192.168.26.3110.26.31.1/24master&worker、etcd、dockerk8s32.vm.com192.168.26.3210.26.32.1/24master&worker、etcd、dockerk8s33.vm.com192.168.26.3310.26.33.1/24master&worker、etcd、…...

学习日记-day23-6.6

完成目标&#xff1a; 知识点&#xff1a; 1.IO流_转换流使用 ## 转换流_InputStreamReader1.字节流读取中文在编码一致的情况,也不要边读边看,因为如果字节读不准,读不全,输出的内容有可能会出现乱码 2.所以,我们学了字符流,字符流读取文本文档中的内容如果编码一致,就不会出…...

Pytorch安装后 如何快速查看经典的网络模型.py文件(例如Alexnet,VGG)(已解决)

当你用conda 安装好虚拟环境后&#xff0c; 找到你的Anaconda 的安装位置。 我的在D盘下&#xff1b; 然后 从Anaconda3文件夹开始&#xff1a;一级一级的查看&#xff0c;一直到models Anaconda3\envs\openmmlab\Lib\site-packages\torchvision\models 在models下面&#x…...

《ERP原理与应用教程》第3版习题和答案

ERP原理与应用教程是一门系统介绍企业资源计划(Enterprise Resource Planning, ERP)系统核心理论、技术架构及实施应用的综合性课程。它主要面向管理类、信息类、工程类等专业学生及企业管理者,旨在培养对现代企业信息化管理的理解与实践能力。以下是该课程的详细解析: 一…...

JavaScript中的正则表达式:文本处理的瑞士军刀

JavaScript中的正则表达式&#xff1a;文本处理的瑞士军刀 在编程世界中&#xff0c;正则表达式&#xff08;Regular Expression&#xff0c;简称RegExp&#xff09;被誉为“文本处理的瑞士军刀”。它能够高效地完成字符串匹配、替换、提取和验证等任务。无论是前端开发中的表…...

vue对axios的封装和使用

在 Vue 项目中&#xff0c;使用 axios 进行 HTTP 请求是非常常见的做法。为了提高代码的可维护性、统一错误处理和请求拦截/响应拦截逻辑&#xff0c;对axios进行封装使用。 一、基础封装&#xff08;适用于 Vue 2 / Vue 3&#xff09; 1. 安装 axios npm install axios2. 创…...

软考 系统架构设计师系列知识点之杂项集萃(82)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;81&#xff09; 第148题 “41”视图主要用于描述系统逻辑架构&#xff0c;最早由Philippe Kruchten于1995年提出。其中&#xff08; &#xff09;视图用于描述对象模型&#xff0c;并说明系统应该…...

DrissionPage调试工具:网页自动化与数据采集的革新利器

在网页自动化测试与数据采集领域&#xff0c;开发者长期面临两难选择&#xff1a;使用Selenium等工具操作浏览器时效率不足&#xff0c;而直接调用Requests库又难以应对复杂动态页面。DrissionPage的出现完美解决了这一矛盾&#xff0c;这款基于Python开发的工具创新性地将浏览…...

有人-无人(人机)交互记忆、共享心智模型与AI准确率的边际提升

有人-无人&#xff08;人机&#xff09;交互记忆、共享心智模型与AI准确率的边际提升是人工智能发展中相互关联且各有侧重的三个方面。人机交互记忆通过记录和理解用户与机器之间的交互历史&#xff0c;增强机器对用户需求的个性化响应能力&#xff0c;从而提升用户体验和协作效…...

如何使用k8s安装redis呢

在Kubernetes (k8s) 上安装Redis 在Kubernetes上安装Redis有几种方法&#xff0c;下面我将介绍两种常见的方式&#xff1a;使用StatefulSet直接部署和使用Helm chart部署。 一、安装redis 1.1 拉去ARM镜像&#xff08;7.4.2&#xff09; docker pull registry.cn-hangzhou.ali…...