refactor: remove Gorse integration and implement HotRank feature
- Removed Gorse-related configurations, handlers, and dependencies from the codebase. - Introduced HotRank feature with configuration options for ranking posts based on recent activity. - Updated application structure to support HotRank processing, including new caching mechanisms and database interactions. - Cleaned up related DTOs and repository methods to reflect the removal of Gorse and the addition of HotRank functionality.
This commit is contained in:
@@ -22,13 +22,13 @@ type Config struct {
|
||||
Log LogConfig `mapstructure:"log"`
|
||||
RateLimit RateLimitConfig `mapstructure:"rate_limit"`
|
||||
Upload UploadConfig `mapstructure:"upload"`
|
||||
Gorse GorseConfig `mapstructure:"gorse"`
|
||||
OpenAI OpenAIConfig `mapstructure:"openai"`
|
||||
Email EmailConfig `mapstructure:"email"`
|
||||
ConversationCache ConversationCacheConfig `mapstructure:"conversation_cache"`
|
||||
GRPC GRPCConfig `mapstructure:"grpc"`
|
||||
Casbin CasbinConfig `mapstructure:"casbin"`
|
||||
Encryption EncryptionConfig `mapstructure:"encryption"`
|
||||
HotRank HotRankConfig `mapstructure:"hot_rank"`
|
||||
}
|
||||
|
||||
// Load 加载配置文件
|
||||
@@ -97,14 +97,6 @@ func Load(configPath string) (*Config, error) {
|
||||
viper.SetDefault("sensitive.replace_str", "***")
|
||||
viper.SetDefault("audit.enabled", false)
|
||||
viper.SetDefault("audit.provider", "local")
|
||||
viper.SetDefault("gorse.enabled", false)
|
||||
viper.SetDefault("gorse.address", "http://localhost:8087")
|
||||
viper.SetDefault("gorse.api_key", "")
|
||||
viper.SetDefault("gorse.dashboard", "http://localhost:8088")
|
||||
viper.SetDefault("gorse.import_password", "")
|
||||
viper.SetDefault("gorse.embedding_api_key", "")
|
||||
viper.SetDefault("gorse.embedding_url", "https://api.littlelan.cn/v1/embeddings")
|
||||
viper.SetDefault("gorse.embedding_model", "BAAI/bge-m3")
|
||||
viper.SetDefault("openai.enabled", true)
|
||||
viper.SetDefault("openai.base_url", "https://api.littlelan.cn/")
|
||||
viper.SetDefault("openai.api_key", "")
|
||||
@@ -152,6 +144,12 @@ func Load(configPath string) (*Config, error) {
|
||||
viper.SetDefault("encryption.enabled", false)
|
||||
viper.SetDefault("encryption.key", "")
|
||||
viper.SetDefault("encryption.key_version", 1)
|
||||
viper.SetDefault("hot_rank.enabled", true)
|
||||
viper.SetDefault("hot_rank.refresh_interval_seconds", 300)
|
||||
viper.SetDefault("hot_rank.top_n", 100)
|
||||
viper.SetDefault("hot_rank.recent_window_hours", 168)
|
||||
viper.SetDefault("hot_rank.recent_fetch_limit", 500)
|
||||
viper.SetDefault("hot_rank.candidate_cap", 800)
|
||||
|
||||
if err := viper.ReadInConfig(); err != nil {
|
||||
return nil, fmt.Errorf("failed to read config: %w", err)
|
||||
@@ -203,13 +201,6 @@ func Load(configPath string) (*Config, error) {
|
||||
cfg.Server.Host = getEnvOrDefault("APP_SERVER_HOST", cfg.Server.Host)
|
||||
cfg.Server.Port, _ = strconv.Atoi(getEnvOrDefault("APP_SERVER_PORT", fmt.Sprintf("%d", cfg.Server.Port)))
|
||||
cfg.Server.Mode = getEnvOrDefault("APP_SERVER_MODE", cfg.Server.Mode)
|
||||
cfg.Gorse.Address = getEnvOrDefault("APP_GORSE_ADDRESS", cfg.Gorse.Address)
|
||||
cfg.Gorse.APIKey = getEnvOrDefault("APP_GORSE_API_KEY", cfg.Gorse.APIKey)
|
||||
cfg.Gorse.Dashboard = getEnvOrDefault("APP_GORSE_DASHBOARD", cfg.Gorse.Dashboard)
|
||||
cfg.Gorse.ImportPassword = getEnvOrDefault("APP_GORSE_IMPORT_PASSWORD", cfg.Gorse.ImportPassword)
|
||||
cfg.Gorse.EmbeddingAPIKey = getEnvOrDefault("APP_GORSE_EMBEDDING_API_KEY", cfg.Gorse.EmbeddingAPIKey)
|
||||
cfg.Gorse.EmbeddingURL = getEnvOrDefault("APP_GORSE_EMBEDDING_URL", cfg.Gorse.EmbeddingURL)
|
||||
cfg.Gorse.EmbeddingModel = getEnvOrDefault("APP_GORSE_EMBEDDING_MODEL", cfg.Gorse.EmbeddingModel)
|
||||
cfg.OpenAI.BaseURL = getEnvOrDefault("APP_OPENAI_BASE_URL", cfg.OpenAI.BaseURL)
|
||||
cfg.OpenAI.APIKey = getEnvOrDefault("APP_OPENAI_API_KEY", cfg.OpenAI.APIKey)
|
||||
cfg.OpenAI.ModerationModel = getEnvOrDefault("APP_OPENAI_MODERATION_MODEL", cfg.OpenAI.ModerationModel)
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
package config
|
||||
|
||||
// GorseConfig Gorse 推荐系统配置
|
||||
type GorseConfig struct {
|
||||
Address string `mapstructure:"address"`
|
||||
APIKey string `mapstructure:"api_key"`
|
||||
Enabled bool `mapstructure:"enabled"`
|
||||
Dashboard string `mapstructure:"dashboard"`
|
||||
ImportPassword string `mapstructure:"import_password"`
|
||||
EmbeddingAPIKey string `mapstructure:"embedding_api_key"`
|
||||
EmbeddingURL string `mapstructure:"embedding_url"`
|
||||
EmbeddingModel string `mapstructure:"embedding_model"`
|
||||
// HotRankConfig 热门榜定时重算(仅 Redis ZSET + 分层缓存中的 Top ID 列表,不写库)
|
||||
type HotRankConfig struct {
|
||||
Enabled bool `mapstructure:"enabled"`
|
||||
RefreshIntervalSeconds int `mapstructure:"refresh_interval_seconds"`
|
||||
// TopN 写入缓存的热门条数(ZSET 与 top_ids 列表长度上限)
|
||||
TopN int `mapstructure:"top_n"`
|
||||
// RecentWindowHours 候选池:该时间窗内新发的帖子 ID 会参与本轮重算
|
||||
RecentWindowHours int `mapstructure:"recent_window_hours"`
|
||||
// RecentFetchLimit 时间窗内最多拉取的帖子 ID 数(按 created_at 倒序)
|
||||
RecentFetchLimit int `mapstructure:"recent_fetch_limit"`
|
||||
// CandidateCap 候选 ID 合并后的上限(上届 Top + 新帖去重后截断)
|
||||
CandidateCap int `mapstructure:"candidate_cap"`
|
||||
}
|
||||
|
||||
// OpenAIConfig OpenAI 配置
|
||||
|
||||
Reference in New Issue
Block a user