From 62a9f6223745c0df42be1f4226f31dfb10c83ea8 Mon Sep 17 00:00:00 2001
From: ax_rd <ax_rd@aisim.cn>
Date: Thu, 03 Sep 2026 13:53:11 +0800
Subject: [PATCH] fix: e2e-verify.sh 退出码处理(FAILS 计数 + pipefail,CI 可凭退出码判定)

---
 internal/search/engine.go |   22 +++++++++++++++++++++-
 1 files changed, 21 insertions(+), 1 deletions(-)

diff --git a/internal/search/engine.go b/internal/search/engine.go
index a1dd52a..13e2ff1 100644
--- a/internal/search/engine.go
+++ b/internal/search/engine.go
@@ -36,8 +36,24 @@
 	// 合并所有关键词
 	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
 	}
@@ -55,6 +71,10 @@
 		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)
 		}

--
Gitblit v1.10.0