Ich möchte nur eine Klasse über [x] besuchen, aber die Suche im Online -Katalog ist so langsam, und meine Ergebnisse sind weitgehend irrelevant. WTF?
Harvard hat viele Websites für Kurssuche, aber keiner von ihnen ist gut. Dieses Projekt ist ein Versuch, das Problem ernst zu nehmen: Schreiben Sie Hochleistungssoftware und setzen Sie großartige Standardeinstellungen, damit die Menschen bessere und nützlichere Vorschläge erhalten können, 100x schneller.
CLUSS.WTF ist eine benutzerdefinierte, verteilte Suchmaschine, die in GO geschrieben wurde, die sich auf die Geschwindigkeit und Qualität der Ergebnisse konzentriert. Es basiert auf einer In-Memory-Datenbank, die als Teilprozess der Anwendung ausgeführt wird. Dieser Index unterstützt die Ful-Text-Fuzzy- und Präfix-Suche auf allen Feldern sowie eine reichhaltige Abfrage-Syntax.
Das Frontend ist eine statische Website, die mit SVELTE erstellt wurde, und es verarbeitet unmittelbar nach jedem Tastenanschlag Suchanfragen. Das Ziel ist für die gesamte Pipeline für Anfrage, Berechnung, Antwort und Render}, um weniger als 30 Millisekunden zu nehmen.
"Jetzt bleib nur eine Sekunde", höre ich dich sagen. Die Lichtgeschwindigkeit ist nicht schnell genug, damit Daten in dieser Latenz um die Welt reisen können! Aber keine Sorge, das ist in Ordnung. Wir führen mehrere Replikate an geografisch verteilten Standorten mit Fly.io und Routenanfragen auf die nächste aus. Jedes Replikat führt seine eigene Volltext-Abfrage-Engine aus, sodass sie völlig unabhängig sind.
(Die nächste Server -Replik nach Cambridge, MA, lebt in Secaucus, NJ, nur 200 Meilen entfernt.)
Warum hast du das gemacht? Ich war frustriert darüber, wie ärgerlich es war, nach Klassen zu suchen. Und ich bin ein System -Software -Ingenieur, der es so gut wie ein Mandat macht, die Dinge schneller zu machen.
Warum ist es in Go geschrieben? Weil ich dies an einem Wochenende geschrieben habe und eine sehr schnelle Systemsprache brauchte, um sie zu iterieren und gleichzeitig eine geringe Latenz zu haben. Go's Einfachheit und Kompilierung haben dabei geholfen. Ich könnte es in Rost umschreiben, wenn ich mich entscheide, noch ein paar Wochen damit zu verbringen.
Warum benutzt du Redis? Es ist sehr schnell, es speichert Daten im Speicher, die API ist einfach und robust und hat ein erstklassiges Volltext-Suchmodul. Für diese Größe des Datensatzes bietet das Einbetten von Redis eine unübertroffene Leistung mit einem Bruchteil der Kosten und der Anstrengung von Alternativen.
Kannst du das für meine Schule machen? Der Code ist alles Open-Source, und Sie können gerne einen Blick darauf werfen oder ihn portieren! Wenn Sie dies tun, sollten Sie sich bitte auch auf Twitter @ekzhang1 oder per E -Mail wenden, da ich gerne über Ihre Arbeit hören würde.
Wo sind die Daten bezogen? Der Kurskatalog wurde aus öffentlich verfügbaren Kursbezeichnungen und Beschreibungen online indiziert. Siehe den Code im datasource/ Ordner.
Sie müssen Go 1.20 und Docker für den Frontend am Backend und Node.js v18 arbeiten.
Dies lädt Daten aus dem Lehrplan für akademische Begriffe vor dem Frühjahr 2022 (AY 2022) und aus My.Harvard ab Herbst 2022 (AY 2023). Sie können das Datenladungsskript anpassen, wenn Sie eine andere Reihe von Kursen indexieren möchten.
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.jsonLeider erlaubt My.Harvard Sie nicht, Kurse aus früheren akademischen Jahren anzusehen, sodass Jahre zwischen 2023 und die aktuelle Daten wahrscheinlich keine Daten zurückgeben werden. Für diese können Sie die entsprechenden vorinstallierten Datensätze aus unserem öffentlichen S3 -Bucket herunterladen.
Historische Notizen zu vorinstallierten Daten:
Sobald Sie die Kursdaten von Jahr zu Jahr haben, können Sie sie so kombinieren, dass Sie eine einzelne courses.json Datei mit allen Kursen erstellen, die von der WebApp durchsucht werden können.
go run . combine Dies sucht für alle Dateien mit dem Namen data/courses-{year}.json und verschmilzt sie.
Sie können auch das Inverse durchführen und ein einzelnes data/courses.json in mehreren data/courses-{year}.json .
go run . splitDer Server hört auf Webanforderungen auf Port 7500 zu.
go run . server -local -data data/courses.json Sie können es auch mit anderen Datendateien ausführen. Wenn Sie beispielsweise data/courses-2021.json bestehen, erhalten Sie nur Suchergebnisse für das akademische Jahr vom Herbst 2020 bis zum Frühjahr 2021.
Jetzt können Sie sich am Frontend entwickeln, der API -Anforderungen automatisch an den Serverport stellt.
npm install
npm run dev
Besuchen Sie localhost:5173 um die Website zu sehen.
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 deploySiehe Seite der Mitwirkenden. Aktuelle Betreuer können per E -Mail unter [email protected] erreicht werden. Lizenziert unter der MIT -Lizenz.
Vielen Dank an zahlreiche Studenten, die bei der Werbung für die Website in College -Communities geholfen haben.