feat: hashtag 列表显示按共现计算的相关 tag

- 新增 /api/hashtag/related:从作品描述实时解析 hashtag,按「同一作品里一起出现」计算相关 tag
- 打分取子话题(候选多与目标同现)与上位话题(目标多与热门候选同现)两者较大值,
  过滤 cos、二次元等万金油 tag 与平台活动、纯数字 tag
- 播放页侧栏的 hashtag 列表顶部显示相关 tag,点击在侧栏内预览(不打断当前播放),
  在预览里点作品才切换到该 tag 的列表

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-09 01:18:04 +08:00
co-authored by Claude Opus 5.5
parent b84fcec77b
commit 2391abdeea
7 changed files with 279 additions and 7 deletions
+18
View File
@@ -47,3 +47,21 @@ export function hashtagToPgPattern(name: string): string {
const escaped = name.toLowerCase().replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
return `#${escaped}([\\s${STOP_CHARS}]|$)`;
}
/** 从描述里提取全部 hashtag 名的 Postgres 正则(ARE),配合 regexp_matches(..., 'g') 使用 */
export const HASHTAG_EXTRACT_PG = `#([^\\s${STOP_CHARS}]+)`;
// 「万金油」tag:几乎和什么都一起出现,不提供话题信息,不作为相关 tag 推荐
export const META_HASHTAGS = [
"cos",
"cosplay",
"coser",
"二次元",
"ooc致歉",
"搞笑",
"抽象",
"vlog日常",
"内容过于真实",
];
/** 平台活动类 tag(xx计划、xx挑战赛…)和纯数字 tag 的 Postgres 正则 */
export const META_HASHTAG_PG = "(计划|挑战赛|大赛|扶持|热门|浪潮)$|^[0-9]+$";