PDA

View Full Version : چگونگی ساخت یک جستجو گر سریع برای جستجوی درون مقاله ای؟



saeed_programer
دوشنبه 27 مهر 1383, 13:58 عصر
ما یک بانک بزرگ مقالات داریم که در این بانک در حدود 50000 مقاله وجود داره و هر روز بزرگتر میشه.
می خواهیم در این بانک مقالات بتوانیم در داخل مقالات جستجو کنیم .
روشهای استفاده شده
1. مقالات را به صورت فایل txt ذخیره کردیم و یک موتور جستجو برای اون نوشتیم که برای یک جستجوسی سرتاسری در حدود 5 دقیقه زمان می بره
2. مقالات را در بانک sqlserve در فیلدهای ntext ذخیره کردیم و جستجو حدودا 3 دقیقه طول میکشه
یک راه بهتر برای این کار ارائه بدین..
(گوگل چگونه این کار را در کمتر از 2 ثانیه انجام میده)؟؟؟؟؟؟؟؟؟

AminSobati
دوشنبه 27 مهر 1383, 20:52 عصر
دوست عزیزم،
برای جستجو در متنهای حجیم حتما از Full-Text Search استفاده کنین. Full-Text Search از قابلیتهای برجسته SQL Server هستش. توضیحات کامل و خوبی در Books Online برای این کار وجود داره:

‌Books Online > Accessing and Changing Relational Data > Full-text Search
فقط به خاطر داشته باشین که در تنظیمات، Language رو روی neutral تنظیم کنین تا جستجوی فارسی امکان پذیر بشه. ولی توصیه من اینه که اول برای درک خوب از Full-Text Search، این کار رو برای جدوال حاوی اطلاعات انگلیسی (غیر یونیکد) انجام بدین تا وقتی منطق و روش کار رو کاملا درک کردین، بعد روی اطلاعات فارسی آزمایش کنین چون نکات خاص خودش رو داره.
موفق باشید،
امین ثباتی MCSD

saeed_programer
سه شنبه 28 مهر 1383, 16:07 عصر
از راهنمائی شما دوست عزیز ممنونم
ولی وقتی من به Books Online مراجعه کردم فقط گفته که چگونه از آن استفاده کنید و اشاره کرده به
خاصیت FullTextIndex که بعد از راست کلیک کردن روی table مورد نظر ظاهر میشود ولی در sql server من این خاصیت غیر فعال هست و هرچه در Books Online گشتم تا چگونگی فعال کردن این قسمت را در sql server پیدا کنم چیزی نیافتم
اگر لطف کنید و چگونگی فعال کردن این خاصیت را برایم شرح دهید ممنون میشوم .
در ضمن آیا این وژگی برای سیستم فایل NTFS پیاه ازی میشود.....

AminSobati
چهارشنبه 29 مهر 1383, 00:20 صبح
دوست عزیزم،
اول از همه اطمینان پیدا کنید که این سرویس رو هنگام نصب SQL Server، انتخابش کردین تا نصب بشه. پس Service Manager رو که Icon اون، پایین کنار ساعت قرار گرفته باز کنین و در لیست Services دقت کنین که Microsoft Search وجود داشته باشه و حتما Start شده باشه.
حالا در EM روی جدول دلخواه رایت کلیک کنین (این جدول باید حتما اقلا یک ایندکس یونیک داشته باشه). الان Full-Text Index باید فعال شده باشه. در این Wizard، فراموش نکنین که Language رو neutral انتخاب کنین.
بعد از پایان Wizard، جزء زیر مجموعه های دیتابیس خودتون، یک شاخه به اسم Full-Text Catalogs دارین. روی کاتالوگ مربوطه رایت کلیک کنین و Start Full Population انجام بدین. بسته به حجم جدول، باید صبر کنید تا این کار به پایان برسه. حالا در QA تنها نکته ای که برای جستجوی فارسی باید رعایت کنید اینه که از N قبل از عبارت مورد جستجو استفاده کنین. مثلا:

select * from table1 where contains (*,N'کلمه')

در مورد FAT یا NTFS مگه به مشکلی برخوردین؟

موفق باشید!

Vahid_Nasiri
چهارشنبه 29 مهر 1383, 19:41 عصر
من این سؤال رو از بخش ASP.NET به اینجا منتقل کردم چون دوست داشتم نظرات جناب ثباتی رو ببینم. :<:
======

چند مورد دیگر را هم می شود در نظر گرفت:

