| | |
| | | textScore[r.ID] = score |
| | | } |
| | | |
| | | // 原词奖励:候选由 bigram 召回时可能并不含用户原词("无法"×10 压过 |
| | | // 含"无法开机"整词的文档)。原词真实出现在正文/标题/标签中时给强信号加分, |
| | | // 使"标题=原词"或"tags 含原词"的文档稳定压过只含泛化 bigram 的文档。 |
| | | for _, r := range candidates { |
| | | content, _, _, err := store.GetNodeContent(r.ID) |
| | | if err != nil { |
| | | continue |
| | | } |
| | | lc := strings.ToLower(content) |
| | | titleL := strings.ToLower(r.Title) |
| | | for _, kw := range keywords { |
| | | kwL := strings.ToLower(kw) |
| | | hit := strings.Contains(lc, kwL) || strings.Contains(titleL, kwL) |
| | | if !hit { |
| | | for _, t := range r.Tags { |
| | | if strings.Contains(strings.ToLower(t), kwL) { |
| | | hit = true |
| | | break |
| | | } |
| | | } |
| | | } |
| | | if hit { |
| | | textScore[r.ID] += CalcScore(kw, "content", ScoreOriginal) |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 3. RWR 图质量(种子 = 候选前 20,全量加载邻接后按种子收敛) |
| | | seedIDs := make([]int64, 0, len(candidates)) |
| | | for _, r := range candidates { |
| | |
| | | score += CalcScore(keyword, "title", scoreType) |
| | | } |
| | | |
| | | // 板块匹配 |
| | | if strings.Contains(strings.ToLower(r.Section), kw) { |
| | | // 标签匹配(tags 字段真实参与评分;此前误用 Section,而 Section 恒为"其他") |
| | | if len(r.Tags) > 0 { |
| | | for _, t := range r.Tags { |
| | | if strings.Contains(strings.ToLower(t), kw) { |
| | | score += CalcScore(keyword, "tag", scoreType) |
| | | break |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 别名匹配(命中按 title 档计权,一次命中即计) |