أريد فقط أن آخذ فصلًا عن [X] ولكن البحث في الكتالوج عبر الإنترنت بطيء للغاية ، ونتائجي غير ذات صلة إلى حد كبير. ماهذا الهراء؟
لدى جامعة هارفارد العديد من مواقع البحث في الدورة التدريبية ، ولكن لا يوجد أي منها جيد. هذا المشروع هو محاولة لأخذ المشكلة على محمل الجد: اكتب برامج عالية الأداء ووضع افتراضات رائعة حتى يتمكن الأشخاص من الحصول على اقتراحات أفضل وأكثر فائدة ، أسرع 100x.
Classes.wtf هو محرك بحث مخصص وموزع مكتوب في GO يركز على السرعة وجودة النتائج. إنه مبني على قاعدة بيانات Redis في الذاكرة تعمل كعملية فرعية للتطبيق. يدعم هذا الفهرس البحث الكامل عن النص الغامض والبادئة على جميع الحقول ، إلى جانب بناء جملة استعلام غني.
الواجهة الأمامية عبارة عن موقع ويب ثابت مصمم مع Svelte ، ويعالج استفسارات البحث مباشرة بعد كل ضغط مفتاح. الهدف هو خط الأنابيب {request ، الحساب ، الاستجابة ، والعرض} ليأخذ أقل من 30 ميلي ثانية.
"الآن انتظر ثانية فقط ،" أسمعك تقول. سرعة الضوء ليست سريعة بما يكفي للبيانات للسفر في جميع أنحاء العالم في هذا الكمون! لكن لا تقلق ، هذا جيد. نقوم بتشغيل نسخ متماثلة متعددة في المواقع الموزعة جغرافيا باستخدام Fly.io وطلبات المسار إلى أقرب واحد. تدير كل نسخة طبق الأصل محرك استعلام النص الكامل الخاص به ، بحيث تكون مستقلة تمامًا.
(أقرب نسخة طبق الأصل من الخادم إلى كامبريدج ، يعيش MA في Secaucus ، نيوجيرسي ، على بعد 200 ميل فقط.)
لماذا صنعت هذا؟ شعرت بالإحباط من مدى إزعاجها للبحث عن الفصول. وأنا مهندس برمجيات أنظمة ، مما يجعله إلى حد كبير ولايتي لجعل الأمور أسرع.
لماذا مكتوبة في GO؟ لأنني كتبت هذا في عطلة نهاية الأسبوع وأحتاج إلى لغة أنظمة سريعة حقًا لتكرارها مع وجود زمن انتقال منخفض أيضًا. ساعدت بساطة GO و ALTERS مع هذا. قد أعيد كتابته في الصدأ إذا قررت قضاء بضعة أسابيع أخرى عليها.
لماذا تستخدم redis؟ إنه سريع حقًا ، ويخزن البيانات في الذاكرة ، و API بسيطة وقوية ، ولديها وحدة بحث كاملة عن النص الأفضل في فئتها. بالنسبة لهذا الحجم من مجموعة البيانات ، يمنحك التضمين أداءً لا مثيل له مع جزء صغير من تكلفة وجهد البدائل.
هل يمكنك صنع هذا لمدرستي؟ الرمز مفتوح المصدر ، ويرحب بك لإلقاء نظرة أو منفذه! إذا كنت تفعل هذا ، فيرجى أيضًا التفكير في التواصل على Twitter @ekzhang1 أو عبر البريد الإلكتروني ، لأنني أحب أن أسمع عن عملك.
أين يتم الحصول على البيانات؟ تم فهرسة كتالوج الدورة التدريبية من عناوين الدورات والدورة المتاحة للجمهور عبر الإنترنت. انظر الرمز في datasource/ Folder.
تحتاج إلى GO 1.20 و Docker للعمل على الواجهة الخلفية و 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 واحدة. 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.
يمكنك الآن تطوير الواجهة الأمامية ، والتي تلقائيًا طلبات 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]. مرخصة بموجب ترخيص معهد ماساتشوستس للتكنولوجيا.
بفضل العديد من الطلاب الذين ساعدوا في الإعلان عن الموقع في مجتمعات الكلية.