/** * 🔍 知识库搜索测试(支持多种检索模式) */ import { ref } from 'vue' import { searchDocuments } from '../js/api.js' import { toast } from '../js/utils.js' export default { template: `

知识库搜索测试

输入查询语句,测试知识库检索效果(支持向量、关键词、混合检索三种模式)

搜索中...
未找到相关结果
搜索失败:{{ errorMsg }}
{{ modeLabel(r.searchMode) }} 得分: {{ formatScore(r) }} | {{ r.title || '无标题' }} | {{ r.sourceName || '无来源' }}
{{ r.content || '' }}
`, setup() { const query = ref('') const topK = ref(5) const threshold = ref(0.5) const searchMode = ref('VECTOR') const results = ref([]) const isSearching = ref(false) const searched = ref(false) const errorMsg = ref('') async function search() { if (!query.value.trim()) { toast('请输入查询内容', 'error') return } isSearching.value = true searched.value = false errorMsg.value = '' try { const json = await searchDocuments(query.value, topK.value, threshold.value, null, null, searchMode.value) if (!json.success) { errorMsg.value = json.message results.value = [] } else { results.value = json.data || [] } searched.value = true } catch (e) { errorMsg.value = e.message results.value = [] searched.value = true } finally { isSearching.value = false } } function formatScore(r) { if (r.searchMode === 'KEYWORD' || r.searchMode === 'HYBRID') { return r.score != null ? r.score.toFixed(4) : '-' } return r.score != null ? (1 - r.score).toFixed(4) : '-' } function modeLabel(m) { return { VECTOR: '向量', KEYWORD: '关键词', HYBRID: '混合' }[m] || m || '向量' } function modeColor(m) { return { VECTOR: '#007bff', KEYWORD: '#28a745', HYBRID: '#6f42c1' }[m] || '#6c757d' } return { query, topK, threshold, searchMode, results, isSearching, searched, errorMsg, search, formatScore, modeLabel, modeColor } } }