mirror of
https://github.com/DrizzleTime/Foxel.git
synced 2026-05-10 17:43:35 +08:00
42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
from fastapi import APIRouter, Depends, Query
|
|
from schemas.fs import SearchResultItem
|
|
from services.auth import get_current_active_user, User
|
|
from services.ai import get_text_embedding
|
|
from services.vector_db import VectorDBService
|
|
|
|
router = APIRouter(prefix="/api/search", tags=["search"])
|
|
|
|
async def search_files_by_vector(q: str, top_k: int):
|
|
embedding = await get_text_embedding(q)
|
|
vector_db = VectorDBService()
|
|
results = await vector_db.search_vectors("vector_collection", embedding, top_k)
|
|
items = [
|
|
SearchResultItem(id=res["id"], path=res["entity"]["path"], score=res["distance"])
|
|
for res in results[0]
|
|
]
|
|
return {"items": items, "query": q}
|
|
|
|
async def search_files_by_name(q: str, top_k: int):
|
|
vector_db = VectorDBService()
|
|
results = await vector_db.search_by_path("vector_collection", q, top_k)
|
|
items = [
|
|
SearchResultItem(id=idx, path=res["entity"]["path"], score=res["distance"])
|
|
for idx, res in enumerate(results[0])
|
|
]
|
|
return {"items": items, "query": q}
|
|
|
|
|
|
@router.get("")
|
|
async def search_files(
|
|
q: str = Query(..., description="搜索查询"),
|
|
top_k: int = Query(10, description="返回结果数量"),
|
|
mode: str = Query("vector", description="搜索模式: 'vector' 或 'filename'"),
|
|
user: User = Depends(get_current_active_user),
|
|
):
|
|
if mode == "vector":
|
|
return await search_files_by_vector(q, top_k)
|
|
elif mode == "filename":
|
|
return await search_files_by_name(q, top_k)
|
|
else:
|
|
return {"items": [], "query": q, "error": "Invalid search mode"}
|