fix(kbdb): search keyword 補 source filter(#66)+semantic 曝 top_k/min_score 帶 score(#67)
#66:/entries/search keyword 路徑 source 解析後丟棄(#5.1 只接了 listEntries 那半)—— searchEntries 尾端加 source?(既有 positional caller 全不用改),conds 補與 listEntries 同款 json_extract(metadata_json,'$.source') 謂詞;route keyword 分支與 semantic 降級 分支兩處傳入。 #67:semantic 固定 topK=20、零分數閾值、低分尾硬湊數——route 曝 top_k(預設 20、封頂 100)與 min_score(預設 0=不過濾)query 參數;semanticSearch 依 min_score 截低分尾; semantic 回應 entry 附 score 欄(加欄不改形)。壞值(非數字/非正)視同沒帶,不 400。 向後相容:不帶新參數時輸出與現況一致(semantic 僅多 score 資訊);不動表(D6)、 不動 D1 結構(API-as-Wall)。測試:新增 search-source-and-score.test.ts 13 條 (source 謂詞形狀/route 下傳/降級不洩 filter/min_score 截斷/topK 透傳封頂/壞值防呆/ 不帶參數行為不變),kbdb vitest 33/33 綠、tsc 0。 關聯 #66 #67。merge 後需 gated redeploy kbdb worker(leo 閘)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JUmjwkHLVBHM3ydhT1WSW3
This commit is contained in:
@@ -137,6 +137,9 @@ function libraryPredicate(libraries: string[]): string {
|
||||
// D1 LIKE keyword search (base; semantic search is the optional embed module).
|
||||
// entry_type: optional base filter (generic — caller passes any type, base stays type-agnostic).
|
||||
// library: optional 多值庫 filter(portal-auth P1);未帶=行為與舊版一字不變(向後相容)。
|
||||
// source: metadata_json.$.source filter(issue #66——#5.1 只接了 listEntries 那半,keyword search
|
||||
// 路徑 route 解析完即丟;謂詞與 listEntries 同款 json_extract,不動表)。加在參數尾端,
|
||||
// 既有 positional caller 一個都不用改(向後相容)。
|
||||
export async function searchEntries(
|
||||
db: D1Database,
|
||||
q: string,
|
||||
@@ -144,11 +147,13 @@ export async function searchEntries(
|
||||
entry_type?: string,
|
||||
limit = 50,
|
||||
library?: string[],
|
||||
source?: string,
|
||||
): Promise<Entry[]> {
|
||||
const conds = ['content LIKE ?'];
|
||||
const params: unknown[] = [`%${q}%`];
|
||||
if (owner_id) { conds.push('owner_id = ?'); params.push(owner_id); }
|
||||
if (entry_type) { conds.push('entry_type = ?'); params.push(entry_type); }
|
||||
if (source) { conds.push("json_extract(metadata_json, '$.source') = ?"); params.push(source); }
|
||||
if (library && library.length > 0) { conds.push(libraryPredicate(library)); params.push(...library); }
|
||||
const res = await db
|
||||
.prepare(`SELECT * FROM entries WHERE ${conds.join(' AND ')} ORDER BY updated_at DESC LIMIT ?`)
|
||||
|
||||
Reference in New Issue
Block a user