هدف از این سرى مقالات ارائه و بررسى روش هایى است که براى افزایش سرعت جستجو در مقادیر هنگفتى از اطلاعات متنى استفاده مى شود. راههاى بیان شده در این مقاله همگى توسط راقم سطور یا نهادهاى دیگرى آزمایش شده و بسیار عالى پاسخ داده اند.
فهرستى از مطالب ارائه شده در این مقالات
- بررسى کلى صورت مساله
- روش Indexing ساده
- روش Indexing و Compacting پیشرفته
- بررسى Indexing Service مربوط به بانکهاى اطلاعاتى و آشنایى با Indexing Service در SQL Server و ویندوز ۲۰۰۰
بررسى کلى صورت مساله
امروزه سیستم هاى اطلاعاتى جزء لاینفک مراکز تحقیقاتى است. یک مرکز تحقیقاتى از یک سیستم اطلاعاتى تواقعاتى را دارد؛ همچون افزایش ضریب امنیت، افزایش سرعت عمل، کاهش زمان تحقیق، نائل شدن به بیشترن اطلاعات ممکن، موضوع بندى بودن اطلاعات و …
یک مرکز تحقیقاتى باید به امنیت سیستم تحقیقاتى خود اطمینان داشته باشد؛ یک مرکز تحقیقاتى باید اطمینان داشته باشد که اطلاعات او امن هستند و امکان از بین رفتن اطلاعاتش به هر طریق از جمله نفوذ ویروس، اشکالات سیستم، ایزوله نبودن سیستم و … از بین نمى رود. یک مرکز تحقیقاتى باید مطمئن باشد که از بیشترین پناسیل اطلاعاتى خود استفاده مى کند و مسائلى از این قبیل
به علاوه یک مرکز تحقیقاتى نیاز دارد که یک سیستم اطلاعاتى بتواند زمان تحقیق را کاهش دهد و در کمترین زمان به بیشترن اطلاعت ممکن برسد و همچنین داده ها در یک ساختار درختى یا چیزى شبیه به آن دسته بندى شده باشند تا دسترسى از کل به جزء امکان پذیر باشد و در مدت زمان کمى به نتایج دلخواه خود برسد. اما شاید افزایش سرعت عمل یکى از مهمترین آرزوهاى یک مرکز تحقیقاتى است. البته در اینجا نباید مسئله امنیت و نائل شدن به بیشترین اطلاعات ممکن را فراموش کنیم. آن مرکز علاوه بر این که تمایل دارد به بیشترین اطلاعت ممکن برسد، همچنین مایل نیست که اطلاعات او دچار اختلال شود.
بنابراین یک مرکز تحقیقاتى علاقه دارد که در مورد مسئله سرعت به نتایج زیر برسد:
- افزایش سرعت
- افزایش ضریب کارایى یا راندمان تحقیق
- افزایش امنیت
- کاهش مدت زمان جستجو
- استفاده از کمترین امکانات سخت افزارى و نرم افزارى جهت کاهش هزینهها
راقم سطورسعى دارد در این سلسه مقالات راجع به نیل به این اهداف بحث کرده و مساله را به طور عمیقتر بشکافد.
روش Indexing
این روش شاید یکى از سهل الوصول ترین روشها است که مى توانید در سیستم هاى کوچک و حتى متوسط به راحتى پاسخگوى نیازها باشد.
شاید، براى شروع بهتر باشد با کلمه Indexing بیشتر آشنا شویم:
دیکشنرى انگلیسى به انگلیسى Babylon کلمه Indexing را این گونه توضیح داده است:
عمل درست کردن فهرست یا شاخص؛ عمل نام گذارى و سازمان دهى کردن اطلاعات در یک جدول شاخص براى دسترسى آسانتر (رایانه)
دیکشنرى کامپیوتر مایکروسافت نیز در توضیح لغت indexed search این گونه مى نویسد:
جستجو به دنبال فقرهاى از اطلاعات. در این شیوه جستجو از یک فهرست یا شاخص براى کاستن مقدار زمان مورد نیاز استفاده مى شود.
حال که فهمیدیم Indexing یعنى چه، مى توانیم به بررسى روش مذکور بپردازیم. فرض کنید سازمان شما بخواهد در ۳،۰۰۰،۰۰۰ صفحه اطلاعات متنى جستجو کند. در آن صورت شما ممکن است در ابتدا تصمیم بگیرید از Query استفاده کنید. ولى مطئمنا پس از انجام اولین تست از ایده خود منصرف خواهید شد؛ زیرا متوجه میشوید که زمان مورد نیاز براى جستجودر ۳،۰۰۰،۰۰۰ صفحه اطلاعات سازمان شما بسیار بسیار بیشتر از تصور شما بوده است.
حالا اجازه بدهید ببینیم Indexing براى این مساله چه راه حلى ارائه مى دهد؟
کافى است به سادگى جدولى از لغات غیرتکرارى متون بسازید و در آن جستجو کنید. اجازه دهید ببینیم چگونه مى شود چنین کارى کرد؟ کاراکتر ” ” یا Space مهمترین جداکننده لغات است. مى توان به سادگى یک Parser یا تجزیه کننده متن نوشت که این لیست غیرتکرارى را درست کرده و در یک Table بریزد. فعلا به عنوان یک تجربه نوع Database استفاده شده مهم نیست ولى من Microsoft Access را پیشنهاد مى کنم چون فعلا میتواند نیازهاى ما را به طور کامل برطرف کند.
شیوه کار بسیار ساده است. Parser شما باید لغات را بر حسب کاراکتر ” ” یا Space از هم جدا کرده و در صورتى که این لغت قبلا در بانک مربوطه ریخته نشده بود آن را به بانک اضافه کند. ساختار Table مذکور نیز باید چیزى شبیه به این باشد:
| نام فیلد | نوع | اندازه | توضیحات |
| Word | String | 15 | کلمه |
| Positions | Memo | 0 | موقعیتها – تشریح خواهد شد |
البته تجزیه کردن متون با شیوه مذکور خالى از اشکال نیست؛ یکى از مهمترین اشکالات این روش این است که به عنوان مثال بین لغت “انفورماتیک” و “انفورماتیک،” تفاوت قائل میشود و دو رکورد مجزا براى آنها ایجاد مى کند. ولى فعلا همین Parser ساده مشکل ما را حل میکند. براى یک پروژه واقعى شاید لازم باشد یک Parser قوى تر بنویسید و آن را از جهات سرعت بهینه سازى کنید.
همان طور که دیدید Tableما علاوه بر فیلد Word داراى فیلد دیگریبود به نام Positions. این فیلد مسئولیت کلیدى را در شیوه جستجوى ما بازى مى کند. هر بار که شما یک کلیدواژه را به بانک اضافه میکند، باید آدرس آن کلیدواژه را نیز به طور دقیق در فیلد Positions وارد کنید. این مساله که چگونه آدرس مذکور را درج کنید، بسته به شکل طراحى Database شماست. ولى اجازه دهید فرض کنیم شما متون را در قالب زیر و با ساختار Master-Detailى نگهدارى مى کنید:
| نام فیلد | نوع | اندازه | توضیحات |
| +ID | AutoInc | 0 | ID |
| BookName | String | 30 | نام کتاب |
| نام فیلد | نوع | اندازه | توضیحات |
| +ID | AutoInc | 0 | ID |
| Code | Integer | 0 | Used for creating Relation |
| PageNum | Integer | 0 | شماره صفحه |
| Text | Integer | 0 | متن صفحه مربوطه |
طبق این ساختار شما نام کتابهاى خود را در جدول Master و متن کتابها را در جدول Detail نگهدارى مى کنید. به علاوه بین جدول Master و Detail یک ارتباط یک به چند موجود است. این ارتباط از طریف فیلد Code برقرار مى شود.
خوب … با توجه به ساختار مذکور شما مى توانید آدرس کلمات را با استفاده از فرمت زیر در بانک KeyWords وارد کنید:
براى این که مساله بیشترى روشن تر شود به الگوریتم کلى کار نگاهى بیاندازید:
- کلمه به کلمه در متن جلو بروید.
- هر کمله را پس از این که مطمئن شدید قبلا در بانک KeyWords وارد نشده، در فیلد Word همین بانک وارد کنید.
- آدرس این کلمه را نیز به شکلى که گفته شده در فیلد Positions وارد کنید. تنها لازم است هر بار یک آدرس را وارد کنید و براى وارد کردن آدرس بعدى از یک کاراکتر “;” استفاده کرده و آدرس بعدى را اضافه کنید.
- از زندگى لذت ببرید و آماده باشید که به تشریح چگونگى جستجو در متون بپردازیم….
دیگر راه درازى در پیش نداریم. به هدف رسیده ایم. فرض کنید در برنامه نهایى کاربر درخواست جستجو در لغت “انفورماتیک” را صادر کرد. برنامه شما چه باید بکند؟ خیلى ساده است. به جایى این که در متون جستجو کنید در بانک KeyWords جستجو کنید. جستجو در این بانک به سرعت باد انجام مى گردد زیرا حجم اطلاعات آن پایین است (قبلا گفتیم که این بانک حاوى لغات تمامى متون ولى به صورت غیرتکرارى است).
برنامه شما باید در صورتى که رکور “انفورماتیک” در بانک KeyWords نبود یک پیغام خطا به کاربر نشان دهد و در غیر این صورت آدرس هاى مذکور را از حالت کد شده در بیاورد و به کاربر بگوید که در کتاب “فلان” و در صفحه شماره “فلان” لغت مورد نظر شما موجود است.
اگر از این روش استفاده کنید مطمئن باشید که از سرعت فوق العاده آن شگفت زده مى شوید. در واقع ما یک بار خودمان تمامى جستجوهاى ممکن را انجام دادیم و حالا در جستجوهاى خودمان مورد نیاز کاربر را مى یابیم
اما یک مساله مهم دیگر هنوز باقیست. و آن جستجوى شرطى است. اگر بخواهید به برنامه خود قابلیت جستجوى AND – OR یا NOT را بدهید، چه؟
انجام دادن چنین کارى ساده نیست ولى به پیچیدگى خود روش Indexing هم نیست. فرض کنید رشته ورودى کاربر شما اینگونه باشد: “انفورماتیک AND ایران AND معظلات”.
حالا برنامه شما باید رکوردهاى “انفورماتیک”، “ایران” و “معظلات” را در بانک KeyWords فیلتر کند و مواردى که این سه لغت در یک صفحه واقع شده اند را به کاربر گزارش دهد.
شاید یک مساله دیگر هم ذهن شما را به خود جلب کرده است و آن مساله حجم است. شاید از خود بپرسید: “خوب، این روش خوبى است ولى احتیاج به حجم خیلى زیادى دارد!”. در پاسخ شما باید بگویم که نه این چنین نیست. حجم مورد نیاز شما بسیار اندک است. زیرا که بانک شما حاولى کل لغات متون شما نیست بلکه حاوى لغات غیرتکرارى متون است.
به علاوه اگر خیلى اصرار دارید که از حجم کمترى استفاده کنید میتوانید آدرس ها را کد کنید.
یک روش کدکردن اعداد وجود دارد که خیلى خیلى کاراست. تا عدد ۶۵،۵۳۶ را میتوان فقط با دو بایت ذخیره کرد.
انجام این کار خیلى خیلى ساده است.
بگذارید با مثال این مساله را به مطرح کنم.
| عدد | معادل فشرده شده |
| ۲۵۶ | #۲۵۶ |
| ۲۵۷ | #۱#۱ |
| ۲۵۸ | #۱#۲ |
| ۵۱۲ | #۱#۲۵۶ |
| ۵۱۳ | #۲#۱ |
| ۱۰۰۰ | #۳#۲۳۲ |
توجه: منظور از #۱ کد اسکى شماره ۱ است.
نمى دانم تا به حال متوجه منظور من شده اید یا نه. اگر متوجه نشدید به الگوریتم کارنگاهى بیاندازید
- عدد مورد نیاز خود را تقسیم بر ۲۵۶ بکنید و خارج قسمت و باقیمانده را در جایى یادداشت کنید.
- کاراکتر اسکى خارج قسمت و سپس کاراکتر اسکى باقیمانده کدشده عدد شما است
دیدگاه خود را بیان کنید.
باید وارد سایت شده باشید برای دیدگاه دادن