PDA

View Full Version : بهترین موتور جستجو برای حجم های بالا در نرم افزار



پدرخوانده
یک شنبه 22 آبان 1384, 12:44 عصر
(البته این بحث وقتی راجع به نرم افزارهای windows base بوده و راجع به موتورهای جستجوی اینترنتی نمیباشد)
چندی پیش به دنبال یافتن طرح ها و الگوریتم ها و یا انتخاب نرم افزار مناسب برای پیاده سازی نرم افزارهایی با حجم بانک های بالا می گشتم .
نرم افزارها و طرح های مختلف با زبانهای مختلف از فاکس تحت داس تا دلفی و دیتابیس اینجنین mysql,msql دیدم هر کدام روشی برای کار خود داشتن در نسخه های تحت ویندوز بیشتر این بار (جستجو) را بر گردن خود دیتابیس اینجنین گذاشته و الگوریتم خاصی پیدا نمی کردند ولی در نسخه های قدیمی تر معمولا این الگورتیم کاری جستجو بود که سبب افزایش سرعت می شد.

به طور نمونه معمولا در برنامه های قدیمی برای پیاده سازی حجم های بالا (مثلا 500 جلد کتاب 300 صفحه ای) ابتدا لیستی از کلمات غیرتکراری تهیه می شد و برای هر کدام کدی 3 حرفی (بعضا با توجه به تعداد کلمات این بانک (لیست کلمات غیرتکراری) یک کد 2 حرفی) تشکیل داده می شد که مبنای این کد همان مبنای کد اسکی (255) بود و خوب به این ترتیب با استفاده از این کد 3 حرفی تا 255*255*255 کلمه (رکورد) را می توانست پشتیبانی کند (که معمولا برای خوانا بودن این حروف کدهای عملیاتی (زیر کد 32 ) را از لیست حذف می کردند و بدین ترتیب نهایتا این جدول (لیست کلمات غیر تکراری) تهیه می شد و سپس بر اساس این جدول بانک اصلی خوانده شده و تبدیل به کد شده و در یک فایل متن ذخیره می شد (البته با حفظ آدرس شروع هر رکورد در جدول جدیدی که آدرس صفحات متن را در خود ذخیره کرده بود) بدین وسیله حجم بانک اصلی که چیزی حدود مثلا 470 مگابایت بود به20 مگابایت تقلیل پیدا می کرد (البته بستگی به نوع تفکیک تعداد فایلهای جدول و .... داشت) و نهایتا این فشرده سازی اطلاعات علاوه بر کم کردن حجم اصلی برنامه به هنگام جستجو نیز کارساز بود
بدین صورت که به هنگام جستجو براساس تک کلمه، در کمتر از کسر ثانیه ای آدرس صفحاتی که شامل این کلمه هستند از جدول کلمات غیرتکراری خوانده شده و نهایتا زمانی فقط جهت دی کد کردن اطلاعات و نمایش گرفته می شد (که اون هم نهایتا یک ثانیه می شد)
و در موارد جستجوی ترکیبی نیز براساس تعداد تکرار کلمات موردجستجو آدرس های هر کلمه را خوانده و سپس آنها را باهم مقایسه کرده و آدرس مکان های مشترک را به عنوان جواب نمایش می داد.
و در بدترین حالت که مثلا جستجو شامل کلمات پرتکرار باشد برنامه کل فایل متن را از ابتدا تا انتهاء پیمایش می کرد (که معمولا در حجم فوق 20 مگابایت چیزی حدود 50 ثانیه زمان می برد)
(لازم به ذکر است که تمامی جداول مورداستفاده (سوای فایلهای متنی) دارای ایندکس بوده که با استفاده از ایندکس جستجو کلمات و یا موارد (سوای بحث خواندن اطلاعات از فایل متن و دی کد کردن آنها) سریع می باشد.
(به طور نمونه بنده از این روش در دو نرم افزار با بانکهای اطلاعات حدود 300 و 500 مگابایت استفاده کردم با زبان ویژوال فاکس استفاده کردم که سرعت مطلوبی داشت)

ویکی دیگر از این راه حل ها استفاده قابلیت Full-Text Indexing در sql-server می باشد که مورد مناسبی می باشد و در خیلی از موارد (مخصوصا در طرح های شبکه ای و اینترنتی)

ولی به علت نیاز به پیاده سازی برنامه sql-server بر روی سیستم single user ها (منظور سیستم کاربران نرم افزار موردنظر که از جهت سخت افزاری و نرم افزاری دارای طیف وسیعی بوده و نسبت به آنها اشراف و تسلط ندارید) با مشکل مواجه می شود. (چرا که پس از pack کردن نرم افزار و در پخش آن با مشکل مواجه می شوید) (حالا ممکن است خیلی از دوستان بگویند که می تواند در حالت کوچک و ... (بدون تنظیمات بسیار) برنامه را نصب کرد که باز همین کوچک نیز ممکن است از دید خیلی از کاربران تازه کار مشکل باشد)

نرم افزارهای مختلفی دیگری را نیز دیدم که هر کدام از روشی استفاده می کردند ولی بیشتر بحث بر روی پیاده سازی کدینک اطلاعات و ایندکس سازی از اطلاعات کد شده بوده البته با روشهایی مختلف و بیشتر در نرم افزارهای مذهبی چنین مواردی را می توان مشاهده کرد
(مثل: نرم افزار معجم فقهی (با بیش 6000 جلد کتاب)، نور و ....)

و حالا دوستان راجع به این موضوع مقاله ، طرح و یا الگوریتمی را می شناسند در اینجا معرفی کنند