- ارتقاء سخت افزارهای سرور (به شدت روی کارآیی اس کیوال سرور تاثیر گذار است. برای مثال کوئری که روی پنتیوم 1400 حدود 20 دقیقه طول می کشد (با توجه به حجم بالای دیتایی که خودم تست کردم) روی پنتیوم بالای سه گیگاهرتز حداکثر 5 دقیقه طول می کشد! )
- چرا فقط SQL-Server ؟! چرا MySQL نه؟ (سرعت مای اس کیوال به مراتب از SQL-Server بیشتر است) فقط کمی در بین برنامه نویسان ویندوز ناشناخته است که اگر فرصت شد مقاله ای در مورد استفاده از آن در دات نت آماده می کنم.

AminSobati
چهارشنبه 29 مهر 1383, 21:23 عصر
وحید عزیز،
در مورد ارتقاء سخت افزار، 100٪ با شما موافقم و این کار تاثیر مستقیم داره. اگر سخت افزار رو ارتقاء دادیم و نرم افزارهای ما بهتر کار نکرد، باید به فروشنده اون قطعات سخت افزاری شک کنیم که شاید سرمون کلاه گذاشته!
در مورد انتخاب بین نرم افزارهایی مثل SQL Server و MySQL و Oracle، به اینکه یکی رو صریحا به دیگری برتری بدیم، شخصا اعتقادی ندارم. چون این نرم افزارها به خاطر پیشرفتهایی که کردند، به شدت به هم نزدیک شدن و در این وضعیت نقش من و شمای نوعی به عنوان Database Designer بسیار اهمیت داره که به چه شکل Tuning انجام بدیم و نتیجه مطلوب بگیریم.
من تا به حال به شرکتهای زیادی برای کارهای بانک اطلاعاتی مشاوره دادم و نکته ای که کاملا آشکار بوده اینه که هشتاد تا نود درصد برنامه نویسها از طرز کار Query Optimizer(که یک هوش مصنوعی به تمام معناست) در SQL Server چیزی نمیدونستند. یا مثلا فقط اطلاع دارن که برای فیلدی که در Query بعد از WHERE قید میشه، ایندکس بسازند! اما اگر ازشون بپرسین که با چه ترکیب، یک ایندکس بسازیم تا SQL Server برای اجرای Query ما، به جای انتخاب Nested Loop، الگوریتم Merge Join رو انتخاب کنه تا سرعت افزایش پیدا کنه، تنها جوابشون نگاه کردن شماست! یا عادت دارند Primary Key رو همیشه Clustered بسازند!
تمام عرض بنده اینه که همه این نرم افزارها از قابلیتهای برجسته ای برخوردار هستند و طراحی ما و بهره گیری درست از سخت افزار موجود حرف اول رو میزنه.

موفق باشین

MSYNK
پنج شنبه 30 مهر 1383, 12:02 عصر
با سلام


هشتاد تا نود درصد برنامه نویسها از طرز کار Query Optimizer(که یک هوش مصنوعی به تمام معناست) در SQL Server چیزی نمیدونستند. یا مثلا فقط اطلاع دارن که برای فیلدی که در Query بعد از WHERE قید میشه، ایندکس بسازند! اما اگر ازشون بپرسین که با چه ترکیب، یک ایندکس بسازیم تا SQL Server برای اجرای Query ما، به جای انتخاب Nested Loop، الگوریتم Merge Join رو انتخاب کنه تا سرعت افزایش پیدا کنه، تنها جوابشون نگاه کردن شماست! یا عادت دارند Primary Key رو همیشه Clustered بسازند!
تمام عرض بنده اینه که همه این نرم افزارها از قابلیتهای برجسته ای برخوردار هستند و طراحی ما و بهره گیری درست از سخت افزار موجود حرف اول رو میزنه.

آیا در زمینه های این چنین پیشرفته آیا منبع درست و حسابی پیدا میشه؟
آیا Help خود SQL Server جوابگو هستش؟
با تشکر.

saeed_programer
پنج شنبه 30 مهر 1383, 14:10 عصر
با سلام خدمت دوستان عزیز و ممنون از راهنمائی شما.
در رابطه با بالا بردن سخت افزار خوب این تا اندازهای در دست ماست و یک حدی داره ولی در نهایت باید یک ایده خوب برای برنامه نویسی بدیم یا به قول معروف یک ترفندی استفاده کنیم تا بتوانیم با برنامه نویسی کار خودمونو پیش ببریم.
در حال حاضر مشکل من تغریبا حل شد وبرای حدود 50000 مقاله 5 صفحه ای این جستجو حدود 3 ثانیه زمان میبره که تا اینجای کار بسیار خوب و پروژه منو پیش میبره ولی اگر نیاز به ساخت یک جستو گر برای 200000000 صفحه باشه دیگه فکر نمی کنک این روش هم کار ساز باشه پس چطوری گوگل این کار را انجام میده و فقط نمی تونیم بگیم اون داره از یک سخت افزار منحصر به فرد استفاده میکنه.....!!!!

