评分设计
当前评分模型组合了四类信号:
- 总反向依赖包数
- 180 天滚动窗口内的近期反向依赖数
- 可选的下载量快照
- 基于最新发布时间的活跃度乘数
为什么使用这些信号
- 总反向依赖代表已经形成的生态采用度。
- 近期反向依赖用于捕捉新增集成速度,而不只看历史积累。
- 下载量在可用时提供额外的人气线索。
- 发布时间乘数用于抑制长期停更包长期霸榜,但不会让“新”成为唯一优势。
当前公式
text
score =
(ln(dependents + 1) * 38
+ ln(recent_dependents + 1) * 27
+ ln(downloads + 1) * 22)
* activity_multiplier(days_since_release)这里使用对数是为了压缩超大包的量级差异,避免榜单退化成单纯的依赖数排序。
当前活跃度乘数
<= 30天:1.12<= 90天:1.06<= 180天:1.00<= 365天:0.94> 365天:0.88
分档与动量标签
分档是对分数的粗粒度映射:
S >= 260A >= 180B >= 110C >= 50D < 50
动量标签规则由 MoonBit 导出,并在 Python 构建流程里物化为服务层数据:
Rising:增长值>= 35、增长比>= 0.35、近期反向依赖>= 3Hot:增长值>= 18、增长比>= 0.18、近期反向依赖>= 2Stable:其余情况
因此动量标签会作为索引与服务层数据持久化,但规则定义以 MoonBit 为准。
数据流
scripts/build_index.py从本地 MoonBit 注册表快照读取*.index记录。- 构建器在 SQLite 中重建 packages、versions、dependencies、package_edges 和全文检索索引。
- Python 管线通过本地 MoonBit CLI 计算评分快照、等级标签、活动系数和动量标签。
src/score对外暴露评分、等级和动量相关逻辑,src/cli通过本地 CLI 形式把这些规则提供给 Python 构建流程。lib/query.ts定义了服务端与前端共用的查询 AST、原生表达式解析器、序列化器和兼容辅助逻辑。- Next.js 应用读取生成后的 SQLite 数据库,提供榜单、搜索、图形化高级检索和包分析页面与 API。
实现约束
仓库当前让 Python 保留索引与 SQLite 物化职责,但将评分快照、等级映射和动量 分类规则集中到 MoonBit,并通过本地 CLI 供构建流程调用。