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/index/graphload.go |   50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/internal/index/graphload.go b/internal/index/graphload.go
new file mode 100644
index 0000000..73db2ef
--- /dev/null
+++ b/internal/index/graphload.go
@@ -0,0 +1,50 @@
+package index
+
+import (
+	"fmt"
+
+	"github.com/aisim/kb-cli/internal/graph"
+)
+
+// LoadRWRGraph 加载 RWR 邻接(无向、带权)。
+// 权重:wikilink exact=1.0 / fuzzy=0.5 / entity=1.0 / tag=0.5(tag 扇出大降权)。
+// 只加载与种子同连通域的边不可行(SQLite 无图查询),全量加载后 RWR 内部按种子收敛——
+// 458 节点 / ~2k 边规模下全量加载 <5ms,可接受。
+func (s *Store) LoadRWRGraph() (map[int64][]graph.AdjEdge, error) {
+	rows, err := s.db.Query(`
+		SELECT from_node, to_node, relation, provenance FROM edges
+		WHERE relation IN ('wikilink', 'entity', 'tag')`)
+	if err != nil {
+		return nil, fmt.Errorf("加载边失败: %w", err)
+	}
+	defer rows.Close()
+	adj := make(map[int64][]graph.AdjEdge)
+	add := func(from, to int64, w float64) {
+		adj[from] = append(adj[from], graph.AdjEdge{To: to, Weight: w})
+		adj[to] = append(adj[to], graph.AdjEdge{To: from, Weight: w})
+	}
+	for rows.Next() {
+		var from, to int64
+		var relation, prov string
+		if err := rows.Scan(&from, &to, &relation, &prov); err != nil {
+			return nil, err
+		}
+		var w float64
+		switch relation {
+		case "wikilink":
+			if prov == "exact" {
+				w = 1.0
+			} else {
+				w = 0.5
+			}
+		case "entity":
+			w = 1.0
+		case "tag":
+			w = 0.5
+		default:
+			continue
+		}
+		add(from, to, w)
+	}
+	return adj, rows.Err()
+}

--
Gitblit v1.10.0