나는 [x] 에 대한 수업을 받고 싶지만 온라인 카탈로그를 검색하는 것은 너무 느리고 결과는 크게 관련이 없습니다. WTF?
하버드에는 많은 코스 검색 웹 사이트가 있지만 그 중 어느 것도 좋지 않습니다. 이 프로젝트는 문제를보다 진지하게 받아들이려는 시도입니다. 고성능 소프트웨어를 작성하고 사람들이 100 배 빠르게 더 나은 유용한 제안을 얻을 수 있도록 큰 기본값을 설정하십시오.
classes.wtf는 속도와 결과의 품질에 중점을 둔 맞춤형 분산 검색 엔진입니다. 애플리케이션의 하위 프로세스로 실행되는 메모리 인 Memory Redis 데이터베이스를 기반으로합니다. 이 색인은 풍부한 쿼리 구문과 함께 모든 필드에서 전체 텍스트 퍼지 및 접두사 검색을 지원합니다.
프론트 엔드는 Svelte로 구축 된 정적 웹 사이트이며 모든 KeyStroke 직후에 검색 쿼리를 처리합니다. 목표는 전체 {요청, 계산, 응답 및 렌더} 파이프 라인이 30 밀리 초 미만을 취하는 것입니다.
"이제 잠깐만 매달려." 이 지연 시간에 데이터가 전 세계를 여행하기에 충분한 빛의 속도가 충분하지 않습니다! 그러나 걱정하지 마십시오. 괜찮습니다. Fly.io 및 Route 요청을 가장 가까운 곳으로 사용하여 지리적으로 분산 된 위치에서 여러 복제본을 실행합니다. 각 복제본은 자체 전체 텍스트 쿼리 엔진을 실행하므로 완전히 독립적입니다.
(케임브리지에 가장 가까운 서버 복제본, MA는 200 마일 떨어진 뉴저지 주 세카 우 쿠스에 살고 있습니다.)
왜 이것을 만들었습니까? 나는 수업을 찾는 것이 얼마나 성가신지 좌절했습니다. 그리고 저는 시스템 소프트웨어 엔지니어입니다.
GO에 왜 쓰여 있습니까? 주말에 이것을 썼고 대기 시간이 낮 으면서 반복하기 위해 정말 빠른 시스템 언어가 필요했기 때문입니다. Go의 단순성과 컴파일 시간이이를 도왔습니다. 몇 주를 더 쓰기로 결정하면 Rust로 다시 작성할 수 있습니다.
왜 Redis를 사용하고 있습니까? 정말 빠르고 메모리에 데이터를 저장하고 API는 간단하고 강력하며 동급 최고의 전체 텍스트 검색 모듈이 있습니다. 이 규모의 데이터 세트의 경우 Redis를 포함 시키면 대안의 비용과 노력의 일부가 비교할 수없는 성능을 제공합니다.
내 학교를 위해 이것을 만들 수 있습니까? 이 코드는 모두 오픈 소스이며, 살펴 보거나 포트 할 수 있습니다! 이 작업을 수행하고 있다면 Twitter @ekzhang1 또는 이메일로 연락하는 것을 고려하십시오. 귀하의 작업에 대해 듣고 싶습니다.
데이터는 어디에 공급됩니까? 코스 카탈로그는 공개적으로 이용 가능한 코스 제목과 온라인 설명에서 색인화되었습니다. datasource/ 폴더의 코드를 참조하십시오.
프론트 엔드의 백엔드 및 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 버킷에서 적절한 사전로드 된 데이터 세트를 다운로드 할 수 있습니다.
사전로드 된 데이터에 대한 역사적 노트 :
1 년별 과정 데이터가 있으면이를 결합하여 단일 courses.json 형성 할 수 있습니다. json 파일은 모든 코스와 함께 웹 앱에서 검색 할 수 있습니다.
go run . combine 이것은 data/courses-{year}.json 이라는 모든 파일을 찾고 병합합니다.
단일 data/courses.json 여러 data/courses-{year}.json 로 분할하여 역전을 수행 할 수도 있습니다.
go run . split서버는 포트 7500의 웹 요청에 대해 듣습니다. (포트 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 라이센스에 따라 라이센스.
대학 커뮤니티에서 사이트를 광고하는 데 도움을 준 많은 학생들에게 감사합니다.