| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- """
- 搜索功能数据ORM定义
- 定义搜索功能相关的数据库表结构,包含用户搜索偏好和使用记录
- """
- from datetime import datetime
- from sqlalchemy import (
- Column, Integer, String, Boolean, DateTime, Numeric, ForeignKey,
- Index, CheckConstraint, BigInteger, JSON
- )
- from sqlalchemy.sql import func
- from sqlalchemy.orm import relationship
- from app.database import Base
- class UserSearchPreferences(Base):
- """
- 用户搜索偏好ORM类
- 存储用户的默认搜索配置,包括搜索策略、时效性等偏好设置
- """
- __tablename__ = "user_search_preferences"
- # 主键
- id = Column(Integer, primary_key=True, autoincrement=True, comment="主键ID")
- # 用户ID(外键关联users表,级联删除)
- user_id = Column(
- String(50),
- ForeignKey("aigcspace.users.id", ondelete="CASCADE"),
- nullable=False,
- unique=True,
- comment="用户ID"
- )
- # 默认搜索策略
- default_search_strategy = Column(
- String(10),
- nullable=False,
- default='turbo',
- comment="默认搜索策略:turbo/max/agent"
- )
- # 是否启用垂域搜索
- enable_search_extension = Column(
- Boolean,
- nullable=False,
- default=False,
- comment="是否启用垂域搜索"
- )
- # 默认搜索时效性(天)
- default_freshness = Column(
- Integer,
- nullable=True,
- comment="默认搜索时效性(天):7/30/180/365"
- )
- # 是否启用引用标注
- enable_citation = Column(
- Boolean,
- nullable=False,
- default=False,
- comment="是否启用引用标注"
- )
- # 引用格式
- citation_format = Column(
- String(20),
- nullable=False,
- default='[<number>]',
- comment="引用格式:[<number>] 或 [ref_<number>]"
- )
- # 创建时间
- created_at = Column(
- DateTime,
- nullable=False,
- server_default=func.now(),
- comment="创建时间"
- )
- # 更新时间
- updated_at = Column(
- DateTime,
- nullable=False,
- server_default=func.now(),
- onupdate=func.now(),
- comment="更新时间"
- )
- # 表级配置
- __table_args__ = (
- Index('idx_user_search_preferences_user_id', 'user_id'),
- CheckConstraint(
- "default_search_strategy IN ('turbo', 'max', 'agent')",
- name='chk_search_strategy'
- ),
- CheckConstraint(
- "default_freshness IS NULL OR default_freshness IN (7, 30, 180, 365)",
- name='chk_freshness'
- ),
- CheckConstraint(
- "citation_format IN ('[<number>]', '[ref_<number>]')",
- name='chk_citation_format'
- ),
- {'schema': 'aigcspace', 'comment': '用户搜索偏好表,存储用户的默认搜索配置'}
- )
- def __repr__(self):
- return f"<UserSearchPreferences(id={self.id}, user_id='{self.user_id}', strategy='{self.default_search_strategy}')>"
- class SearchUsageLog(Base):
- """
- 搜索使用记录ORM类
- 记录用户的搜索使用情况,用于统计分析和计费管理
- """
- __tablename__ = "search_usage_log"
- # 主键
- id = Column(BigInteger, primary_key=True, autoincrement=True, comment="主键ID")
- # 用户ID(外键关联users表,级联删除)
- user_id = Column(
- String(50),
- ForeignKey("aigcspace.users.id", ondelete="CASCADE"),
- nullable=False,
- comment="用户ID"
- )
- # 会话ID(外键关联ai_conversation表,允许为空)
- conversation_id = Column(
- Integer,
- ForeignKey("aigcspace.ai_conversation.id", ondelete="SET NULL"),
- nullable=True,
- comment="会话ID"
- )
- # 使用的模型名称
- model_name = Column(
- String(255),
- nullable=False,
- comment="使用的模型名称"
- )
- # 搜索策略
- search_strategy = Column(
- String(10),
- nullable=False,
- comment="搜索策略:turbo/max/agent"
- )
- # 搜索次数
- search_count = Column(
- Integer,
- nullable=False,
- default=1,
- comment="搜索次数"
- )
- # 搜索成本
- search_cost = Column(
- Numeric(10, 4),
- nullable=False,
- default=0.0000,
- comment="搜索成本"
- )
- # 创建时间
- created_at = Column(
- DateTime,
- nullable=False,
- server_default=func.now(),
- comment="创建时间"
- )
- # 表级配置
- __table_args__ = (
- Index('idx_search_usage_log_user_id', 'user_id'),
- Index('idx_search_usage_log_conversation_id', 'conversation_id'),
- Index('idx_search_usage_log_user_created', 'user_id', 'created_at'),
- Index('idx_search_usage_log_created_at', 'created_at'),
- Index('idx_search_usage_log_model_name', 'model_name'),
- CheckConstraint(
- "search_strategy IN ('turbo', 'max', 'agent')",
- name='chk_search_usage_strategy'
- ),
- CheckConstraint(
- "search_count > 0",
- name='chk_search_count'
- ),
- CheckConstraint(
- "search_cost >= 0",
- name='chk_search_cost'
- ),
- {'schema': 'aigcspace', 'comment': '搜索使用记录表,用于统计和计费'}
- )
- def __repr__(self):
- return f"<SearchUsageLog(id={self.id}, user_id='{self.user_id}', strategy='{self.search_strategy}', cost={self.search_cost})>"
|