package common import ( "strings" "github.com/go-ego/gse" ) var seg gse.Segmenter func init() { if err := seg.LoadDict(); err != nil { panic("gse load dict failed: " + err.Error()) } } // Tokenize 中文分词,空格连接(FTS5 索引列格式:content_tokens) func Tokenize(text string) string { tokens := seg.Cut(text, true) var sb strings.Builder for _, t := range tokens { t = strings.TrimSpace(t) if t == "" { continue } sb.WriteString(t) sb.WriteString(" ") } return strings.TrimSpace(sb.String()) } // TokenizeQuery FTS5 查询串:过滤 FTS5 特殊字符与单字虚词,OR 语义。 // 中文问题分词后通常只有少数词与文档重合,AND 全命中会空召回,OR + BM25 排序更稳健。 func TokenizeQuery(text string) string { tokens := seg.Cut(text, true) var parts []string for _, t := range tokens { t = strings.TrimSpace(t) if t == "" { continue } if strings.ContainsAny(t, "\"*:()") { continue } if len([]rune(t)) < 2 { continue } parts = append(parts, "\""+t+"\"") } return strings.Join(parts, " OR ") }