[X]についてクラスを受講したいだけですが、オンラインカタログの検索は非常に遅く、結果はほとんど無関係です。 wtf?
ハーバードは多くのコース検索ウェブサイトを持っていますが、どれも良いことはありません。このプロジェクトは、問題をより真剣に受け止めようとする試みです。高性能ソフトウェアを作成し、優れたデフォルトを設定して、人々がより良く、より便利な提案を100倍高速にすることができるようにします。
classes.wtfは、結果の速度と品質に焦点を当てたGOで記述されたカスタム分散検索エンジンです。これは、アプリケーションのサブプロセスとして実行されるインメモリRedisデータベースの上に構築されています。このインデックスは、すべてのフィールドでのフルテキストファジーとプレフィックス検索と、リッチクエリ構文をサポートします。
FrontEndは、Svelteで構築された静的なWebサイトであり、すべてのキーストロークの直後に検索クエリを処理します。目標は、{要求、計算、応答、およびレンダリング}パイプライン全体が30ミリ秒未満になることです。
「ちょっと待って」と言っているのが聞こえます。光の速度は、このレイテンシで世界中を移動するのに十分な速度ではありません!しかし、心配しないでください、これは大丈夫です。 fly.ioを使用して地理的に分散した場所で複数のレプリカを実行し、ルートリクエストを最も近い場所に実行します。各レプリカは独自のフルテキストクエリエンジンを実行するため、完全に独立しています。
(マサチューセッツ州ケンブリッジへの最寄りのサーバーレプリカは、ニュージャージー州セコーカスに住んでおり、わずか200マイル離れています。)
なぜこれを作ったのですか?クラスを検索するのがどれほど迷惑だったかに不満を感じました。そして、私はシステムソフトウェアエンジニアであり、物事をより速くすることを私の任務にしています。
なぜGOで書かれているのですか?私は週末にこれを書いたので、非常に速いシステム言語が必要だったからです。 Goのシンプルさとコンパイル時間はこれに役立ちました。さらに数週間を費やすことにした場合、錆で書き換えるかもしれません。
なぜRedisを使用しているのですか?それは非常に高速で、メモリにデータを保存し、APIはシンプルで堅牢で、クラス最高のフルテキスト検索モジュールを備えています。このサイズのデータセットの場合、Redisを埋め込むと、代替のコストと努力のほんの一部と比類のないパフォーマンスが得られます。
私の学校のためにこれを作ることができますか?コードはすべてオープンソースであり、見たりポートしたりすることを歓迎します!これを行っている場合は、Twitter @ekzhang1またはメールでご連絡ください。ご紹介をお待ちしております。
データはどこにありますか?コースカタログは、オンラインで公開されているコースのタイトルと説明からインデックス付けされました。 datasource/ Folderのコードを参照してください。
フロントエンドのバックエンドとnode.js v18で作業するには1.20とDockerが必要です。
これにより、2022年春(AY 2022)および2022年秋(AY 2023)から始まるMy.harvardの前に、学期のカリキュイルからのデータがロードされます。別のコースセットにインデックスを付けたい場合は、データ読み込みスクリプトをカスタマイズできます。
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ライセンスに基づいてライセンスされています。
大学のコミュニティでサイトを宣伝するのを手伝ってくれた多くの学生に感謝します。