52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
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 ")
|
||
}
|