Je veux juste suivre un cours sur [x], mais la recherche du catalogue en ligne est si lente, et mes résultats sont largement hors de propos. Wtf?
Harvard a de nombreux sites de recherche de cours, mais aucun d'eux n'est bon. Ce projet est une tentative de prendre le problème plus au sérieux: écrivez des logiciels haute performance et définissez de grandes valeurs par défaut afin que les gens puissent s'améliorer, des suggestions plus utiles, 100x plus rapidement.
Classes.WTF est un moteur de recherche personnalisé et distribué écrit en Go qui se concentre sur la vitesse et la qualité des résultats. Il est construit sur une base de données Redis en mémoire qui s'exécute en tant que sous-processus de l'application. Cet index prend en charge la recherche floue et préfixe de texte complet sur tous les champs, ainsi qu'une riche syntaxe de requête.
Le frontend est un site Web statique construit avec Svelte, et il traite les requêtes de recherche immédiatement après chaque touche. L'objectif est que le pipeline entier {demande, calcul, réponse et rendu} prenne moins de 30 millisecondes.
"Maintenant, accrochez-vous juste une seconde", je vous entends dire. La vitesse de la lumière n'est pas assez rapide pour que les données se déplacent dans le monde entier à cette latence! Mais ne vous inquiétez pas, c'est bien. Nous exécutons plusieurs répliques dans des emplacements géographiquement distribués à l'aide de Fly.io et des demandes d'itinéraire vers la plus proche. Chaque réplique exécute son propre moteur de requête en texte intégral, ils sont donc complètement indépendants.
(La réplique du serveur la plus proche de Cambridge, MA vit à Secaucus, NJ, à seulement 200 miles de là.)
Pourquoi avez-vous fait cela? J'étais frustré par la façon dont il était ennuyeux de rechercher des cours. Et je suis un ingénieur logiciel de systèmes, ce qui en fait à peu près mon mandat de rendre les choses plus rapides.
Pourquoi est-il écrit en Go? Parce que j'ai écrit ceci en un week-end et que j'avais besoin d'un langage de systèmes très rapide pour itérer tout en ayant une faible latence. Les temps de simplicité et de compilation de Go ont aidé à cela. Je pourrais le réécrire à Rust si je décide de passer quelques semaines de plus.
Pourquoi utilisez-vous Redis? Il est vraiment rapide, il stocke les données en mémoire, l'API est simple et robuste, et il dispose d'un module de recherche en texte intégral le meilleur. Pour cette taille de l'ensemble de données, l'intégration de Redis vous donne des performances inégalées avec une fraction du coût et de l'effort des alternatives.
Pouvez-vous faire ça pour mon école? Le code est entièrement open-source, et vous êtes invités à jeter un œil ou à le porter! Si vous faites cela, veuillez également envisager de tendre la main sur Twitter @ ekzhang1 ou par e-mail, car j'aimerais entendre parler de votre travail.
Où les données proviennent-elles? Le catalogue de cours a été indexé à partir des titres de cours et descriptions accessibles au public en ligne. Voir le code dans le dossier datasource/ .
Vous avez besoin de Go 1.20 et Docker travaille sur le backend et Node.js V18 pour le frontend.
Cela charge les données du programme pour les termes académiques avant le printemps 2022 (AY 2022) et de My.Harvard à partir de l'automne 2022 (AY 2023). Vous pouvez personnaliser le script de chargement de données si vous souhaitez indexer un autre ensemble de cours.
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.jsonMalheureusement, My.Harvard ne vous permet pas de consulter les cours des années universitaires précédentes, donc les années entre 2023 et la celle actuelle ne rendront probablement aucune donnée. Pour ceux-ci, vous pouvez télécharger les ensembles de données préchargés appropriés à partir de notre seau public S3.
Notes historiques sur les données préchargées:
Une fois que vous avez les données de cours d'année, vous pouvez les combiner pour former un seul courses.json avec tous les cours, qui peuvent être recherchés par le WebApp.
go run . combine Cela recherche tous les fichiers nommés data/courses-{year}.json et les fusionne.
Vous pouvez également faire l'inverse, divisant une seule data/courses.json en plusieurs data/courses-{year}.json .
go run . splitLe serveur écoute les demandes Web sur le port 7500. (Il engendre également une instance Redis, en utilisant Docker, sur le port 7501.)
go run . server -local -data data/courses.json Vous pouvez également l'exécuter avec d'autres fichiers de données. Par exemple, si vous passez data/courses-2021.json , vous n'obtiendrez les résultats de la recherche que pour l'année académique de l'automne 2020 au printemps 2021.
Vous pouvez maintenant vous développer sur le frontend, qui proxie automatiquement les demandes d'API au port de serveur.
npm install
npm run dev
Visitez localhost:5173 pour voir le site 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 deployVoir la page des contributeurs. Les responsables actuels peuvent être joints par e-mail à [email protected]. Licencié sous la licence du MIT.
Merci à de nombreux étudiants qui ont aidé à annoncer le site dans les communautés universitaires.