AminSobati
پنج شنبه 30 مهر 1383, 20:43 عصر
سعید جان بسیار خوشحالم از اینکه مشکل شما حل شده. نتیجه اخلاقیی که میگیریم اینه که برای هر نیازی در SQL Server، راهی وجود داره که باید از اون راه وارد شد تا بهترین نتیجه رو گرفت :)
اما در مورد یاهو و گوگل و امثالهم، نکته اینجاست که دقیقا از سخت افزار خاص استفاده میکنند!
سه سال پیش در انگلیس من با سرورهای Intel کار کردم. سرورهایی که برای کارهای متوسط و نه خیلی سنگین طراحی شده بودند. مشخصاتشون از این قرار بود:
- چهار CPU، نه Celeron بلکه Xeon.
- چهار گیگابایت RAM.
- دوازده هارد دیسک، هر کدوم به ظرفیت 250 گیگابایت با کابل اسکازی که در حالت RAID 5 بسته شده بودند.
این تکنولوژیه سه سال پیش Intel برای پردازشهای نه چندان سنگین بود. سرورها برای کارهای حجیم، چندین بار قدرتمندتر از اونچه که ذکر شد هستند. این در حالیه که سرورهای Intel در مقابل سرورهای Compaq حرفی برای گفتن ندارند. از سه سال پیش تا الان، قطعا سرورها توان بسیار بیشتری پیدا کردند.
برای اینکه تاثیر سخت افزار روی سرعت Query رو بهتر حس کنین یک مثال میزنم. سرورهای قوی رو میگذاریم کنار، فرض کنین یک PC عادی در اختیار دارین با حجم اطلاعاتی که فرمودید (50000 مقاله 5 صفحه ای). اگر شما با سه هارد دیسک، RAID 5 ایجاد کنین، تمام اطلاعات شما توسط 3 هارد دیسک به طور همزمان Write میشن(هر بخش از اطلاعات روی یک هارد قرار میگیره). زمانی که Query میگیرین، 3 هارد دیسک همزمان هر کدوم بخشی از نتیجه Query رو آماده میکنن. پس سرعت کار شما سه برابر میشه.حالا تصور کنین که 12 هارد دیسک با RAID 5 داشته باشین! به همین وضعیت، چهار CPU اضافه کنین! حالا چند گیگابایت RAM...
پس Query شما که 3 ثانیه طول میکشید، حالا در کسر ناچیزی از ثانیه انجام میشه.
از طرفی، سایتهایی با بینندگان بسیار زیاد، از یک سرور استفاده نمیکنند، بلکه اصطلاحا Web Farm ایجاد میکنند. Web Farm تشکیل شده از چندین سرور قدرتمند که هر وقت یک Request برای مشاهده سایت دریافت میشه، این Request توسط سرور اصلی به سروری که از بقیه سرش خلوت تره هدایت میشه. این یکی از روشهای Load Balancing هست. Load Balancing یعنی ایجاد اعتدال بین گروهی از سرورها که پردازش انجام میدن.
غیر از تمام این موارد، باز هم Solutionهای سخت افزاری متنوعی وجود داره که هر کدوم در شرایط خاص خودش مورد استفاده قرار میگیره.

موفق باشین

AminSobati
پنج شنبه 30 مهر 1383, 21:23 عصر
آیا در زمینه های این چنین پیشرفته آیا منبع درست و حسابی پیدا میشه؟
آیا Help خود SQL Server جوابگو هستش؟

دوست عزیزم،
بهترین منبعی که من سراغ دارم، همون Books Online هستش. اگر Books Online رو باز کنین، بدون کلیک اضافی، در اولین لیستی که مقابل شماست، Optimizing Database Performance رو مطالعه بفرمایید.
تمام Articleهایی که در Internet وجود داره تماما به نوعی بیان مجدد Books Online هستش(ولی به زبان ساده تر) به علاوه تجربیات خود نویسنده. ولی از اونجاییکه Tuning مبحث گسترده ای هست و چند موضوع با هم در اون نقش دارند، بهتره که روی مبحث Index هم تا جای ممکن همین منبع رو مطالعه کنید.
یک فایل رو براتون ارسال کردم. نویسنده اون خانم Kalen Delaney، شخصیه که در دنیای SQL Server، معادل مارادونا در فوتبال هستن!
موفق باشین