From 516121e6f962786bc2c18b0fa0300e39197ab2c3 Mon Sep 17 00:00:00 2001 From: lix-2026 Date: Tue, 9 Jun 2026 09:32:36 +0800 Subject: [PATCH] fix(rag): default search to keyword and rebuild saved roots --- .../browser/sidebar-page-settings-runtime.js | 16 +++++++++-- .../mnote-web/browser/sidebar-tree-runtime.js | 12 +++++---- .../mnote-web/src/routes/knowledge_rag.rs | 27 ++++++++++++++++--- rust/crates/mnote-web/src/ssr/pages/layout.rs | 5 ++++ 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/rust/crates/mnote-web/browser/sidebar-page-settings-runtime.js b/rust/crates/mnote-web/browser/sidebar-page-settings-runtime.js index 649dbfc1..b6fa6927 100644 --- a/rust/crates/mnote-web/browser/sidebar-page-settings-runtime.js +++ b/rust/crates/mnote-web/browser/sidebar-page-settings-runtime.js @@ -670,7 +670,7 @@ export function createSidebarPageSettingsRuntime(context) { '' + '
' + '' + - '' + + '' + '' + '' + '
' + @@ -1058,6 +1058,17 @@ export function createSidebarPageSettingsRuntime(context) { }); } + function knowledgeRagIndexedRootValues() { + var status = currentKnowledgeRagSummary().status || {}; + var registry = status.registry && typeof status.registry === 'object' ? status.registry : {}; + var roots = Array.isArray(registry.indexedRoots) ? registry.indexedRoots : []; + return roots.map(function(root) { + return String(root && (root.rootRelativePath || root.root_relative_path) || '').trim(); + }).filter(Boolean).filter(function(value, index, list) { + return list.indexOf(value) === index; + }); + } + function knowledgeRagCurrentFilter() { return pageUiState.knowledgeRagSourceFilter || 'attention'; } @@ -1503,11 +1514,12 @@ export function createSidebarPageSettingsRuntime(context) { async function ingestKnowledgeRagSources() { if (!knowledgeRagIsAvailable()) return; var sources = knowledgeRagSourceInputValues(); + if (!sources.length) sources = knowledgeRagIndexedRootValues(); if (!sources.length) { pageUiState.knowledgeRagSummary = Object.assign({}, currentKnowledgeRagSummary(), { scopeKey: knowledgeRagScopeKey(), loading: false, - error: '请先填写要索引的资料路径' + error: '请先填写要索引的资料路径,或保留至少一个已保存的索引范围' }); renderKnowledgeRagSettings(); return; diff --git a/rust/crates/mnote-web/browser/sidebar-tree-runtime.js b/rust/crates/mnote-web/browser/sidebar-tree-runtime.js index 4efabc66..a0037954 100644 --- a/rust/crates/mnote-web/browser/sidebar-tree-runtime.js +++ b/rust/crates/mnote-web/browser/sidebar-tree-runtime.js @@ -2135,12 +2135,12 @@ import { createSidebarPageSettingsRuntime } from './sidebar-page-settings-runtim '
' + '仅匹配标题' + '精确匹配' + - '资料库模式' + + '资料库模式' + '按编辑时间' + '按创建时间' + '
' + '
' + - '全盘资料库' + + '全盘资料库' + '页面内搜索' + '折叠同来源' + '
' + @@ -2152,7 +2152,9 @@ import { createSidebarPageSettingsRuntime } from './sidebar-page-settings-runtim document.body.appendChild(overlay); var input = overlay.querySelector('[data-testid="wolai-search-input"]'); var closeButton = overlay.querySelector('[data-testid="wolai-search-close"]'); - applySearchSwitchState(overlay, { collapseSource: readSearchCollapseSourcesDefault() }); + applySearchSwitchState(overlay, { knowledge: true, collapseSource: readSearchCollapseSourcesDefault() }); + var initialKnowledgeModeSelect = overlay.querySelector('[data-search-knowledge-mode]'); + if (initialKnowledgeModeSelect && 'value' in initialKnowledgeModeSelect) initialKnowledgeModeSelect.value = 'exact'; if (input) input.addEventListener('input', function() { searchUiState.hasRendered = false; scheduleSearchResultsRender(); @@ -2194,7 +2196,7 @@ import { createSidebarPageSettingsRuntime } from './sidebar-page-settings-runtim metaHtml: '', resultsHtml: '', items: [], - knowledgeMode: 'mix', + knowledgeMode: 'exact', sourceCollapsed: {}, scrollTop: 0, signature: '', @@ -2345,7 +2347,7 @@ import { createSidebarPageSettingsRuntime } from './sidebar-page-settings-runtim if (input && 'value' in input) input.value = searchUiState.query || ''; applySearchSwitchState(overlay, searchUiState.switches); var knowledgeModeSelect = overlay.querySelector('[data-search-knowledge-mode]'); - if (knowledgeModeSelect && 'value' in knowledgeModeSelect) knowledgeModeSelect.value = searchUiState.knowledgeMode || 'mix'; + if (knowledgeModeSelect && 'value' in knowledgeModeSelect) knowledgeModeSelect.value = searchUiState.knowledgeMode || 'exact'; if (options instanceof HTMLElement) options.hidden = !searchText(searchUiState.query); if (meta && searchUiState.metaHtml) meta.innerHTML = searchUiState.metaHtml; if (results && searchUiState.resultsHtml) { diff --git a/rust/crates/mnote-web/src/routes/knowledge_rag.rs b/rust/crates/mnote-web/src/routes/knowledge_rag.rs index 468c0955..5e77268c 100644 --- a/rust/crates/mnote-web/src/routes/knowledge_rag.rs +++ b/rust/crates/mnote-web/src/routes/knowledge_rag.rs @@ -369,7 +369,27 @@ pub async fn ingest( let mut expanded_count = 0usize; let mut seen_sources = BTreeSet::::new(); let force = body.force.unwrap_or(false); - for source in body.sources { + let mut requested_sources = body.sources; + if requested_sources.is_empty() { + requested_sources = registry + .indexed_roots + .iter() + .map(|root| KnowledgeRagSourceInput { + source_path: Some(root.root_relative_path.clone()), + path: None, + parser_hint: None, + }) + .collect(); + } + if requested_sources.is_empty() { + return Err(WebError::bad_request_code( + "knowledge_rag_source_required", + "资料库索引缺少 sourcePath,且没有可重建的已保存索引范围", + ) + .with_context(&context)); + } + + for source in requested_sources { let source_path = source.source_path.or(source.path).ok_or_else(|| { WebError::bad_request_code("knowledge_rag_source_required", "资料库索引缺少 sourcePath") .with_context(&context) @@ -1087,7 +1107,8 @@ fn normalize_knowledge_rag_search_mode(mode: Option<&str>) -> String { Some("hybrid") => "hybrid".into(), Some("naive" | "vector") => "naive".into(), Some("mix" | "mixed") => "mix".into(), - _ => "mix".into(), + Some(_) => "mix".into(), + None => "exact".into(), } } @@ -4718,7 +4739,7 @@ mod tests { normalize_knowledge_rag_search_mode(Some("hybrid")), "hybrid" ); - assert_eq!(normalize_knowledge_rag_search_mode(None), "mix"); + assert_eq!(normalize_knowledge_rag_search_mode(None), "exact"); } #[test] diff --git a/rust/crates/mnote-web/src/ssr/pages/layout.rs b/rust/crates/mnote-web/src/ssr/pages/layout.rs index 335d018b..c2fe9efb 100644 --- a/rust/crates/mnote-web/src/ssr/pages/layout.rs +++ b/rust/crates/mnote-web/src/ssr/pages/layout.rs @@ -568,6 +568,11 @@ mod tests { assert!(SIDEBAR_TREE_RUNTIME_JS.contains("pruneKnowledgeRagRegistry")); assert!(SIDEBAR_TREE_RUNTIME_JS.contains("setKnowledgeRagSourceFilter")); assert!(SIDEBAR_TREE_RUNTIME_JS.contains("mnote:knowledge-rag-source-updated")); + assert!( + SIDEBAR_TREE_RUNTIME_JS.contains(r#""#) + ); + assert!(SIDEBAR_TREE_RUNTIME_JS + .contains(r#"data-search-switch="knowledge" role="switch" aria-checked="true""#)); assert!(SIDEBAR_FILETREE_COMMAND_RUNTIME_JS.contains("knowledgeRagSourceRelativePath")); assert!(SIDEBAR_FILETREE_COMMAND_RUNTIME_JS.contains("supportsKnowledgeRagSource")); assert!(!SIDEBAR_FILETREE_COMMAND_RUNTIME_JS.contains("runLocalOcr"));