models.py 2.5 KB
"""
Request and response models for the API.
"""

from pydantic import BaseModel, Field
from typing import List, Dict, Any, Optional


class SearchRequest(BaseModel):
    """Search request model."""
    query: str = Field(..., description="Search query string")
    size: int = Field(10, ge=1, le=100, description="Number of results to return")
    from_: int = Field(0, ge=0, alias="from", description="Offset for pagination")
    filters: Optional[Dict[str, Any]] = Field(None, description="Additional filters")
    min_score: Optional[float] = Field(None, description="Minimum score threshold")
    # 新增字段
    aggregations: Optional[Dict[str, Any]] = Field(None, description="Aggregation specifications")
    sort_by: Optional[str] = Field(None, description="Sort field name")
    sort_order: Optional[str] = Field("desc", description="Sort order: 'asc' or 'desc'")


class ImageSearchRequest(BaseModel):
    """Image search request model."""
    image_url: str = Field(..., description="URL of the query image")
    size: int = Field(10, ge=1, le=100, description="Number of results to return")
    filters: Optional[Dict[str, Any]] = Field(None, description="Additional filters")


class SearchResponse(BaseModel):
    """Search response model."""
    hits: List[Dict[str, Any]] = Field(..., description="Search results")
    total: int = Field(..., description="Total number of matching documents")
    max_score: float = Field(..., description="Maximum relevance score")
    took_ms: int = Field(..., description="Time taken in milliseconds")
    aggregations: Dict[str, Any] = Field(default_factory=dict, description="Aggregation results")
    query_info: Dict[str, Any] = Field(default_factory=dict, description="Query processing information")
    performance_info: Optional[Dict[str, Any]] = Field(None, description="Detailed performance timing information")


class DocumentResponse(BaseModel):
    """Single document response model."""
    id: str = Field(..., description="Document ID")
    source: Dict[str, Any] = Field(..., description="Document source")


class HealthResponse(BaseModel):
    """Health check response model."""
    status: str = Field(..., description="Service status")
    elasticsearch: str = Field(..., description="Elasticsearch status")
    customer_id: str = Field(..., description="Customer configuration ID")


class ErrorResponse(BaseModel):
    """Error response model."""
    error: str = Field(..., description="Error message")
    detail: Optional[str] = Field(None, description="Detailed error information")