اگه بخواین یه کار خیلی ساده بکنین انقد درگیر نمیشین. کافیه با اصول اولیهی HTTP آشنا باشید تا بتونید یه خزشگر ساده بنویسید (یا از یه نمونهی آمادهاش استفاده کنید و تغییرش بدید). بعد هم صفحات رو توی یه پایگاه دادهی ساده ذخیره کنید و از FTS استفاده کنید تا بتونید جستجو کنید. یه UI ساده هم با زبونی مثل PHP میزنید و تمام.
اما حالا میخواین یه مرحله جلوتر برین و نتایج جستجو رو بهبود بدین. بنابراین درگیر مباحث IR میشین. مجبور میشین برین در این زمینه مطالعه کنین. خیلی گسترده هست! دهها Paper در زمینههای مختلف IR وجود داره که تازه خیلیهاشون توی موتور کاربردی نیستن چون سرعتشون پایینه! مثلاً طرف میگه این حرکتو بزن، کیفیت نتایج ۱۰ درصد بهتر میشه! فقط مشکلش اینه که هر جستجوتون ۱ دقیقه طول میکشه!!!!
بعد میخواین بازم جلوتر برین و صفحات خراب رو بتونین درست تشخیص بدین. وارد بحث parse کردن صفحات میشین. باید با تکنولوژی HTML به صورت کامل آشنا بشین تا بتونین همهی سوراخ سنبههاش رو پیدا کنین! بعدش هم باید برین سراغ HTML5 و بعد از اون فهمیدن جاوا اسکریپت و AJAX.
بعد میخواین جلوتر برین و سایتهایی که بعضی وقتها مشکل دارن رو بتونین تشخیص بدین (مثلاً یهو یه سایت بهتون connection نمیده). باید با مباحث شبکه آشنا بشین و مثلاً در مورد Socket timeout و مباحث TCP و HTTP و غیره مطالعهی دقیقی بکنید.
بعد میخواین جلوتر برین و پوشش موتورتون رو گستردهتر کنین. پس باید خزشگر رو یه جوری طراحی کنین که بتونه صفحات زیادی رو جمعآوری کنه. درگیر مسائل توزیعشدگی میشین و باید برین دربارهی پایگاههای دادهی توزیع شده مطالعه کنید. بعد دربارهی distributed computing مطالعه کنید. بعد خزشگرتون رو طوری طراحی کنید که بتونه توی چند صد میلیون صفحه اولویتبندی کنه و صفحات مهمتر رو سریعتر بیاره. بعد هم بریم سراغ بحث update! باید بتونین توی چند صد میلیون صفحه مشخص کنین که کدومها با چه rate ای بهروزرسانی بشن.
بعد درگیر این میشید که حالا این update ها رو چطوری توی index اعمال کنید؟ احتمالاً میرید به سراغ روش batch. یعنی اول توی یه index دیگه اینها رو اعمال میکنید، بعد جای دو تا index رو با هم عوض میکنید.
همین وسط میبینید خودتون همهی این کارا رو نمیتونید با هم انجام بدید، پس میرید سراغ استخدام نیرو. اون هم انواع نیرو: شبکه، برنامهنویس، نیروی research، توی همهی بخشها!
همزمان با این موضوع، باید پهنای باند رو هم به صورت متناسب افزایش بدید. پولش رو هم باید بدید!
بعد سر این موضوع درگیر مباحث شبکهای و زیرساختی میشین، چون تعداد سرورها داره میره بالا. بعد یه دفعه میبینید دیگه پول ندارید سرور بخرید!!!
بعد یهو میبینید اون یه دونه ادمین شبکهای که استخدام کرده بودید و خوشحال بودید، زیر بار چندین سرور و کلاستر و غیره داره منفجر میشه! پس مجبور میشید نیروی جدید استخدام کنید! حالا بیا و نیروی جدید رو آموزش بده!
حالا همهی این مشکلات رو حل کردید، یهو میبینید این همه صفحه که خزش کردید، دیگه با یه Index ساده روی ستون متناظرش توی پایگاه داده جواب نمیده! جستجوها سرعتشون کندتر و کندتر میشه! مجبور میشین برین سراغ یه Index توزیع شده. روز از نو، روزی از نو! همهی قصههایی که بالاتر گفتم دوبل میشه!!!
تازه این رو هم توجه داشته باشید یه پایگاه دادهی توزیع شده، خیلی سادهتر از یه index توزیع شده هست. توی پایگاه داده میخواین lookup کنین و مثلاً یه دونه از سطرها (یا یه range از سطرها) رو استخراج کنید، ولی توی هر جستجو، باید به بخش وسیعی از صفحات موجود توی index تون دسترسی پیدا کنید و با query کاربر match کنید، بعد از match هم باید score کنید تا بتونید بهترین صفحات رو پیدا کنید.
بعد میخواین باز جلوتر برین و سرعت جستجو رو بالا ببرین (زیر ثانیه) و همچنین بتونین چندین جستجوی همزمان رو جواب بدید. سادهترین راهش افزایش سختافزاره! ولی پول میخواد! بنابراین سعی میکنید حتیالامکان نرمافزارتون رو بهینهسازی کنید. پس وارد مباحث بهینهسازی میشید. هم بهینهسازی کد، هم بهینهسازی شبکه.
بعد میخواین stability موتور رو بالا ببرید. مجبور میشید بعضی جاها سیستمهای زپرتیای که از روی جبر (به خاطر کمبود زمان و دانش و نیرو) استفاده کردید رو با یه سیستم درست و حسابی جایگزین کنید. بعد هم مجبور میشین برای همهی سیستمهاتون یه سیستم backup بذارین تا در صورت پایین اومدنش بتونین روی backup سوئیچ کنید. بعد باید یه مقدار پیشرفتهترش کنید و این switch کردن روی backup رو خودکار کنید. بعد یهو میبینید کلی سرور جدید لازم دارید که سیستمها همگی HA باشن! بعد گریه میکنید!! :)
بعد میخواین یه کاری کنید که هیچ وقت موتور پایین نیاد و همیشه پاسخگو باشه. برای همین نمیتونید تغییرات رو (مثلاً تغییر توی الگوریتم رتبهبندی) روی خوشهی index اصلی اعمال کنید و تست کنید! چون ممکنه نتایج خراب بشه! پس باید یه خوشه مخصوص تستهای مختلف داشته باشید! اینجا باز هم گریه میکنید!!
بعد میخواین توان پاسخگویی موتور رو بالا ببرید تا مثلاً توی peak وقتی ۱۰ تا کاربر با هم جستجو میکنن کم نیاره و به همگی زیر ثانیه جواب بده. در نتیجه باز هم باید بهینهسازی کنید، یا سختافزار اضافه کنید!
بعد کم کم درگیر مباحث امنیت میشید. جدا از این که بعضی از کاربران شروع میکنن به اذیت کردن، از اون طرف صفحاتی که خزش میشن، بعضیاشون مشکل دارن!
بعد میخواین یه کم به کاربر حال بدین، میرین سراغ auto-complete. بعد یهو میبینید سیستم نمیکشه! بعد که یه جوری مشکل سرعت رو حل میکنید، میبینید کیفیت عبارتهای auto-complete شده پایینه!
بعد میخواین از cache استفاده کنید تا سرعت بالا بره. بعد یهو توی این مسئله میمونید که چطوری این cache رو میخواین update کنید؟ توجه کنید که این cache شامل یه دادهی مشخص نیست که به راحتی بشه update اش کرد، بلکه شامل نتیجهی یه جستجو هست که ممکنه بعد از مثلاً چند دقیقه، با خزش شدن یه صفحهی جدید، این صفحه در صورت انجام جستجوی جدید بیاد و بشه جزو نتایج اون جستجو. یا یکی از نتایج اون جستجو update بشه و مثلاً پاک بشه، یا کلاً دیتاش عوض بشه (مثلاً صفحهی اول یه سایت خبری که تند و تند عوض میشه)، پس باید توی نتایج شما هم عوض بشه. اینا هر کدوم برای خودشون داستانی داره!
بعد هم به این فکر میکنید که چقدر خوب بود اگه index به جای این که batch باشه، realtime باشه و به محض این که خزشگر یه صفحه رو گرفت، سریع توی index بهروزرسانی بشه. برای همین شروع میکنید به طراحی سیستم به صورت realtime، یه دفعه میبینید کللللللللللللللاً همه چی زیر و رو میشه! برای همین یا بیخیال میشید، یا بسمالله میگید و وارد گود میشید! البته معلوم نیست کی از گود بیاین بیرون! :)
بعد دیگه به صورت دائم درگیر مسئلهی بهبود کیفیت هستید که هیچ وقت تموم نمیشه! درگیر مسائل مختلفی میشید:
- Query Expansion
- Query Correction و Spell Suggestion
- افزودن پارامترهای جدید به الگوریتم رتبهبندی (توجه کنید که اگه یه پارامتر جدیدی بخواین از چند صد میلیون صفحه استخراج کنید و توی index اعمال کنید، کار راحتی نیست!)
- ایجاد انواع تغییر توی الگوریتم رتبهبندی
- افزودن قابلیت learn شدن موتور از روی جستجوها و کلیکهای کاربران
- اجرای الگوریتمهایی مانند Page Rank روی صدها میلیون صفحه و اعمالشون توی سیستم
- ...
خوب اینجاس که یه نگاه میکنید، میبینید کار راحتی نیست! میشه راحت و کوچیک شروع کرد، ولی بزرگ کردنش کار سختیه. نگرفتم نمیشه، خیلی سخته، و خیلی هم هزینه داره.