Я просто хочу взять класс о [x] , но поиск в онлайн -каталоге настолько медленная, и мои результаты в значительной степени не имеют значения. Wtf?
Гарвард имеет много сайтов поиска курса, но ни один из них не хорош. Этот проект является попыткой относиться к проблеме более серьезно: написать высокопроизводительное программное обеспечение и установить отличные значения по умолчанию, чтобы люди могли получить лучшие, более полезные предложения, в 100 раз быстрее.
Classes.WTF - это пользовательская, распределенная поисковая система, написанная в GO, которая фокусируется на скорости и качеством результатов. Он построен на базе данных Redis в памяти, которая работает как подпроцесс приложения. Этот индекс поддерживает полнотекстовый нечеткий и префикс поиск во всех полях, а также богатый синтаксис запросов.
Frontend - это статический веб -сайт, построенный с Svelte, и он обрабатывает поисковые запросы сразу после каждого клавиши. Цель состоит в том, что для всего {запроса, вычислений, ответа и рендеринга} - менее 30 миллисекунд.
«А теперь держись всего за секунду», - слышу я. Скорость света недостаточно быстро, чтобы данные могли путешествовать по всему миру при этой задержке! Но не волнуйтесь, это нормально. Мы запускаем несколько реплик в географически распределенных местах, используя Fly.io и запросы маршрута в ближайший. Каждая копия запускает свой собственный полнотекстовый двигатель запросов, поэтому они полностью независимы.
(Ближайшая реплика сервера в Кембридж, штат Массачусетс, живет в Секаукусе, штат Нью -Джерси, всего в 200 милях.)
Почему ты сделал это? Я был разочарован тем, насколько раздражающим было искать занятия. И я инженер -программист Systems, который в значительной степени делает мой мандат, чтобы сделать вещи быстрее.
Почему это написано в ходе? Потому что я написал это в выходные и нуждался в действительно быстрого системного языка для итерации, а также с низкой задержкой. Простота и время компиляции помогла с этим. Я мог бы переписать это в ржавчине, если решите провести еще пару недель.
Почему вы используете Redis? Это действительно быстро, он хранит данные в памяти, API прост и надеж, и имеет лучший в своем классе модуль полнотекстового поиска. Для такого размера набора данных в Embedding Redis дает вам непревзойденную производительность с частью стоимости и усилий альтернатив.
Вы можете сделать это для моей школы? Код-все с открытым исходным кодом, и вы можете посмотреть или перенести его! Если вы делаете это, также рассмотрите возможность протянуть руку в Twitter @ekzhang1 или по электронной почте, так как я хотел бы услышать о вашей работе.
Где получены данные? Каталог курса был проиндексирован из общедоступных названий курсов и описаний онлайн. См. Код в datasource/ папке.
Вам нужно GO 1.20 и Docker, чтобы работать над Backend и Node.js V18 для фронта.
Это загружает данные из учебных программ для академических терминов до весны 2022 года (AY 2022) и от My.harvard, начиная с осени 2022 года (AY 2023). Вы можете настроить сценарий загрузки данных, если хотите индексировать другой набор курсов.
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.
Исторические заметки о предварительно загруженных данных:
После того, как у вас есть данные об курсе за год, вы можете объединить их, чтобы сформировать один файл courses.json со всеми курсами, который можно искать WebApp.
go run . combine Это ищет все файлы с именем data/courses-{year}.json и объединяет их.
Вы также можете сделать обратный, разделяя единые data/courses.json на несколько data/courses-{year}.json .
go run . splitСервер прослушивает веб -запросы на порту 7500. (Он также вызывает экземпляр Redis, используя Docker, в порту 7501.)
go run . server -local -data data/courses.json Вы также можете запустить его с другими файлами данных. Например, если вы передаете data/courses-2021.json , вы получите результаты поиска только в течение учебного года с осени 2020 года по весну 2021 года.
Теперь вы можете разработать на Frontend, который автоматически прокси -прокси запросы 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.
Спасибо многочисленным студентам, которые помогли рекламировать сайт в сообществах колледжей.