در نوبت پیشین ضعف ها و کاستی های ابزار جستجوی حروف مبهم و نامتعین در پایگاههای اطلاعاتی استاندارد توضیح داده شد و ضرورت طراحی و ایجاد کلاسی جدید که بتواند با سرعت زیاد و بالاسری حد اقل انواع جستجوی ها حروف مبهم و نامتعین را پشتیبانی نماید، به اثبات رسید. آنچه در این مقال می آید نگاهی است گذرا به روند تحلیل، طراحی و پیاده سازی این ابزار جستجوی جدید.
افزایش توان موتور جستجوی نرم افزارهای نور
طراحی و پیاده سازی ابزار جستجوی حروف نامتعین (CCWil
dCard)
مهندس مینایی
بخش سوم
5- طراحی و ایجاد جستجوی WildCard جدید:
مشکلات چهارگانه یا پنج گانه ای که پیشتر گفته شد، ما را به فکر طراحی و ساخت کلاس جدیدی برای جستجوی حروف مبهم و نامتعین وا داشت که خوشبختانه طراحی و پیاده سازی آن در مدت بسیار کوتاهی به ثمر نشست.
5-1 طرح های مختلف کلاس جدید:
در این مطلب که کلاس جدید باید از کلاس سوپرلیست الهام بگیرد و توابع () At و، Operator {] و () Progress و () timer و () Next را داشته باشد، بحثی نبود.
از این رو تنها کاری که در مرحله نخست انجام شد این بود که کلاس CCWildCard جدید را از زیر نفوذ و تاثیر CDAORecord Set خارج کردیم و در نتیجه هر متغیر و اشاره گری که مربوط به بدنه کلاس قدیم بود بریده شد. کلاس قبلی به CCOldWild تغییر نام یافت.
هدف از ایجاد و توسعه این کلاس جدید شبیه سازی جستجوی WildCard دیتابیس های استاندارد به همان چهار شکل توضیح داده شده در بخشهای قبل بود.
در ابتدا تصمیم گرفته شد که از جهت میانجی کاربر، میان این چهار گونه جستجو تمایز قائل شویم و تا مراحل پیاده سازی آن نیز پیش رفتیم، اما بعد از پیش رفتن کار متوجه شدیم که کاربران برنامه های ما ممکن است از قبل در برنامه های دائرة المعارفی یا ویندوز با این شکل جستجوی WildCard خو گرفته باشند. از این جهت با یک میانجی کاربر ساده و دو عملگر «×» و «؟» طراحی و توسعه برنامه به تصویب رسید.
در اینجا به ذکر چند مثال در مورد جستجوی حروف نامتعین و مبهم و دو عملگر «×» و «؟» می پردازیم تا نقش کلاس جدید در موتور جستجوی نامتعین واضح گردد.
مثال 1: «× ع × ص × م ×»; در جستجوی این رشته تمام کلماتی که این سه حرف به ترتیب در آنها قرار گرفته باشند به عنوان پاسخ بازگردانده می شوند. از این جهت مثلا در برنامه قاموس النور، با این جستجو 153 مورد پاسخ آورده می شود که اکثر قریب به اتفاق آنها مشتقهایی از ریشه «عصم » هستند; مانند: «فاستعصم » ، «لاعتصامهم » ، «یعصمها» ، «اعتصم » ، «الاعتصام » ، «المعصم » ، «المعصومین » ، «عاصم » و «عاصمک » . البته در ضمن آنها ممکن است کلماتی نیز یافت شوند که از ریشه عصم نباشند مانند «صعصعهم » ، «عرصاتکم » و «عصبتهم » . اما نمایش پاسخها همانطور که بعدا توضیح داده می شود، قابل گزینش است، کاربر می تواند به دلخواه خود عده ای از پاسخها را که مطلوب وی نیست از گردونه پاسخهای علامت (تیک) خورده خود خارج سازد.
مثال 2: «ع × ص × م » کلماتی را جستجو می کند که به همین ترتیب مشتمل بر این سه حرف باشد البته به شرط اینکه با حرف «ع» شروع شده و با حرف «م » خاتمه یافته باشد. مانند «عصاهم » ، «عصام » ، «عصیم » و «عیصوم » ، که در قاموس النور تعداد آنها به 18 می رسد.
مثال 3: «؟ ع ؟ ص × م؟» کلماتی را جستجو می کند که حرف دوم آنها «ع» و حرف چهارم آنها «ص» باشد. حرف اول و سوم می تواند هر چیزی باشد. حرف ما قبل آخر آن نیز باید حتما «م» باشد یعنی بعد از «م» تنها یک حرف واقع شده باشد، مانند «اعتصمت » ، «معاصمی » و «معتصما» .
مثالهایی از این دست بسیارند، اما هدف از عرضه این سه مثال ارائه ویژگیهای کلاسی است که قرار بود طراحی و پیاده سازی گردد.
اما روشهایی که برای طراحی این کلاس مطرح گردید از این قرار است:
5- 1- 1- استفاده از روش ماشین حالات قطعی (FSM) (1) :
در بحثهای تئوری محاسبات (2) و آتاماتا (3) یا گرامرهای وابسته به متن (4) ، در مباحث درس کامپایلر (5) ، روشهای دقیق و پیچیده ای برای بررسی حالات متصور برای یک جستجوی حرفی و پیمایش آنها وجود دارد. یکی از آنها ترسیم ماشین حالات قطعی رشته ای است که قرار است پیمایش شود. برای نمونه در مثال دوم «ع × ص × م » قرار است که سه حرف «ع و ص و م » به ترتیب مورد پیمایش قرار گیرد.
حرف شروع تنها در صورتی که «ع» باشد از سوی ماشین، پیمایش می شود. قدم بعدی تنها در صورتی ادامه پیدا می کند که «ص» را در مسیر پیمایش بیابد و در آخر تنها باید «م » قرار گیرد.
X ع - S
X I Y ص - X
م - S
چند دستور بالا دستورات زبانی است که می تواند پیمایش رشته دلخواه ما را به اثبات برساند.
استفاده از این روش در گرو ساخت این دستورات و یا درخت ماشین حالات قطعی برای هر رشته مورد جستجو بود، و ساخت این درخت در هر حالتی خصوصا هنگامی که عملگرهای «×» و «؟» با حروف مختلف ترکیب می شوند کار ساده ای نیست، و شاید در برخی از موارد نتوانیم ماشین حالات قطعی رشته را در مدت زمان کوتاهی ایجاد نماییم.
این روش به دلیل هزینه گزافی که بایستی برای ایجاد این ماشین پرداخت می شد، در حد مطالعه و بررسی باقی ماند و نوبت به پیاده سازی آن نرسید تا بتوانیم ارزیابی دقیقی از کارکرد آن به دست آوریم.
5- 1- 2- استفاده از موتور جستجوی نور:
استفاده از موتور جستجوی نور به این معناست که ما از همان روش جستجوی شی ءگرایی که در برنامه های نور برای جستجوی کلمات داشتیم با اندکی تغییر روی حروف پیاده سازی کنیم. در این روش از عملگر «×» به جای عملگر تقدم یا ترکیب عطفی ترتیبی) (ordered And) استفاده کنیم، و از عملگر «؟» به جای هر کاراکتر مبهم تعبیر نماییم. هنگامی که دو حرف مانند «عص × م » کاملا به هم می چسبند، این حالت در حکم این است که عبارت «عص» شامل دو ترمینال «ع» و «ص» می باشد، البته به شرطی که حالت عبارت (Phrase) در کار باشد.
بعد از این تعابیر می توان از همان عملگرهای موجود در موتور جستجوی نور، شرطهای رشته مورد نظر را در هر رشته دلخواهی از کلمات مورد بررسی قرار داد.
با مطالعه عمیق تری که انجام گرفت، نتیجه بخش بودن این روش بر خلاف روش سابق، قطعی تخمین زده شد. اما پیاده سازی این روش منوط به ناموفق از کار در آمدن روش های ساده تر دیگر بود. با توجه به زمان محاسبه این روش روی هر رشته و زحمتی که می بایست در استفاده از کلاسهای کتابخانه نور (NoorLib) می کشیدیم، ترجیح دادیم که پیاده سازی این روش را به مرحله آخر و بسته شدن تمام درهای ساده موکول کنیم.
5- 1- 3- استفاده از توابع () strstr و () :strchr
یکی از روشهای ساده ای که تصور می شد بتوان جستجوی WildCard را از طریق آن پیاده کرد، این بود که رشته مورد جستجو را به کاراکترها و زیررشته های موجود میان علامتهای «×» و «؟» تقسیم نمود; آنگاه حلقه کنترلی خاصی برای تنظیم حرف یا رشته مورد مقایسه، عملیات کنترل پیشروی و پسروی را در رشته مورد جستجو از یک سو و در رشته مورد مقایسه از سوی دیگر به عهده گیرد. این روش پیاده سازی گردید; طرح نسبتا موفقی بود; کار به مرحله اشکال زدایی نکشید، چون طرح بهتری از دل آن طرح استنباط شد. سرعت اجرایی این طرح به مراتب بهتر از دیتابیس های استاندارد بود و از نظر حجم نیز فضای بسیار کمتری را اشغال می نمود. اما چون طرح بعدی که طرح نهایی کلاس قرار گرفت سربار بسیار کمتری را بر دوش می کشید مکث زیادی روی آن نشد و استفاده چندانی از آن به عمل نیامد.
5- 1- 4- از طریق مقایسه دنو بافر و بازی با اشاره گرها: (6)
این روش به عنوان روش نهایی کلاس CCWildCard انتخاب گردید. امتیاز بزرگ این شیوه این است که در هسته اصلی جستجو، فراخوانی هیچ تابعی وجود ندارد و تنها از طریق بازی با اشاره گرها و مقایسه محتوای محل مورد اشاره، کار تطبیق و سنجش رشته مورد جستجو را انجام می دهد. در درون تابع () Next که پاسخهای جستجو را باز می گرداند، تابعی که هسته اصلی کلاس است به نام () IsMatch فراخوانی می شود.
اشاره گرهای مورد استفاده در برنامه دو اشاره گر است که یکی در ابتدای رشته مورد جستجو قرار می گیرد و دیگری در آغاز کلمه ای که می خواهد انطباق شروط رشته مورد جستجو، در آن، مورد بررسی قرار گیرد.
حال با در نظر گرفتن اینکه عملگرهای رشته مورد جستجو، «×» یا «؟» یا NULL (کاراکتر انتهایی کلمه) باشد، عملیات ویژه ای در این رشته کنترلی صورت می گیرد.
تنها در موقع رسیدن به انتهای کلمه و رشته وابسته به آن است که می توانیم قضاوت کنیم آیا این کلمه می تواند به عنوان پاسخ باز گردانده شود یا نه؟
5- 2- آزمون و اشکال زدایی از کلاس CCWildCard
ملاک ارزشمند و مهم در ارزیابی کلاس جدید و اشکال زدایی از آن که پیش روی ما قرار داشت این بود که ما دو کلاس با دو توان متفاوت در اختیار داشتیم که کاملا کار یکسانی انجام می دادند; کلاس CCOldWild که عملیات جستجوی حروف نامتعین و مبهم را با کمک دستورات زبان SQL و در محیط دیتابیس های استاندارد انجام می داد و دیگری کلاس CCWildCard که فرآیند جستجو را در ناحیه (buffer) های حافظه و حرکت اشاره گرها روی آنها انجام می داد. کلاس نخست نیاز چندانی به آزمون نداشت بلکه تنها در ناحیه چینش خود اطلاعات و کیفیت تولید دیتابیس و بازیابی اطلاعات از جداول آن، آزمونهای مختصری انجام گرفت. هیچ کدام از آنها در جهت تصحیح عمل دستور SQL نبود، چون سالهای متمادی بود که عملکرد آن به شکل قطعی جواب گرفته بود.
اما کلاس دوم یعنی کلاس جدید ما بیشتر در ناحیه درست عمل کردن تابع () IsMatch بایستی مورد آزمون قرار می گرفت. از این رو محیطی را در نسخه های اولیه قاموس النور فراهم کردیم تا دو شی ء (7) و نمونه (8) از کلاس CColdWild که همان وایلد کارد استاندارد بود و دو نمونه از کلاس جدید CCWildCard را پیاده سازی نمودیم. به این ترتیب محیط بسیار مناسبی فراهم شد تا بتوان به طور هم زمان نتایج جستجوی وایلدکارد را در دیتابیس های استاندارد و در محیط جدید با هم مقایسه نمود. گر چه این دو کلاس از جهت سرعت با هم قابل مقایسه نبودند و جواب گرفتن از کلاس استاندارد بسیار کند و ملال آور بود، اما چاره ای وجود نداشت. این روش، بهترین شیوه آزمودن کلاس جدید بود.
بیشتر اشکالهایی که در کلاس وجود داشت، در مورد کلماتی بود که برای صحت شرط می بایست برگشت به عقب می کردیم.
بعضی از مثالهای باگ گیری شده عبارت بودند از:
(× ا × ب × ت) در کلماتی مانند "ابتت"
(× ب × ر؟ م ×) در کلماتی مانند "بجریرتهم"
× مال) در کلماتی مانند "ممال"
(؟ ب × ب) در کلماتی مانند "تببب"
(؟ ب ؟ و ا ر ×) در کلماتی مانند "باجوار"
(× تتب ×) در کلماتی مانند "تتتبع"
(× و و) در کلماتی مانند "اووو"
(× و ؟ و) در کلماتی مانند "وذوو"
اینها نمونه هایی بودند از موارد متعددی از اختلاف پاسخها در کلاس استاندارد و کلاس جدید. بیشتر محلهای اشکال در برگشت به عقب به اندازه کاراکترهای تطبیق شده و شروع آزمون مجدد حرکت اشاره گرها تا تطبیق و عدم تطبیق با شروط رشته بررسی گردد، کار بسیار پیچیده ای بود.
تحلیل اصل فکر کلاس جدید در ظرف دو روز انجام گرفت و در طی دو روز پیاده سازی شد.
اما در طی دو هفته عملیات آزمون و اشکال زدایی به نهایت رسید. به این ترتیب کار به جایی رسید که بخش کنترل کیفیت نرم افزار مرکز تحقیقات کامپیوتری علوم اسلامی از یافتن اشکال و موارد اختلاف بین دو مورد استاندارد و کلاس جدید مایوس شدند و تایید نهایی را بر پایه این کلاس گذاشتند.
وضع اولیه کلاس جستجوی حروف مبهم، روی واحد کلمات لیست بود. اما واحد آن می توانست آیه، حدیث، یا یک پاراگراف باشد. همان طور که بعد از آن در بخش آیات، جامع احادیث نور (9) در واحد آیات این کلاس به خوبی قابلیتهای خود را نشان داد. همچنین در درایة النور، در قسمت اعلام، کتابهای هشت گانه رجالی و معجم رجال الحدیث و نیز حتی اسناد و طرق کتابهای رجالی این کلاس به خوبی و آسانی پیاده سازی گردید.
5- 3- برتریها و مزایای کلاس جدید بر کلاس استاندارد:
چند نقطه محوری موجب شد که از کلاس دیتابیس استاندارد عدول کنیم و دست به طراحی کلاس جدیدی برای جستجوی حروف نامتعین و مبهم (WildCard) شویم که در اینجا به برخی از آنها اشاره می نماییم:
5- 3- 1- سرعت فوق العاده
سرعت معمولی هر گونه جستجویی در محیط دویست هزار رکوردی کمتر از دو ثانیه است، حال آنکه در دیتابیس استاندارد، این سرعت همواره بیش از چهل ثانیه می باشد یعنی ما در کلاس جدید لا اقل شاهد بهبود سرعتی معادل بیست برابر بودیم. حال آنکه در بسیاری از جستجوهای پیچیده، سرعت جستجو در کلاس استاندارد از یک دقیقه تجاوز می کرد اما در کلاس جدید همواره از سرعت ثابت دو ثانیه و کمتر برخوردار بودیم.
5- 3- 2- کم بودن فضای اشغال شده حافظه جانبی:
همان طور که در بخش سابق گفتیم، سرجمع فضای مورد نیاز برای کلاس جدید، تقریبا بیست برابر کمتر از فضای مورد نیاز کلاس دیتابیس استاندارد می باشد. دلیل این امر را در وهله نخست می توان مرهون این امر دانست که کلاس جدید برای ذخیره سازی اطلاعات نیاز به استفاده از فضای ثابت (fix) برای هر کلمه ندارد، حال آنکه در دیتابیس های استاندارد چنین نیست. دلایل دیگری نیز وجود دارد که در طی بندهای بعد به آنها اشاره می کنیم.
5- 3- 3) عدم نیاز به ایندکس:
همان طور که پیش از این اشاره شد، در دیتابیس استاندارد برای افزایش سرعت در جستجو، عملیات ایندکس کلمات مورد نیاز است، حال آنکه در کلاس جدید هیچ نیازی به انجام این کار نیست بلکه سرعت آن قدر خوب است که نیازی به بهبود ندارد. ما در مرحله تحلیل و طراحی پیش بینی کرده بودیم که با چند ترفند ساده می توان سرعت را در جستجوی وایلدکارد تا حد بسیار خوبی ارتقا بخشید. اما بعد از توسعه و ایجاد کلاس، متوجه شدیم که آن قدر سرعت بالاست که نیازی به متوسل شدن به ترفندهای جانبی نیست. لازم به ذکر است که ایندکس در دیتابیس استاندارد تنها سرعت را در یک نوع از چهار نوع جستجو بهبود می بخشد و آن هم جستجوی کلماتی است که با چند حرف متصل شروع می شوند. با توجه به عدم نیاز به ایندکس، فضای اشغال شده توسط ایندکس در کلاس جدید صرفه جویی می شود.
5- 3- 4- عدم نیاز به ذخیره سازی فیلد نادقیق:
هسته اصلی جستجو کاملا در اختیار خود ما بود; بنا بر این دست ما برای انواع و اقسام توسعه های جانبی باز بود. عملیات جستجوی نادقیق، در کلاس جدید کاملا به صورت «در زمان اجرا (Runtime) » روی همان اطلاعات دقیق انجام می شود. عملیات تبدیل دقیق به نادقیق در حافظه، زمان چندانی نمی گیرد; به همین جهت زمان جستجوی دقیق و جستجوی نادقیق در سراسر رکوردها یکسان است و به هیچ وجه با یکدیگر تفاوت ندارد. این سرعت خوب از مسیر افزایش حجم به دست نیامده بود تا با افزایش حجم بیشتر بخواهیم در مورد جستجوی نادقیق، برای افزایش سرعت فضای بیشتری نیاز داشته باشیم. نکته قابل ذکر در جستجوی نادقیق این است که در پیاده سازی این ویژگی نیز از فراخوانی هر تابعی به جد پرهیز کرده ایم و حتی یک بار یک تابع - ولو یک تابع جزئی - از کتابخانه C و C + + فراخوانی نمی شود. علت تاکید بر این امتیاز و اینکه از آن با اعجاب یاد می کنیم این است که در فراخوانی هر تابعی، تمام رجیسترهای سیستم مقادیرشان داخل (Stack) حافظه پشته، نگهداری (Push) می شوند و موقع تمام شدن کار تابع، دوباره تمام رجیسترها به مقدار قبلی باز گردانده می شوند (POP) . خود همین عمل که در حلقه های پر تکرار صورت می گیرد، زمان گیر است.
البته چگونگی پیاده سازی عملیات جستجوی نادقیق و تفاوت جستجوی نادقیق در دل جستجوی حروف نامتعین و مبهم WildCard با جستجوی نادقیق که در بخشهای قبلی توضیح داده شد، خواهد آمد.
5- 4- تفاوت دقت در وایلدکارد و دقت در موتور جستجوی نادقیق:
همان گونه که پیشتر گذشت در جستجوی حروف نامتعین و مبهم (WildCard) همانند موتور جستجوی اصلی برنامه، در اختیار داشتن دقت، حالت انتخابی (Optional) دارد و در قالب گزینه ای به دست خود کاربر می باشد.
اما دقت در وایلدکارد با دقت در جستجوی معمولی، تفاوت غایی و کاربردی دارند. در توضیح این مطلب می توان گفت:
در جستجو و فهرست کلمات، در بحث دقت و عدم دقت، زاویه حالت نوشتاری کلمات و حروف را در نظر می گرفتیم، بنا بر این دیدگاه، پنج گروه (ا، ا، ا)، (ة و ه)، (ی، ی، ئ)، (و، ؤ) و (ی ، ئ) داشتیم که دقت و عدم دقت در آنها تجسم می یافت.
اما هدف از عدم دقت در جستجوی حروف مبهم و نامتعین (WildCard) ریشه یابی کلمه و یافتن حروف اصلی کلمات و مشتقات یک ریشه می باشد. از این منظر، سه دسته و گروه تشکیل گردید:
گروه نخست: (ا، ا، ا، ء، ؤ، ئ ، ئ) همه همزه ها در یک گروه واقع شده اند.
گروه دوم: (ی، ی)
گروه سوم: (ة، ه)
در این دیدگاه از عدم دقت، کسی که ریشه «امن » را دنبال می کند، کلمات «مؤمن » ، «الامناء» ، «یؤمن » ، «ایمان » ، «استامنوا» و «فیؤمنون » نیز آورده می شود. البته این در صورتی است که گزینه دقت خاموش باشد و رشته مورد جستجو « × ا × م × ن ×» باشد.
نکته قابل ذکر در اینجا این است که در این منظر از عدم دقت، تمام حروف کوچک و بزرگ نیز با یکدیگر هم گروه می شدند همان طور که در منظر اول چنین بود.
5- 5- امکان گزینش در حاصل جستجوی وایلدکارد:
بر پایه همین دیدگاه که در بحث عدم دقت در جستجوی وایلدکارد گذشت و اینکه هدف، یافتن مشتقات مختلف یک ریشه با شرط یا شرط خاصی روی چینش حروف می باشد، باز مواردی در پاسخ رشته مورد جستجو آورده می شود که از آن ریشه مورد جستجو نیستند. در این صورت کاربر باید بتواند مواردی را که در غایت و هدف او نمی گنجد از گردونه پاسخها خارج کند. مقصود از خارج کردن، حذف فیزیکی جوابها نیست، بلکه منظور این است که با گذاردن علامتی روی پاسخ مورد نظر، کاربر بتواند تنها مواردی را که اراده کرده است در متون مورد جستجوی خود پاسخ یابی نماید. از این رو در وهله اول که جستجوی وایلدکارد انجام می شود، تمام پاسخها با نشانه «» علامت می خورند. برای حذف علامت «»، کلیدهایی در نظر گرفته شده اند و در درون کلاس وایلدکارد نیز تابعی به همین عنوان تعبیه گردیده است. کلیدهای دیگری نیز برای حذف تمامی «» ها یا اضافه کردن علامت «» به تمامی کلمات و یا معکوس حالت قبل تعبیه شده است که این کارها با استفاده از توابع () InvertAll () , DClearAll () , Clear () , SetAll () , Set () , Invert از کلاس CCWildCard انجام می پذیرد.
به عنوان مثال در جستجوی ریشه «ص × ب × ر ×» کلماتی مانند «صنوبر» یا «الصنبر» نیز آمده است که می توان با همین کلیدها، علامت تیک را از کنار آنها برداشت تا در جستجوی کلی هیچ یک از موارد آن گروه وایلدکارد، این دو کلمه در فهرست پاسخها قرار نگیرند.
5- 6- مدیریت چند وایلدکارد به طور هم زمان:
با توجه به کیفیت پیاده سازی کلاس CCWildCard و انطباق کامل آن بر شیوه برنامه سازی شی ءگرایی) (Object-Oriented) ، استفاده توامان از چند شی ء (Object) از این کلاس به طور هم زمان، هیچ مشکل خاصی را در مرحله پیاده سازی برای کاربر برنامه نویس ایجاد نمی کند.
به عنوان مثال در برنامه قاموس النور دو گروه وایلدکارد به طور توام تعبیه شده است و در برنامه جامع احادیث نور نیز در آن واحد، در هر محیط جستجو چهار گروه وایلدکارد داریم. با توجه به چهار محیطی بودن برنامه، به طور هم زمان 12 گروه وایلدکارد برای جستجوی کلمات متن و 12 گروه وایلدکارد برای جستجو در کلمات فهرست در اختیار داریم. یعنی 24 گروه وایلدکارد همزمان داریم. حال آنکه هیچ مشکل حادی در استفاده از تعداد زیاد از اشیای این کلاس برای کاربر برنامه نویس و برای حافظه کاربر نهایی برنامه ایجاد نمی نماید.
یکی از موارد استفاده داشتن چند گروه وایلدکارد جداگانه این است که کاربر می تواند مشتقات ریشه «صبر» و مشتقات ریشه «شکر» را هم زمان در دو گروه متفاوت داشته باشد و هر بار پاسخهای هر گروه را مشاهده نماید. با داشتن چنین ویژگی، خصوصیت دیگری تصور می شود که با وجود آن، دامنه تحقیق کاربر به طرز قابل ملاحظه ای افزایش می یابد و این همان چیزی است که در بند بعد به آن اشاره می کنیم.
5- 7- امکان ترکیب منطقی وایلد کاردهابایکدیگروباکلمات مستقل:
بعد از اینکه کاربر توانست به طور هم زمان چند گروه وایلدکارد فعال جداگانه داشته باشد، طبیعی است که قدرت دیدن پاسخهای مشترک و مجتمع دو گروه نیز از قابلیتهای بسیار خوبی است که می تواند کاربردهای حرفه ای در امر تحقیقات داشته باشد. مثلا دیدن احادیث، آیات یا پاراگرافهایی که مشترکا هم در باره صبر و هم در باره «شکر» مطلبی دارند کاربرد خاص خود را دارا است.
با توجه به کاربردی بودن این ویژگی، امکان دیدن هر عنصر و هر پاسخ وایلدکارد به تنهایی، و یا امکان مشاهده پاسخها به صورت گروهی در برنامه های جدید نور گذاشته شده است. هنگامی که یک گروه از عناصر وایلدکارد فعال است، اگر کاربر روی هر پاسخ و یا عنصر جواب تقه بزند یا روی کلید جستجو فشار دهد تنها پاسخهای مربوط به عنصر فعال لیست وایلدکارد - یعنی آنکه نوار رنگی روی آن قرار گرفته است - آورده می شود. اما اگر بخواهد به صورت دسته جمعی تمام عناصر تیک خورده داخل لیست را مشترکا با یکدیگر، به ترتیب وقوع در کتابها مشاهده نماید، باید با فشار دادن روی کلید انتقال گروه (که معمولا به شکل نمایش داده می شود) و یا نوشتن شماره گروه ("1" یا "2" یا "3" یا "4") در خط ورودی جستجوی OnLine که در پایین صفحه جستجو قرار گرفته است و کلید شروع جستجو، تمامی پاسخهای مربوط به تمام کلمات به صورت مرتب آورده می شود و هیچ مشکلی در رنگی کردن موارد جستجو وجود ندارد.
حال اگر هم "1" را به خط ورودی جستجو منتقل کردیم و هم "2" را، می توان از هر نوع عملگری که در موتور جستجوی نور گذاشته شده است میان آن دو استفاده نمود. اگر گروه "1" مشتمل بر مشتقات "صبر" باشد و گروه "2" مشتمل بر مشتقات "شکر" باشد، "1 & 2" اشتراک موارد دو مشتق را در پاسخ می آورد. [2 AND 1]
"1 ؛ 2" اجتماع موارد دو گروه را در پاسخ می آورد که همان [2 OR 1] می باشد.
"1-2" مواردی را که مشتقات "صبر" بر مشتق "شکر" مقدم هستند در پاسخ می آورد. [2 Ordered And 1] .
"1 2" مواردی را که عبارت دو مشتق در پاسخها ظهور یافته است یعنی بعد از مشتق " صبر"، بلافاصله مشتق "شکر" آمده است مانند آیاتی که "صبار شکور" را دارا است در پاسخ می آورد.
"1 ^ 2" مواردی را که یا مشتق "صبر" دارند یا مشتق "شکر"، به صورت «یا» ی مانعة الجمع در پاسخ می آورد.
[2 XOR 1] نکته بسیار مهم دیگر این است که می توان هر چهار گروه وایلدکارد را فعال نمود و با انتخاب شماره گروه در خط ورودی جستجو، انواع و اقسام ترکیب منطقی را میان گروهها برقرار نمود. همچنین می توان حاصل ترکیب یک یا چند گروه را با کلمات دیگر ترکیب نمود. مثلا در برنامه جامع احادیث نور2 اگر در گروه 1، موارد مشتقات «وضوء» را جستجو کرده باشیم با نوشتن "1 & ابن ابی عمیر" در خط ورودی جستجو، احادیثی آورده می شود که به شکلی «ابن ابی عمیر» روایتی در مورد وضو دارد. با توجه به اینکه جستجوی دقیق و نادقیق در اینجا هم به صورت انتخابی در اختیار کاربر قرار می گیرد، جنبه تحقیقی و کاربردی موتور جستجوی نور با این ویژگی امکان ترکیب منطقی گروههای وایلدکارد با یکدیگر و یا کلمات، صد چندان فزونی گرفته است.
5-8- مدیریت وایلدکاردهای دارای پاسخ زیاد:
از جمله عملیاتی که به هنگام ارائه پاسخهای دسته جمعی تمامی اعضا و عناصر یک گروه وایلدکارد انجام می شود، فرآیند مرتب سازی نشانیهای تک تک عناصر فهرست پاسخهای پویای وایلدکارد می باشد. اگر قرار بود که نشانیهای یک گروه وایلدکارد بدون مرتب سازی عرضه شود، حالت مضحکی اتفاق می افتاد یعنی تمام جوابهای یک عنصر یکجا می آمد; سپس سراغ کلمه دیگر می رفتیم و پاسخهای آن را عرضه می کردیم; امکان حذف پاسخهای تکراری نبود. به این ترتیب شاید یک پاراگراف چندین بار عرضه می شد اما در هر مورد، کلمه خاصی رنگی می شد و استفاده از برنامه به سطح بسیار نازلی می رسید. پس ناچار می بایست عملیات (Merg) و ادغام مرتب آدرس تمامی اعضای فهرست پویا قبل از ارائه پاسخها انجام می شد.
هنگامی که تعداد اعضا زیاد باشد، فرآیند این مرتب سازی طولانی تر می گردد.
حتی اگر تعداد اعضای فهرست پویای پاسخها از هزاران و دهها هزار نیز تجاوز کند، چون دست کاربر برای وارد کردن " × " در خط ورودی جستجوی وایلدکارد باز است، این امکان وجود دارد که تمامی عناصر لیست اصلی در فهرست پویا بیاید. حال اگر [ال ×] را در خط ورودی بنویسید، تمامی کلماتی را که با «ال» شروع می شوند می آورد. وقتی تعداد به این میزان بالا می رود، عملیات Merg آدرس ها بسیار طولانی می شود. ما در مقام طراحی برنامه تصمیم گرفتیم که در این گلوگاه، محدودیتی را در نظر بگیریم تا کاربرد برنامه واقعی تر و کارآتر گردد. قرار شد که در هنگام پیاده سازی و گرفتن پاسخها و زمان مرتب سازی آدرس ها، نوعی محدودیت کاربردی اعمال گردد.
فرآیند مرتب سازی آدرس ها و ادغام (Merg) آنها به وسیله تابع () Quick Sort انجام می گرفت لذا زمان انجام عملیات مرتب سازی از سرعت و کارآیی خوبی برخوردار بود.
در مقام عمل تعداد 5000 عنصر به عنوان محدودیت در نظر گرفته شد; یعنی اگر تعداد عناصر تیک خورده از 5000 بیشتر باشد عملیات جستجوی دسته جمعی صورت نمی گرفت. برای بالاتر بردن کارآیی کلاس، فرآیند گزینش دسته جمعی و تیک زدن گروهی را طراحی کردیم. به این ترتیب این امکان فراهم می شد که 5000 تا 5000 تا یا در دسته های کوچک تر، عملیات تیک زدن ادامه یابد تا کاربر بتواند با کارآیی قابل توجهی عملیات جستجوی دسته جمعی را در اختیار داشته باشد.
5-9- نتیجه گیری و چشم انداز آینده کلاس وایلدکارد
با توضیحاتی که در طی هشت بند سابق گذشت، مشخص گردید که سعی ما بر این است که هر آنچه را که پژوهشگر در مسیر تحقیقاتی خود نیاز دارد، برای او در موتور جستجوی نور فراهم نماییم.
یکی از گامهای مؤثر در افزایش توان این موتور، ابزار جستجوی حروف نامتعین و مبهم و اصطلاحا WildCard بود که خوشبختانه در مدت کوتاهی توانستیم آنچه را که دیتابیس های استاندارد و زبان SQL در فهرست سازی پویا انجام می داد، در مدت زمان بسیار بهتر و با اشغال فضایی بسیار کمتر، شبیه سازی نماییم. کلاس آماده شده جدید، قابل ترمیم و تکمیل بوده و به راحتی می توان ویژگیهای جدیدی را به آن افزود.
اضافه کردن عملگر حرف عله ("و"، "ی" و الفی که منقلب از واو و یا باشد) به هسته جستجوی وایلدکارد و اعمال جستجوهای ویژه روی آنها و نیز قوانین مهموز و مضاف می تواند در حوزه چشم اندازهای آینده کلاس وایلدکارد قرار گیرد.
ادامه دارد. . .
1) Microsoft Foundation
2) Microsoft Developer Network
3) Finite State Machine
4) Computation Theory
5) Automata Theory
6) Non-Context-Free Grammers
7) Compilers
8) Pointers
9) Object