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