【听见课堂 HarmonyOS NEXT 实战系列 50】四维历史搜索:关键词、课程、日期、证据类型与高亮 📅 发布时间:2026/9/8 0:51:09 👁 浏览次数: 【听见课堂 HarmonyOS NEXT 实战系列 50】四维历史搜索关键词、课程、日期、证据类型与高亮历史页不是把所有课堂记录堆成一条长列表。听见课堂 P10 将关键词、课程、日期和证据类型组合为四维筛选并在本机快照中完成匹配与高亮同时当前单课程数据源和内存过滤也给出了明确的扩展边界。一、四维筛选分别解决什么问题关键词回答“内容里有没有这个概念”课程回答“属于哪门课”日期回答“发生在哪一天”证据类型回答“是字幕、重点、板书还是任务”。四个维度分别保存为页面短状态数据仍来自HistorySnapshot筛选不会修改 Repository。二、HistorySnapshot 为什么按课程分组模型包含总课程数、总证据数和HistoryCourseGroup[]。每个课程组保存日期、标题、教师、教室、开始时间、摘要和证据条目。这种结构已经为多课程结果列表预留分组边界页面可以在手机端按日期分节在大屏端同时展示结果与预览。三、当前数据源其实只有一个课程组getHistorySnapshot()只读取getTodayCourse()随后把当前字幕、扫描和任务映射到这一组最终返回new HistorySnapshot(1, items.length, [group])。因此多课程模型和筛选 UI 已存在但当前 Service 不能被描述为完整历史数据库查询。四、关键词会匹配课程级文本Service 把课程日期、标题、教师、教室和开始时间拼成小写字符串。只要关键词命中课程级文本该课程下满足类型条件的所有证据都可以保留。这让搜索教师名或教室时能找到整门课而不是要求每条证据重复携带课程元数据。五、关键词也会匹配证据级文本每条证据把时间、类型、标题、详情和来源拼成搜索文本。课程未命中时只保留自身文本包含关键词的条目。中英文统一调用toLowerCase()中文不受大小写影响英文关键词可以大小写无关匹配。六、课程与日期条件先做 AND课程筛选必须为“全部课程”或等于group.id日期筛选必须为“全部日期”或等于group.dateLabel。任一不满足就跳过整组。这两个条件与后续类型、关键词共同组成 AND 关系而不是彼此覆盖。七、类型筛选在条目层执行类型为“全部类型”时不限制否则要求item.type typeFilter。当前类型包括字幕、重点、板书和任务。关键词命中课程元数据时类型筛选仍然有效例如搜索教师后只看板书会保留该课程的板书条目。八、完整匹配逻辑是什么constcourseMatchedcourseFilter全部课程||courseFiltergroup.id;constdateMatcheddateFilter全部日期||dateFiltergroup.dateLabel;consttypeMatchedtypeFilter全部类型||item.typetypeFilter;constkeywordMatchedcourseKeywordMatched||itemText.includes(normalizedKeyword);returncourseMatcheddateMatchedtypeMatchedkeywordMatched;实现代码分成组级和条目级两步但业务语义可以归纳为四维交集。九、筛选后为什么重新计算摘要只有仍有条目的课程组才进入结果并使用过滤后的条目重新生成historyGroupSummary(items)。总证据数也对筛选后的分组重新求和。页面不会显示“原来有 20 条”却只列出 3 条计数与当前结果保持一致。十、高亮怎样拆成前、中、后三段页面用indexOf()找到关键词第一次出现的位置再通过substring()得到匹配前、匹配内容和匹配后三段。中间段使用强调颜色、粗体和背景色。ArkUI 使用FlexWrap组合真实文本节点不把结果转成带 HTML 标签的字符串。十一、当前高亮只覆盖标题和详情结果行调用高亮 Builder 处理item.title与item.detail不会高亮时间、类型、来源或课程标题中的命中内容。因此关键词若只命中教师或教室课程组会被保留但具体证据行可能没有彩色高亮。这是当前交互边界不是搜索失败。十二、当前只高亮第一次出现historyMatchIndex()使用单次indexOf()后续相同关键词不会继续拆分和高亮。短课堂记录通常够用但长 OCR 文本可能让后续命中不易发现。若要支持全部命中应先把文本切成安全片段数组再由 ArkUI 渲染避免在 Builder 中做复杂正则和重复计算。十三、筛选变化为什么清空选中预览修改关键词、课程、日期或类型时页面把selectedHistoryEvidenceId清空。否则右侧可能继续显示已经不在结果集中的旧证据。大屏预览与手机展开都遵守同一选择状态减少过滤后出现“列表没有详情还在”的悬空状态。十四、语音搜索为什么明确不申请权限当前语音搜索入口只提示“未启用请继续键入关键词”不会申请麦克风权限也没有伪造识别结果。只有未来真正接入语音输入、明确本机或云端处理边界并设计拒绝降级后才应启用该能力。十五、何时从内存筛选迁移到 SQL当前数据量小Service 对 Snapshot 使用filter()和includes()简单可靠。多课程、长字幕和大量 OCR 文本出现后应把课程、日期、类型条件下推到 RelationalStore并为结构化字段建立索引。全文搜索还要评估分词、模糊匹配、结果片段和分页不能简单把所有历史一次性读入页面。十六、总结听见课堂用课程级与证据级文本匹配、四维 AND 组合、筛选后重算和 ArkUI 文本分段高亮完成了可解释的本地历史搜索。当前实现仍是单课程快照、内存过滤、标题/详情首个命中高亮这些限制被明确记录才能为后续 SQL 索引和多课程历史演进提供可靠起点。下一篇开始进入 ArkUI 视觉系统、多设备适配与无障碍设计专题。