From 5a2be87f658d01bc5b3b7ecdba92ac69bf09dcf7 Mon Sep 17 00:00:00 2001
From: ai_xiaopei <xiaopei@aisim.cn>
Date: Thu, 03 Sep 2026 15:15:37 +0800
Subject: [PATCH] fix(search): 搜索准确性四连修——FTS5 MATCH 引号包裹(连字符不再被解析成 MINUS);KeywordSearch 截断按命中关键词数排序(高频 bigram 不再挤出强相关文档);原词奖励档(完整短语压过泛化 bigram);tags 字段真实参与评分(此前误用 Section)
---
internal/search/scorer.go | 40 +++++++++++++++++++++++++++++++++++++++-
1 files changed, 39 insertions(+), 1 deletions(-)
diff --git a/internal/search/scorer.go b/internal/search/scorer.go
index ae676b4..a3b4e3f 100644
--- a/internal/search/scorer.go
+++ b/internal/search/scorer.go
@@ -11,6 +11,13 @@
"可以", "需要", "应该", "是否", "有没有",
}
+// EntityWords 实体词列表(进一步降低权重,因为这些词会匹配大量文件)
+var EntityWords = []string{
+ "智能枪", "电子秤", "智能阀", "艾信盒子",
+ "电子秤平台", "运营管理平台", "易配送", "lpg",
+ "安全用气", "艾信助手", "艾信发货",
+}
+
// IsGenericWord 判断是否为通用词
func IsGenericWord(word string) bool {
word = strings.ToLower(word)
@@ -22,6 +29,17 @@
return false
}
+// IsEntityWord 判断是否为实体词
+func IsEntityWord(word string) bool {
+ wordLower := strings.ToLower(word)
+ for _, e := range EntityWords {
+ if wordLower == strings.ToLower(e) {
+ return true
+ }
+ }
+ return false
+}
+
// ScoreType 评分类型
type ScoreType int
@@ -29,6 +47,7 @@
ScoreNormal ScoreType = iota // 普通词
ScoreExpanded // 扩展词
ScoreSymptom // 症状词
+ ScoreOriginal // 用户原词(完整短语,强信号,高于 bigram 扩展档)
)
// ScoreTable 评分表
@@ -39,6 +58,12 @@
"tag": 2,
"content": 1,
},
+ ScoreOriginal: {
+ "path": 60,
+ "title": 60,
+ "tag": 60,
+ "content": 60,
+ },
ScoreExpanded: {
"path": 40,
"title": 30,
@@ -59,8 +84,21 @@
if base == 0 {
return 0
}
+ // 实体词降权(匹配太多文件),但保证至少 1 分
+ if IsEntityWord(keyword) {
+ score := base / 5
+ if score < 1 {
+ score = 1
+ }
+ return score
+ }
+ // 通用词降权,但保证至少 1 分
if IsGenericWord(keyword) {
- return base / 10 // 通用词降权
+ score := base / 3
+ if score < 1 {
+ score = 1
+ }
+ return score
}
return base
}
--
Gitblit v1.10.0