| | |
| | | // 合并所有关键词 |
| | | allKeywords := append(append(keywords, opts.Expanded...), opts.Symptom...) |
| | | |
| | | // 长 CJK 词 bigram 展开(统一下沉):FTS5 unicode61 把连续中文当整串单 token, |
| | | // 长复合词整串 LIKE 匹配不到;ExpandCJKKeywords 拆成 bigram 滑动窗口 |
| | | // (原词保留、去重保序)。bigram 参与检索,textScore 按 ScoreExpanded 档计权 |
| | | // (与现有 Expanded 机制一致),原词仍按原词档。 |
| | | searchKeywords := ExpandCJKKeywords(allKeywords) |
| | | originalSet := make(map[string]bool, len(allKeywords)) |
| | | for _, kw := range allKeywords { |
| | | originalSet[kw] = true |
| | | } |
| | | var bigrams []string |
| | | for _, kw := range searchKeywords { |
| | | if !originalSet[kw] { |
| | | bigrams = append(bigrams, kw) |
| | | } |
| | | } |
| | | |
| | | // 1. 双通道检索(ASCII 走 FTS,CJK 走 LIKE) |
| | | candidates, err := store.KeywordSearch(allKeywords, 100) |
| | | candidates, err := store.KeywordSearch(searchKeywords, 100) |
| | | if err != nil { |
| | | return nil, err |
| | | } |
| | |
| | | for _, kw := range opts.Expanded { |
| | | score += scoreResult(r, kw, ScoreExpanded) |
| | | } |
| | | // bigram 展开词按 Expanded 档计权(与用户显式扩展词同档) |
| | | for _, kw := range bigrams { |
| | | score += scoreResult(r, kw, ScoreExpanded) |
| | | } |
| | | for _, kw := range opts.Symptom { |
| | | score += scoreResult(r, kw, ScoreSymptom) |
| | | } |