【免费下载链接】freehirefreehire — the open-source search engine for job seekers项目地址https://gitcode.com/gh_mirrors/fr/freehire点击查看免费下载freehire 是一个开源的招聘搜索引擎它的核心能力在于把分散在全球各地的招聘信息汇成一张可搜索、可筛选的统一版图截至最新目录快照freehire 从225 个数据源中抓取了330 万 条在招职位覆盖29.4 万家公司其中92 个 ATS 平台Applicant Tracking System招聘管理系统贡献了绝对大头。这篇文章带你用 10 分钟看懂这张数据版图的分层结构、抓取调度机制以及那些对外公布的数字是如何保持准确的。上图是项目对外展示的数据概览卡片卡片数字为较早一次快照本文以最新目录快照为准。职位数据分三层ATS 平台、聚合站、企业官网freehire 把所有数据源归为三种类型这个分类不是人工维护的配置而是直接由适配器的 Go 类型推导出来的定义逻辑位于 internal/ingest/sources/ 包中。每层的规模如下完整清单见 docs/sources.md层级数量覆盖公司在招职位 ATS 平台92 个157,3992,644,796 聚合站与招聘板100 个172,884629,571️ 企业招聘官网30 个5926,222注意同一家公司可能同时出现在多个来源下所以各层公司数相加会大于 29.4 万这个去重后的总数。ATS 平台真正的数据主力92 个 ATS 平台贡献了近 264 万条在招职位占全库的 80%。几个头部玩家的数据量级感受一下workday4,202 家公司74.8 万条职位单一平台最大trudvsem7.0 万家公司的长尾覆盖王26.7 万条职位smartrecruiters / oracle / greenhouse各自 15 万22 万条职位长尾同样惊人从 phenom 到只有 1 家公司的 epam最末位的数据源也稳定产出。每个 ATS 平台对应 internal/ingest/sources/ 下一个独立适配器文件如workday.go、greenhouse.go全部实现同一个Source接口所以新平台接入的工作量是有界的。聚合站与企业官网补充覆盖与一手数据聚合站Adzuna、hh、whatjobs 系列、Telegram 频道等 100 个来源价值在于覆盖面广其中 whatjobs 一个系列就分拆出 40 多个国家/地区站点。而 30 个企业招聘官网来源则是一手数据Amazon 单家 7,680 条、Apple 4,268 条、Google 3,452 条职位直接来自公司自己的招聘页面绕过了任何中间商。抓取调度一次一平台的单程工模式freehire 的抓取不是一个常驻爬虫进程跑所有平台而是run-once-and-exit worker运行一次即退出模型调度入口在 cmd/ingest/main.go每次运行只处理一个平台——比如这一次跑greenhouse、下一次跑lever各平台按自己的节奏独立调度慢平台永远不阻塞快平台。数据源目录是纯数据——boards表每行对应某公司在某 ATS 平台上的某个看板provider board region建表语句见 migrations/0123_boards.sql调度周期配置见 migrations/0132_ingest_schedule.sql。统一流水线——每次运行把抓到的原始页面交给 internal/ingest/pipeline/pipeline.go 中的pipeline.Runner抓取 → 归一化成单一 schema → 去重 → 写入数据库。失败有冷却——某个看板持续失败会进入记录的冷却期而不是每次运行都反复重试。这种设计的妙处worker 之间不共享内存所有协调都落在 Postgres 上因此系统里看不到常驻的任务队列守护进程排障和扩容都直白得多。架构全貌可参考 docs/architecture.md。从原始职位到搜索结果一条职位的完整路径抓到一条职位只是开始它还要经历三步才能出现在搜索结果里阶段机制关键实现去重以(source, external_id)为唯一键 upsert重复抓取零成本jobs表唯一约束事务出站队列新职位写入同一事务中投递到enrichment_outbox/search_outbox事务性 outbox批量索引进 Meilisearchcmd/search-drain/ 把整批文档作为单个任务推入索引批量合并避免打满磁盘 IO上图是 freehire 的职位搜索主页左侧可按地区、工作形式、技术栈、资历等维度筛选——这些筛选维度的数据正来自上文各层数据源的归一化字段。一个值得注意的工程细节Meilisearch 每次推送都会对全量约 270 万条文档重建倒排索引实测 90180 秒所以早期每个看板进程各自直推的设计曾打满宿主磁盘 IO现在统一由出站队列把大量小推送合并成少量大批次——这也是为什么未变化的重复抓取只刷新时间戳、不触发重索引。数字从哪来快照保证全站口径一致文章开头的 330 万、29.4 万这些数字并不是各个页面各自实时估算的——那会导致关于页和开放 API说的数对不上。freehire 的做法是catalogstatsinternal/ingest/catalogstats/catalogstats.go定时 worker 精确统计一次全库快照在招职位数、公司数、平台数随后全站所有引用目录规模的页面都读同一个Snapshot口径天然一致。sourcestatsinternal/ingest/sourcestats/sourcestats.go把每天的按来源分组测量折叠成source_stats快照行驱动每个数据源的公开统计页。统计还刻意区分了测量失败和测量结果为零两种状态避免公开页面把一个仍在运行的来源错误地显示为 0 条职位——这种细节决定了用户看到的数据是否可信。版图还在长大新增一家公司只需一行数据freehire 的数据版图并非静态它靠社区持续生长而扩容成本被刻意压到最低加一家已在支持平台上的公司boards目录里加一行company provider board。可以直接在网站的 contribute a board 表单提交或用go run ./cmd/add-board命令实现见 cmd/add-board/main.go新行首次爬取成功后自动转正。加一个全新的 ATS 平台 在 internal/ingest/sources/ 写一个适配器 注册表加一行工作量是有界的因为所有适配器说同一种语言Source接口。下线一个看板 把该行状态翻成retired永不删除——爬虫只爬活行误操作随时可逆。快速上手按这个顺序读项目资料想了解的内容去哪里看项目全貌与数据分层README.md每个数据源的详细计数docs/sources.md系统架构与数据流docs/architecture.md数据源适配器源码internal/ingest/sources/抓取流水线internal/ingest/pipeline/看板目录数据源清单internal/ingest/boardcatalog/上图演示了用 Remote Global/Worldwide 组合筛选远程职位的效果——这类跨来源的联合筛选正是 225 个数据源归一化的直接收益。一句话总结freehire 的数据版图 三层来源结构ATS 平台为主力 一次一平台的单程工抓取 事务化出站队列索引 统一快照统计。理解了这四件事你就理解了这 330 万条职位是如何被搭起来的以及它为什么还能持续长大。赞分享【免费下载链接】freehirefreehire — the open-source search engine for job seekers项目地址https://gitcode.com/gh_mirrors/fr/freehire点击查看免费下载相关推荐从 2 万到 3.3 万星RustFS 的中文社区口碑是怎么滚起来的从 2 万到 3.3 万星RustFS 的中文社区口碑是怎么滚起来的 一个开源项目在 GitHub 上从 2 万星滚到 3.3 万星意味着它在数月内让上万名对象存储存储后端MMPR 300 万偏好数据是怎么来的InternVL2_5-8B-MPO 多模态偏好数据集构造管线拆解MMPR 300 万偏好数据是怎么来的InternVL2_5 8B MPO 多模态偏好数据集构造管线拆解 InternVL2_5 8B MPO 是一个经过 混视频编辑全球第一H3 发布数据是怎么算出来的视频编辑全球第一H3 发布数据是怎么算出来的 2026 年 7 月底MiniMax 正式发布 H3 并宣布开放权重随之而来的是一连串极具冲击力的宣传口大模型多模态媒体生成视频音频上一篇多语言PDF对比工具使用PolyglotPDF进行原文与译文对照下一篇情侣专属微信小程序把恋爱玩成双人游戏任务攒积分让感情天天升温创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考