我只想参加有关[X]的课程,但是搜索在线目录非常慢,而且我的结果在很大程度上无关紧要。 wtf?
哈佛有许多课程搜索网站,但它们都不好。该项目试图更加认真地考虑:编写高性能软件并设定出色的默认设置,以便人们能够变得更好,更有用的建议更快100倍。
class.wtf是一款以GO编写的自定义,分布式搜索引擎,重点介绍结果的速度和质量。它建立在作为应用程序子过程中运行的内存REDIS数据库。该索引支持所有字段上的全文模糊和前缀搜索,以及丰富的查询语法。
前端是一个带有Svelte的静态网站,它在每次击键后立即处理搜索查询。目的是为整个{请求,计算,响应和渲染}管道的占地30毫秒以下。
“现在只挂一秒钟,”我听到你说。光速不足以使数据在这个潜伏期中传播到世界各地!但是不用担心,这很好。我们使用fly.io在地理分布的位置运行多个复制品,并将路由请求到最近。每个副本都运行自己的全文查询引擎,因此它们是完全独立的。
(马萨诸塞州剑桥的最近的服务器复制品居住在新泽西州的塞索库斯,仅200英里。)
你为什么做这个?我对搜索课程有多烦人感到沮丧。我是一名系统软件工程师,这几乎使我的任务更快。
为什么要写?因为我在一个周末写了这篇文章,需要一种非常快速的系统语言才能迭代,同时又有延迟较低。 Go的简单性和编译时代有助于这一点。如果我决定再花几个星期,我可能会在Rust中重写它。
你为什么要使用redis?它确实很快,它将数据存储在内存中,API简单稳健,并且具有一流的全文搜索模块。对于数据集的这一大小,嵌入REDIS可为您提供无与伦比的性能,而替代方案的成本和精力很少。
你能为我的学校做这个吗?代码都是开源的,欢迎您查看或移植它!如果您这样做,请还考虑在Twitter @ekzhang1或通过电子邮件中与您联系,因为我很想听听您的工作。
数据来自哪里?该课程目录是从在线公开的课程标题和描述中索引的。请参阅datasource/文件夹中的代码。
您需要走1.20,而Docker才能在后端进行后端。
这将在2022年春季之前(AY 2022)和我的。从2022年秋季开始(AY 2023)之前,从课程中加载数据。如果您想索引不同的课程,则可以自定义数据加载脚本。
go run . download -year 2019 # -> data/courses-2019.json
go run . download -year 2020 # -> data/courses-2020.json
# ... and so on
go run . download -year 2025 # -> data/courses-2025.json不幸的是,My.harvard不允许您查看上学年的课程,因此2023年和当前的课程可能不会返回任何数据。对于这些,您可以从我们的公共S3存储桶中下载适当的预加载数据集。
有关预加载数据的历史记录:
拥有年度课程数据后,您可以将它们组合起来以形成一个courses.json文件与所有课程,可以通过WebApp搜索。
go run . combine这查找所有名为data/courses-{year}.json并将其合并。
您也可以进行反向,将单个data/courses.json分配到多个data/courses-{year}.json中。
go run . split该服务器在端口7500上听Web请求。(它还在端口7501上使用Docker催生了Redis实例。)
go run . server -local -data data/courses.json您也可以使用其他数据文件运行。例如,如果您通过data/courses-2021.json ,您只会获得从2020年秋季到2021年春季学年的搜索结果。
现在,您可以在前端开发,该前端会自动将API请求授予服务器端口。
npm install
npm run dev
访问localhost:5173查看网站。
docker build -t classes.wtf .
docker run -it --rm -p 7500:7500 classes.wtfaws s3 cp data/courses- $YEAR .json s3://classes.wtf
aws s3 cp data/courses.json s3://classes.wtffly deploy请参阅贡献者页面。可以通过电子邮件[email protected]与当前的维护者联系。根据MIT许可获得许可。
多亏了许多学生在大学社区中宣传该网站的学生。