Saya hanya ingin mengambil kelas tentang [x] tetapi mencari katalog online sangat lambat, dan hasil saya sebagian besar tidak relevan. WTF?
Harvard memiliki banyak situs web pencarian kursus, tetapi tidak ada yang baik. Proyek ini merupakan upaya untuk menangani masalah dengan lebih serius: tulis perangkat lunak berkinerja tinggi dan menetapkan default yang bagus sehingga orang bisa mendapatkan saran yang lebih baik, lebih berguna, 100x lebih cepat.
Class.wtf adalah mesin pencari terdistribusi khusus yang ditulis dalam Go yang berfokus pada kecepatan dan kualitas hasil. Ini dibangun di atas basis data Redis dalam memori yang berjalan sebagai subproses aplikasi. Indeks ini mendukung pencarian fuzzy teks lengkap dan awalan di semua bidang, bersama dengan sintaks kueri yang kaya.
Frontend adalah situs web statis yang dibangun dengan langsing, dan memproses permintaan pencarian segera setelah setiap tombol. Tujuannya adalah untuk seluruh pipa {permintaan, perhitungan, respons, dan render} untuk mengambil di bawah 30 milidetik.
"Sekarang tunggu sebentar," aku mendengarmu berkata. Kecepatan cahaya tidak cukup cepat untuk data perjalanan keliling dunia pada latensi ini! Tapi jangan khawatir, ini baik -baik saja. Kami menjalankan beberapa replika di lokasi yang didistribusikan secara geografis menggunakan Fly.io dan rute permintaan ke yang terdekat. Setiap replika menjalankan mesin kueri teks lengkapnya sendiri, sehingga mereka benar-benar independen.
(Replika server terdekat ke Cambridge, MA tinggal di Secaucus, NJ, hanya 200 mil jauhnya.)
Mengapa Anda membuat ini? Saya frustrasi dengan betapa menjengkelkannya mencari kelas. Dan saya seorang insinyur perangkat lunak sistem, yang cukup banyak menjadikannya mandat saya untuk membuat segalanya lebih cepat.
Mengapa ditulis di Go? Karena saya menulis ini di akhir pekan dan membutuhkan bahasa sistem yang sangat cepat untuk beralasan sementara juga memiliki latensi rendah. Kesederhanaan GO dan kompilasi waktu membantu ini. Saya mungkin menulis ulang dengan karat jika saya memutuskan untuk menghabiskan beberapa minggu lagi.
Mengapa Anda menggunakan Redis? Ini sangat cepat, ia menyimpan data dalam memori, API sederhana dan kuat, dan memiliki modul pencarian teks lengkap terbaik di kelasnya. Untuk ukuran dataset ini, menanamkan Redis memberi Anda kinerja yang tak tertandingi dengan sebagian kecil dari biaya dan upaya alternatif.
Bisakah Anda membuat ini untuk sekolah saya? Kode ini semuanya open-source, dan Anda dipersilakan untuk melihatnya atau port! Jika Anda melakukan ini, silakan juga pertimbangkan untuk menjangkau di Twitter @Ekzhang1 atau melalui email, karena saya ingin mendengar tentang pekerjaan Anda.
Dimana datanya bersumber? Katalog kursus diindeks dari judul dan deskripsi kursus yang tersedia untuk umum. Lihat kode di datasource/ folder.
Anda perlu pergi 1.20 dan Docker untuk mengerjakan backend dan node.js v18 untuk frontend.
Ini memuat data dari Curricle untuk istilah akademik sebelum musim semi 2022 (AY 2022) dan dari my.harvard mulai musim gugur 2022 (AY 2023). Anda dapat menyesuaikan skrip pemuatan data jika Anda ingin mengindeks serangkaian kursus yang berbeda.
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.jsonSayangnya, My.harvard tidak memungkinkan Anda untuk melihat kursus dari tahun -tahun akademik sebelumnya, jadi bertahun -tahun antara tahun 2023 dan yang saat ini mungkin tidak akan mengembalikan data apa pun. Bagi mereka, Anda dapat mengunduh dataset preloaded yang sesuai dari ember S3 publik kami.
Catatan Historis Tentang Data yang Dimuat sebelumnya:
Setelah Anda memiliki data kursus tahun demi tahun, Anda dapat menggabungkannya untuk membentuk satu file courses.json dengan semua kursus, yang dapat dicari oleh Webapp.
go run . combine Ini mencari semua file bernama data/courses-{year}.json dan menggabungkannya.
Anda juga dapat melakukan terbalik, membagi satu data/courses.json menjadi beberapa data/courses-{year}.json .
go run . splitServer mendengarkan permintaan web pada port 7500. (Ini juga memunculkan instance Redis, menggunakan Docker, pada port 7501.)
go run . server -local -data data/courses.json Anda juga dapat menjalankannya dengan file data lainnya. Misalnya, jika Anda lulus data/courses-2021.json , Anda hanya akan mendapatkan hasil pencarian untuk tahun akademik dari musim gugur 2020 hingga musim semi 2021.
Sekarang Anda dapat mengembangkan di frontend, yang secara otomatis proxy API permintaan ke port server.
npm install
npm run dev
Kunjungi localhost:5173 untuk melihat situs web.
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 deployLihat halaman Kontributor. Pemelihara saat ini dapat dihubungi melalui email di [email protected]. Berlisensi di bawah lisensi MIT.
Terima kasih kepada banyak siswa yang membantu mengiklankan situs di komunitas perguruan tinggi.