fix 线程死锁问题,前端加入打包

This commit is contained in:
2026-04-08 20:27:00 +08:00
parent 8520b104eb
commit 19fd351165
8 changed files with 123 additions and 9 deletions
+12 -8
View File
@@ -7,6 +7,7 @@ package analyzer
import (
"encoding/json" // JSON 反序列化(加载屏蔽词列表)
"log" // 日志(gojieba panic 恢复时输出)
"math" // 数学运算(最小值、开方)
"os" // 文件系统操作(读取屏蔽词文件)
"strings" // 字符串操作
@@ -86,32 +87,35 @@ func loadStopWords(path string) map[string]bool {
// searchMode=true:搜索模式分词(更细粒度,适合搜索查询);
// searchMode=false:精确模式分词(适合页面内容分析)。
// 策略:纯 ASCII 字母数字按空格切分;含中文/其他字符的片段交给结巴处理。
func (a *Analyzer) Tokenize(s string, searchMode bool) []string {
func (a *Analyzer) Tokenize(s string, searchMode bool) (result []string) {
// 超长文本截断(jieba 对极长文本处理效率下降)
if len(s) > 10000 {
s = s[:10000]
}
// 清洗非 UTF-8 字节,防止 gojieba 的 C++ 层报 "decode failed" 错误
s = strings.ToValidUTF8(s, "")
var result []string
for _, part := range strings.Fields(s) {
if isASCIIAlnum(part) {
// 纯 ASCII 片段直接保留,不走 jieba
result = append(result, part)
} else {
// 非 ASCII(含中文/日文等):加锁后调用 jieba 分词
// defer recover 防止 gojieba C++ 崩溃(如 Ctrl+C 时 SIGSEGV)导致锁泄漏
a.mu.Lock()
var tokens []string
defer func() {
if r := recover(); r != nil {
log.Printf("[analyzer] gojieba panic recovered: %v", r)
}
a.mu.Unlock()
}()
if searchMode {
tokens = a.jieba.CutForSearch(part, true)
result = append(result, a.jieba.CutForSearch(part, true)...)
} else {
tokens = a.jieba.Cut(part, true)
result = append(result, a.jieba.Cut(part, true)...)
}
a.mu.Unlock()
result = append(result, tokens...)
}
}
return result
return
}
// Normalize 标准化字符串:去除非字母数字非 CJK 字符,并转为小写。