2.6 KiB
2.6 KiB
推荐引擎调试指南
学校不显示在推荐结果中的排查流程
按顺序排查,不要跳过步骤。
1. 检查数据库层面
sqlite3 gaokao_henan.db "SELECT year, subject, batch, plan_type, min_score, min_rank FROM schools WHERE school_name LIKE '%学校名%' ORDER BY year DESC;"
sqlite3 gaokao_henan.db "SELECT year, subject, batch, major, min_score FROM majors WHERE school_name LIKE '%学校名%' ORDER BY year DESC;"
sqlite3 gaokao_henan.db "SELECT COUNT(DISTINCT school_name) FROM schools WHERE year=2025 AND subject='物理类' AND batch='专科批';"
2. 检查 rows_dict 去重
_calc_prob_data() 中的 rows_dict 过去用 school_name 作为 key。同一学校有多个计划类型(普通类/较高收费专业/中外合作办学)时,只有最后一个 ORDER BY min_score DESC 的分数字段存活。
症状:学校出现在数据库中,但推荐结果只出现高分计划类型,低分计划类型被吞。
修复:用 (school_name, plan_type) 双 key 代替单 key。
# 坏的:只保留最后一个计划类型
rows_dict[r[0]] = r
# 好的:每个计划类型独立保留
rows_dict[(r[0], r[5])] = r
同样的改动需要同步在 2025 数据循环和 2024 回退循环中。
3. 检查分数区间匹配
gap = school_min_score - student_score
chong_range: +3 ~ +10 (专科批)
wen_range: -2 ~ +3
bao_shallow: -15 ~ -2
bao_deep: < -15 AND rank_diff >= 30000
4. 检查位次条件(bao_deep 的常见阻塞点)
2024 回退数据 vs 2025 学生位次:不同年份的位次不可直接比较。学校位次高于学生位次时 sch_rank - student_rank < 0,永远不满足 >= 30000。
5. 检查 allowed_schools 过滤
只查询 majors WHERE year=2025 中的学校。2024 回退的学校通过 school_basic.json 的 province 字段或学校名关键词补充。
6. 检查 top() 限流
专科批 n_deep = 6,只保留前 6 所学校。即使学校进入了 bao_deep 列表,也可能被排序规则挤到 6 名之后。
7. with_entry_points 合并
同一学校有多个计划类型时,只保留最接近考生分数的一个。
8. 私立学校替换逻辑
确保 bao_deep 至少有 2 所民办/独立学院,可能替换掉公办学校。
典型问题模式
| 现象 | 常见根因 | 修复 |
|---|---|---|
| 低分看不到学校 | 前端 min=200 拦截 | 改到 160 |
| 分数够但看不到 | rows_dict 按 school_name 去重 | 改成双 key |
| 所有分数都看不到 | 学校只有 2024 数据 | 检查 2024 回退逻辑 |
| 只能看到高收费专业 | 分数只够 low-score 计划类型 | 数据现实 |