Solo quiero tomar una clase sobre [x], pero buscar en el catálogo en línea es muy lento, y mis resultados son en gran medida irrelevantes. WTF?
Harvard tiene muchos sitios web de búsqueda de cursos, pero ninguno de ellos es bueno. Este proyecto es un intento de tomar el problema más en serio: escribir un software de alto rendimiento y establecer excelentes valores predeterminados para que las personas puedan obtener sugerencias mejores y más útiles, 100 veces más rápido.
Classes.wtf es un motor de búsqueda personalizado y distribuido escrito en GO que se centra en la velocidad y la calidad de los resultados. Se basa en una base de datos Redis en memoria que se ejecuta como un subproceso de la aplicación. Este índice admite la búsqueda de texto completo y prefijo en todos los campos, junto con una rica sintaxis de consulta.
El frontend es un sitio web estático construido con SVELTE, y procesa consultas de búsqueda inmediatamente después de cada pulsación de teclas. El objetivo es que la tubería completa de {solicitud, cálculo, respuesta y renderizado} tome menos de 30 milisegundos.
"Ahora espera solo un segundo", te escucho decir. ¡La velocidad de la luz no es lo suficientemente rápida como para que los datos viajen por el mundo en esta latencia! Pero no te preocupes, esto está bien. Ejecutamos múltiples réplicas en ubicaciones distribuidas geográficamente utilizando las solicitudes de Fly.io y Route al más cercano. Cada réplica ejecuta su propio motor de consulta de texto completo, por lo que son completamente independientes.
(La réplica del servidor más cercana a Cambridge, MA vive en Secaucus, NJ, a solo 200 millas de distancia).
¿Por qué hiciste esto? Estaba frustrado por lo molesto que era buscar clases. Y soy un ingeniero de software de sistemas, lo que hace que sea mi mandato hacer las cosas más rápido.
¿Por qué está escrito en Go? Porque escribí esto en un fin de semana y necesitaba un lenguaje de sistemas realmente rápido para iterar mientras también tenía baja latencia. La simplicidad y los tiempos de compilación de Go ayudaron con esto. Podría reescribirlo en Rust si decido pasar un par de semanas más en él.
¿Por qué estás usando Redis? Es realmente rápido, almacena datos en la memoria, la API es simple y robusta, y tiene un módulo de búsqueda de texto completo mejor en clase. Para este tamaño del conjunto de datos, la incrustación de Redis le brinda un rendimiento inigualable con una fracción del costo y el esfuerzo de las alternativas.
¿Puedes hacer esto para mi escuela? El código es todo de código abierto, ¡y puede echarle un vistazo o puerto! Si está haciendo esto, también considere comunicarse con Twitter @Ekzhang1 o por correo electrónico, ya que me encantaría saber sobre su trabajo.
¿Dónde se obtienen los datos? El catálogo del curso se indexó a partir de títulos y descripciones de cursos disponibles públicamente en línea. Consulte el código en la carpeta datasource/ .
Necesita Go 1.20 y Docker para trabajar en el backend y el nodo.js v18 para el frontend.
Esto carga datos del currículo para términos académicos antes de la primavera 2022 (AY 2022) y de mi. Harvard a partir del otoño 2022 (AY 2023). Puede personalizar el script de carga de datos si desea indexar un conjunto diferente de cursos.
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.jsonDesafortunadamente, My.Harvard no le permite ver cursos de años académicos anteriores, por lo que los años entre 2023 y el actual probablemente no devolverán ningún dato. Para ellos, puede descargar los conjuntos de datos precargados apropiados de nuestro cubo Public S3.
Notas históricas sobre datos precargados:
Una vez que tenga los datos del curso año por año, puede combinarlos para formar un solo archivo courses.json con todos los cursos, que la aplicación web puede buscar.
go run . combine Esto busca todos los archivos con nombre de data/courses-{year}.json y los fusiona.
También puede hacer lo inverso, dividiendo un solo data/courses.json en múltiples data/courses-{year}.json .
go run . splitEl servidor escucha las solicitudes web en el puerto 7500. (También genera una instancia de Redis, usando Docker, en el puerto 7501.)
go run . server -local -data data/courses.json También puede ejecutarlo con otros archivos de datos. Por ejemplo, si pasa data/courses-2021.json , solo obtendrá resultados de búsqueda para el año académico desde el otoño 2020 hasta la primavera 2021.
Ahora puede desarrollarse en la frontend, que automáticamente proxies solicita las solicitudes de API al puerto del servidor.
npm install
npm run dev
Visite localhost:5173 para ver el sitio 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 deployVea la página de contribuyentes. Los mantenedores actuales se pueden contactar por correo electrónico a [email protected]. Licenciado bajo la licencia del MIT.
Gracias a numerosos estudiantes que ayudaron a anunciar el sitio en las comunidades universitarias.