【听见课堂 HarmonyOS NEXT 实战系列 50】四维历史搜索:关键词、课程、日期、证据类型与高亮
2026/9/8 0:50:39 网站建设 项目流程

【听见课堂 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。当前类型包括字幕、重点、板书和任务。

关键词命中课程元数据时,类型筛选仍然有效;例如搜索教师后只看板书,会保留该课程的板书条目。

八、完整匹配逻辑是什么

constcourseMatched=courseFilter==='全部课程'||courseFilter===group.id;constdateMatched=dateFilter==='全部日期'||dateFilter===group.dateLabel;consttypeMatched=typeFilter==='全部类型'||item.type===typeFilter;constkeywordMatched=courseKeywordMatched||itemText.includes(normalizedKeyword);returncourseMatched&&dateMatched&&typeMatched&&keywordMatched;

实现代码分成组级和条目级两步,但业务语义可以归纳为四维交集。

九、筛选后为什么重新计算摘要

只有仍有条目的课程组才进入结果,并使用过滤后的条目重新生成historyGroupSummary(items)。总证据数也对筛选后的分组重新求和。

页面不会显示“原来有 20 条”却只列出 3 条,计数与当前结果保持一致。

十、高亮怎样拆成前、中、后三段

页面用indexOf()找到关键词第一次出现的位置,再通过substring()得到匹配前、匹配内容和匹配后三段。中间段使用强调颜色、粗体和背景色。

ArkUI 使用FlexWrap组合真实文本节点,不把结果转成带 HTML 标签的字符串。

十一、当前高亮只覆盖标题和详情

结果行调用高亮 Builder 处理item.titleitem.detail,不会高亮时间、类型、来源或课程标题中的命中内容。

因此关键词若只命中教师或教室,课程组会被保留,但具体证据行可能没有彩色高亮。这是当前交互边界,不是搜索失败。

十二、当前只高亮第一次出现

historyMatchIndex()使用单次indexOf(),后续相同关键词不会继续拆分和高亮。短课堂记录通常够用,但长 OCR 文本可能让后续命中不易发现。

若要支持全部命中,应先把文本切成安全片段数组,再由 ArkUI 渲染,避免在 Builder 中做复杂正则和重复计算。

十三、筛选变化为什么清空选中预览

修改关键词、课程、日期或类型时,页面把selectedHistoryEvidenceId清空。否则右侧可能继续显示已经不在结果集中的旧证据。

大屏预览与手机展开都遵守同一选择状态,减少过滤后出现“列表没有,详情还在”的悬空状态。

十四、语音搜索为什么明确不申请权限

当前语音搜索入口只提示“未启用,请继续键入关键词”,不会申请麦克风权限,也没有伪造识别结果。

只有未来真正接入语音输入、明确本机或云端处理边界并设计拒绝降级后,才应启用该能力。

十五、何时从内存筛选迁移到 SQL

当前数据量小,Service 对 Snapshot 使用filter()includes()简单可靠。多课程、长字幕和大量 OCR 文本出现后,应把课程、日期、类型条件下推到 RelationalStore,并为结构化字段建立索引。

全文搜索还要评估分词、模糊匹配、结果片段和分页;不能简单把所有历史一次性读入页面。

十六、总结

听见课堂用课程级与证据级文本匹配、四维 AND 组合、筛选后重算和 ArkUI 文本分段高亮,完成了可解释的本地历史搜索。当前实现仍是单课程快照、内存过滤、标题/详情首个命中高亮;这些限制被明确记录,才能为后续 SQL 索引和多课程历史演进提供可靠起点。

下一篇开始进入 ArkUI 视觉系统、多设备适配与无障碍设计专题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询