جدول المحتويات
دراسة محركات البحث
نظرة عامة وفهم المصطلحات
إن أي محرك بحث أو نظام IR أي نظام استخراج المعلومات Information Retrieval system يتكون من مراحل منفصلة هي
- حفظ المحتوى وفي حالتنا نحن حفظ المحتوى في ملفات SQLite منفصلة
- مرحلة تلقيم المحتوى للفهرسة وهي تتم مرة واحدة (ما لم يتغير المحتوى)
- الاستعلام وهو أن يطلب المستخدم البحث عن شيء ما ويجب أن يعيده النظام مرتب وفق تقييم rank لمدى الارتباط Relevance
يقسم النظام المحتوى إلى عدد من الوحدات الجوهرية تسمى كل منها وثيقة Document ويكون بها عدد من الحقول Fields أحدها معرف فريد (رقم أو URL …) وفي حالنا الوثيقة الواحدة هي الفصل أو الباب في الكتاب (أو الحديث في كتب الحديث أو الراوي في كتب الرجال …) ونميزه عبر وسم “تبويب” وهنا نحفظ معرفه ومعرف الكتاب
الحقول المختلفة في إما أن تكون حقول محللة 1) أو حقول جامدة فالحقول الجامدة التي لا يتم قصها ولا تجذيعها أما الأولى فيتم تقطيعها عند المسافات ويتم قص السوابق واللواحق …إلخ
بعض الحقول يتم الاحتفاظ بها كما هي دون معالجة داخل الفهرس مثل المعرف وربما جزء ملخص من النص (أول فقرة مثلا ويسمى excerpt أو snippet) وبعضها الآخر لا يتم الاحتفاظ بها مثل النص نفسه لأنه كبير جدا لكن في المقابل يمكن في هذه الحالة الاحتفاظ بما يسمى Term Vector أي متجه الحدود 2) وهو معرّف كل كلمة وتكرارها وإزاحتها (وبالتالي ترتيبها) وحيث أن الوثائق المختلفة تستخدم نفس الكلمات يوفر الاحتفاظ بالمتجه المساحة ويقدم معلومات أكثر للفهرس. للمزيد من المعلومات انظر Vector Space Model
الاستعلام الثنائي هو أن يتم طلب كل الوثائق التي تحقق شرط مركب من عمليات ثنائية مثل
- “و” AND
- “أو” OR
- “وليس” AND NOT
مثلا البحث عن “أنس” و “بن” و “مالك” يُحضر كل الوثائق التي تحتوي هذه الحدود معا.
الاستعلام عن عبارة فهو البحث عن “أنس بن مالك” متتابعة حيث يكون الانحدار بين الحدود صفر (الانحدار هو أعلى قيم مسموحة لعدد الحدود التي تفصل بين الكلمات) ويمكن تحديد قيمة عليا للانحدار مع تفضيل الأقصر.
البحث عن عبارات مشابهة أو ما يسمى البحث الضبابي في مصطلح lucene هو البحث عن وثائق تقل فيها مسافة التحرير المحسوبة بخوارزمية ليفنشتاين Levenshtein algorithm عن الحد المطلوب وهي أقل عدد من العلميات لتحويل العبارة الأولى إلى الثانية من بين العمليات التالية:
- إضافة حرف
- حذف حرف
- تعويض حرف مكان آخر
مثلا التحرير بين “kitten” و “sitting” هي 3 حيث نحتاج لتحويل k إلى s ثم تحويل e إلى i ونضيف g وعملية إيجاد الرقم معروفة بخوارزمية رياضية على المصفوفات دون تجريب
وفي lucene يمكن أن نستعلم عن الوثائق المشابهة لعبارة ونقدم رقم بين 0 و 1 مثل 0.6 وهو رقم يضرب في طول الاستعلام
ويقدم محرك lucene طريقة للجمع بين هذه الأنواع حيث يقدم المستخدم الباحث سلسلة نصية يتم إعرابها عبر QueryParser وتجد توثيق لها في query parser syntax مثلا يمكن أن يطلب أحدهم البحث عن “الخط العربي”~10 تعني أن لا تزيد الحدود الفاصلة بين الكلمتين عن 10 حدود و roam~0.6 تعني كلمة تشبه roam بمقدار 60% أي مقدار مسافة التحرير لا تزيد عن 1.6 حرف
المزيد:
الكلمات المهملة stopwords
الكلمات المهملة أو المستبعدة stopwords هي الكلمات ذات التكرار العالي وليس لها دلالة خاصة مثل حروف الجر والأدوات. وهذه يتم إهمالها في أغلب محركات البحث ومن أمثلتها كلمة from (والتي تعني من) و كلمة to (والتي تعني إلى) ولان ههذه الكلمات تتكرر كثيرا فإن اهمالها يؤدي إلى تقليل حجم فهرس البحث (وبالتالي قد ينعكس هذا على زيادة السرعة وتقليل استهلاك الذاكرة) لكن الهدف من إهمالها ليس التوفير بل هو إهمال تطابقات غير مرغوبة مثلا عند البحث عن “سلم من لسانه” وكان الرابط هو علاقة “أو” هذا يعني أن نص وردت فيه كلمة “من” كثيرا أهم من نص وردت فيه كلمة “لسان” مرات قليلة مع أننا لا نهتم بكلمة من قدر اهتمامنا ببقية الكلمات. طبعا خوارزميات تقييم النتائج المختلفة مثل idf تقلل من هذا الأثر السلبي بشكل تلقائي دون الحاجة للكلمات المهملة حيث أنها تقيس أهمية الكلمة نسبة لتكرارها في كل الوثائق وحيث أن كلمة مثل “من” تتكرر كثيرا مما يجعل نسبتها في أي وثيقة رقم صغير مهمل.
في اللغة العربية أرى أنه لا يوجد حاجة لإهمال مثل هذه الكلمات مثلا لو أخذنا “من” قد تكون ناتجة من تجذيع “المن والسلوى” وكلمة “إلى” مقارنة مع إلينا …إلخ حيث أن الكلمات هذه يجب أن تكون منفصلة لا تقبل التصرف والإضافة. يمكن حساب الكلمات المستبعدة تلقائيا وذلك بأخذ عينة ممثلة من عدد كبير من الوثائق المتنوعة (وليس وثيقة واحدة) ثم إحصاء idf (أي التردد العكسي للوثائق inverse document frequency) لكل كلمة في العينة حيث تكون قيمته للكلمات المستبعدة قريبة من الصفر (يمكن أخذها أقل من قيمة معينة مثلا 0.25) ويحسب بالعلاقة:
idf=log(nD/nd)
أي لوغاريتم النسبة بين عدد كل الوثائق nD على عدد الوثائق التي يظهر فيها الحد nd. مثلا إن ظهرت الكلمة “في” في 100 وثيقة من أصل عينة مكونة من 100 وثيقة يكون لو(100/100) = لو 1 = 0
لكن إن ظهرت كلمة “حيث” في 99 وثيقة من أصل 100 وثيقة يكون لو(100.0 / 99.0) = لو 1.01 = 0.01
التجذيع stemming
إن طلبنا من محرك البحث معالجة الكلمات فإنها يرسلها لدالة التجذيع وهي دالة تسقط عدة قيم إلى نفس الصورة many to one transformation حيث ترسل كلمات مثل play و played و playing إلى نفس الصورة وهي في مثالنا play حيث أن البحث عن هذه يجب أن يقود لتلك. ليس بالضرورة أن تكون الدالة دقيقة حيث يفترض أن ترسل عدة كلمات غالبا ما تكون متعلقة ببعضها صرفيا إلى نفس الصورة
محرك البحث lucene يحتوي على عدة محللات للتجذيع والقياسي ليس أقوى محلل للقة الإنجليزية بل هناك Snowball حيث يقوم بما يلي بعد التقطيع القياسي:
- StandardFilter
- LowerCaseFilter - تحويل كل الحروف إلى صغيرة
- StopFilter - إهمال الكلمات بعض الكلمات الإنجليزية
- SnowballFilter - التجذيع وفق طريقة Snowball
وطريقة SnowBall في التجذيع طريقة فريدة حيث هي لغة خاصة لوصف خوارزميات التجذيع.
لكن لم وهناك عدد من الأمثلة للغة العربية لكنها غالبا من وضع معاهد من يعمل عليها لا يعلم شيء عن اللغة العربية
انظر التجذيع
ترتيب النتائج Ranking
بعد حصر التطابقات يتم تقييمها عبر عدة خوارزميات انظر scoring وهو تقييم يشبه حساب جتا الزاوية بين متجهين (من هنا جاء مصطلح متجه الحدود أي الكلمات الذي ذكرناه سابقا) حيث يكون جتا الزاوية يساوي 1 إذا تطابق المتجهين ويحسب جتا عن طريق الضرب بين مساقط الاستعلام والوثيقة مقسوما على طول كل منهما وهناك نموذج يبسط ذلك تستفيد منه lucene اسمه term frequency–inverse document frequency
أي حاصل ضرب tf وهو التكرار النسبي للحد في الوثيقة (أي مجموع تكرار الحد في الوثيقة td على مجموع تكرار الحد في كل الوثائق tD) في idf وهو مدى أهمية الحد عبر قياس لوغاريتم النسبة بين عدد كل الوثائق nD على عدد الوثائق التي يظهر فيها الحد nd
tf=sum(td)/sum(tD) idf=log(nD/nd)
هذا للحد الواحد
وهناك خوارزمية أفضل اسمها Okapi BM25 وهي متوفرة في Lucene
وهي كما تعرفها xapian تحسب بالعلاقة
( (k2 . nq) (1-L)/(1+L) ) + sum(for all t: ((k3+1)q.(k1+1)f / ((k3+q).(K+f))).log( (r+0.5)(N-n-R+r+0.5)/((n-r+0.5)(R-r+0.5)) ) )
حيث
- t الحد term
- q تكرار الحد في الاستعلام term within query frequency,
- f تكرار الحد في الوثيقة term within document frequency,
- n عدد الوثائق التي تحتوي الحد
- N عدد كل الوثائق
- r عدد كل الوثائق التي تتعلق بالحد t
- R عدد كل الوثائق التي المتعلقة بالاستعلام
- nq عدد الحدود في في الاستعلام
- L طول الوثيقة النسبي (طول الوثيقة على متوسط طول الوثيقة وهو يساوي 1 للوثيقة متوسطة الطول)
- b و k1 و k2 و k3 ثوابت
- K ثابت يعتمد على L ويعطى بالعلاقة
K = k1(bL + (1-b))
المزيد:
محرك البحث Whoosh
محرك بحث مكتوب حصريا على بايثون وبالتلي يعمل على كل المنصات التي تعمل عليها بايثون
تكمن فائدة هذا المحرك هو سرعة التطوير ويمكن الاستفادة من وضوح كود بايثون في فهم خوارزميات البحث المختلفة
حيث أنه يوفر العديد منها مثل BM25 و tf-idf
وعند تجربته لم يكن يعمل مع اللغة العربية لكن تخصيصه كان أمرا سهلا فهو يوفر العديد من صنوف التقطيع
يقول الموقع أنه أقل سرعة من lucene إلا أن ذلك غير ملموس فقد استغرق الكود المبدئي أقل من دقيقة ونصف في فهرسة عينة من الكتب (بحجم 35.2 م.ب وهي بخاري ومسلم والموطأ والسلسلة الصحيحة ومقالة PyQt4 ومقالة للتجربة) وكان حجم الفهرس مقبولا جدا حيث وصل إلى حوالي 20% من حجم النص (7.1 م.ب) ربما السبب هو كثرة الحركات في النص حيث تهملها الفهرسة
أما سرعة الاسترجاع فهي شبه آنية إليك مثال
./WhSearchDb.py ترك الصلاة كفر 44 data/db/muslim.db:3014 بيان إطلاق اسم الكفر على من ترك الصلاة data/db/muslim.db:85 بَاب بَيَانِ إِطْلَاقِ اسْمِ الْكُفْرِ عَلَى مَنْ تَرَكَ الصَّلَاةَ data/db/bukhari.db:4527 { وَإِذْ يَرْفَعُ إِبْرَاهِيمُ الْقَوَاعِدَ مِنْ الْبَيْتِ وَإِسْمَاعِيلُ رَبَّنَا data/db/muslim.db:3012 بيان نقصان الإيمان بنقص الطاعات وبيان إطلاق لفظ الكفر data/db/malik.db:435 بَاب مَا جَاءَ فِي بِنَاءِ الْكَعْبَةِ data/db/bukhari.db:7411 وقول الله تعالى إلا من أكره وقلبه مطمئن بالإيمان data/db/muslim.db:4673 تحريم رجوع المهاجر إلى استيطان وطنه data/db/bukhari.db:1997 بَاب فَضْلِ مَكَّةَ وَبُنْيَانِهَا data/db/malik.db:555 بَاب مَا لَا يَجُوزُ مِنْ النُّذُورِ فِي مَعْصِيَةِ اللَّهِ data/db/muslim.db:2986 تفاضل أهل الإيمان فيه ورجحان أهل اليمن فيه data/db/muslim.db:2998 بيان حال إيمان من رغب عن أبيه وهو يعلم data/db/muslim.db:3670 ما عرض على النبي صلى الله عليه وسلم في صلاة الكسوف data/db/muslim.db:563 بَاب اسْتِحْبَابِ الْقُنُوتِ فِي جَمِيعِ الصَّلَاةِ إِذَا نَزَلَتْ بِالْمُسْلِمِينَ نَازِلَةٌ data/db/muslim.db:4653 وجوب طاعة الأمراء في غير معصية وتحريمها في المعصية data/db/muslim.db:4471 صحة الإقرار بالقتل وتمكين ولي القتيل من القصاص واستحباب data/db/muslim.db:3086 نزول عيسى ابن مريم حاكما بشريعة نبينا محمد صلى الله data/db/bukhari.db:4427 بَاب أَيْنَ رَكَزَ النَّبِيُّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ الرَّايَةَ يَوْمَ الْفَتْحِ data/db/muslim.db:4986 الطب والمرض والرقى data/db/muslim.db:1175 بَاب نَقْضِ الْكَعْبَةِ وَبِنَائِهَا data/db/muslim.db:4322 استحباب الوضع من الدين data/db/muslim.db:4410 ترك الوصية لمن ليس له شيء يوصي فيه data/db/muslim.db:2960 الأمر بقتال الناس حتى يقولوا لا إله إلا الله محمد data/db/muslim.db:4000 جواز التمتع data/db/muslim.db:3412 نهي من أكل ثوما أو بصلا أو كراثا أو نحوها مما له data/db/muslim.db:3842 إعطاء المؤلفة قلوبهم على الإسلام وتصبر من قوي إيمانه data/db/muslim.db:4092 نقض الكعبة وبنائها data/db/muslim.db:4354 أخذ الحلال وترك الشبهات data/db/muslim.db:3130 الدليل على دخول طوائف من المسلمين الجنة بغير حساب data/db/muslim.db:4242 وجوب الكفارة على من حرم امرأته ولم ينو الطلاق data/db/muslim.db:3418 سجود التلاوة data/db/muslim.db:5379 وَفِي هَذَا الْحَدِيث تَصْرِيح بِإِثْبَاتِ الْقَدَر data/db/bukhari.db:7291 بَاب رَجْمِ الْحُبْلَى مِنْ الزِّنَا إِذَا أَحْصَنَتْ data/db/muslim.db:4485 من اعترف على نفسه بالزنى data/db/muslim.db:4855 إكرام الضيف وفضل إيثاره data/db/muslim.db:4819 آداب الطعام والشراب وأحكامهما data/db/muslim.db:5081 إثبات حوض نبينا صلى الله عليه وسلم وصفاته data/db/muslim.db:4102 سفر المرأة مع محرم إلى حج وغيره data/db/muslim.db:4913 تحريم تصوير صورة الحيوان وتحريم اتخاذ ما فيه صورة data/db/muslim.db:4124 فضل المدينة ودعاء النبي صلى الله عليه وسلم فيها data/db/bukhari.db:4165 بَاب عَلَامَاتِ النُّبُوَّةِ فِي الْإِسْلَامِ data/db/bukhari.db:4037 قول الله تعالى واتخذ الله إبراهيم خليلا data/db/muslim.db:2946 أَهَمُّ مَا يُذْكَرُ فِي الْبَاب اِخْتِلَاف الْعُلَمَاء فِي الْإِيمَان data/db/muslim.db:2964 الدليل على أن من مات على التوحيد دخل الجنة قطعا data/db/muslim.db:3112 أدنى أهل الجنة منزلة فيها
لاحظ أن استعمال علامة الاقتباس “” لاشتراط تتابع الكلمات في العبارة قلل المخرجات
./WhSearchDb.py '"تركها كفر"' 3 data/db/muslim.db:85 بَاب بَيَانِ إِطْلَاقِ اسْمِ الْكُفْرِ عَلَى مَنْ تَرَكَ الصَّلَاةَ data/db/muslim.db:3014 بيان إطلاق اسم الكفر على من ترك الصلاة data/db/muslim.db:2986 تفاضل أهل الإيمان فيه ورجحان أهل اليمن فيه
مثال آخر لاحظ بدئ وبدأ وبدء
./WhSearchDb.py بدء الوحي 10 data/db/bukhari.db:7459 بَاب أَوَّلُ مَا بُدِئَ بِهِ رَسُولُ اللَّهِ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ مِنْ الْوَحْيِ data/db/muslim.db:161 بَاب بَدْءِ الْوَحْيِ إِلَى رَسُولِ اللَّهِ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ data/db/bukhari.db:5255 حَدَّثَنَا قُتَيْبَةُ حَدَّثَنَا حَمَّادٌ عَنْ يَحْيَى بْنِ عَتِيقٍ عَنْ الْحَسَنِ data/db/bukhari.db:1 بدْءِ الْوحْيِ data/db/muslim.db:3090 بدء الوحي إلى رسول الله صلى الله عليه وسلم data/db/bukhari.db:4277 بَاب حَدِيثُ زَيْدِ بْنِ عَمْرِو بْنِ نُفَيْلٍ data/db/bukhari.db:5535 بَاب مَوْعِظَةِ الرَّجُلِ ابْنَتَهُ لِحَالِ زَوْجِهَا data/db/muslim.db:5053 4195 - قَوْله : ( كُنْت أَرَى الرُّؤْيَا data/db/muslim.db:1333 في الإيلاء واعتزال النساء وتخييرهن وقوله تعالى وإن data/db/muslim.db:4597 فتح مكة
لاحظ أنني استعملت ال التعريف ووجدها البرنامج دونها
./WhSearchDb.py الإسبال 2 data/db/muslim.db:4881 تحريم جر الثوب خيلاء وبيان حد ما يجوز إرخاؤه إليه data/db/muslim.db:3036 بيان غلظ تحريم إسبال الإزار والمن بالعطية وتنفيق
محرك البحث xapian
كتب على لغة سي+ وله ربط على كل اللغات الأخرى به العديد من المزايا لكنه كغيره فقير بدعمه للعربية
عند تجربته احتجنا للرقعة التالية:
--- include/xapian/unicode.h~ 2008-11-01 01:46:17.000000000 +0200 +++ include/xapian/unicode.h 2009-03-30 15:12:44.000000000 +0300 @@ -298,6 +298,7 @@ (1 << Xapian::Unicode::DECIMAL_DIGIT_NUMBER) | (1 << Xapian::Unicode::LETTER_NUMBER) | (1 << Xapian::Unicode::OTHER_NUMBER) | + (1 << Xapian::Unicode::NON_SPACING_MARK) | /* Arabic diacritics are non-spacing */ (1 << Xapian::Unicode::CONNECTOR_PUNCTUATION); return ((WORDCHAR_MASK >> get_category(ch)) & 1); }
لحل مشكلة كانت به حيث أنه يعتبر الحركات العربية non-spacing marks تفصل الكلمات
كما اصطدمت بكونه يحتاج لكتابة دالة التجذيع في سي++ فقط ولا يمكن عملها في باثون مما يؤخر سرعة التطوير
إذا كنت سنضيف دالة تجذيع كبقية اللغات فالبرنامج يستخدم تقنية snowball حيث توضع ملفات بلغة برمجة خاصة في المجلد languages ويتم تعديل ملفات Makefile لتصنيف الكود الجديد
للمزيد انظر http://snowball.tartarus.org
كانت سرعة الفهرسة لعينة الكتب حوالي نصف دقيقة لكن الغريب هو حجم الفهرس الكبير حيث وصل إلى 200% من حجم العينة (58.8 م.ب) ومع التجذيع اليدوي كانت النتيجة 100% (نفس حجم العينة تقريبا)
وكانت سرعة البحث آنية (أقل من 5 اجزاء من مئة من الثانية مع أنه وجد 1215 تطابقا)
[alsadi@pc1 thawab-python]$ ./SearchDB.py data/index/xapian/ ترك الصلاة كفر q:[ترك الصلاه كفر] Parsed query is: Xapian::Query((Zترك:(pos=1) OR Zالصلاه:(pos=2) OR Zكفر:(pos=3))) 1215 results found. Results 1-10: 1: 100% docid=1524 [data/db/muslim.db:3014:بيان إطلاق اسم الكفر على من ترك الصلاة] 2: 76% docid=1841 [data/db/muslim.db:3648:ترك الصلاة قبل العيد وبعدها في المصلى] 3: 76% docid=4975 [data/db/bukhari.db:2989:بَاب الصَّلَاةِ عَلَى مَنْ تَرَكَ دَيْنًا] 4: 75% docid=59 [data/db/muslim.db:85:بَاب بَيَانِ إِطْلَاقِ اسْمِ الْكُفْرِ عَلَى مَنْ تَرَكَ الصَّلَاةَ] 5: 74% docid=1890 [data/db/muslim.db:3746:ترك الصلاة على القاتل نفسه] 6: 74% docid=2966 [data/db/malik.db:219:بَاب تَرْكِ الصَّلَاةِ قَبْلَ الْعِيدَيْنِ وَبَعْدَهُمَا] 7: 73% docid=379 [data/db/muslim.db:725:بَاب تَرْكِ الصَّلَاةِ قَبْلَ الْعِيدِ وَبَعْدَهَا فِي الْمُصَلَّى] 8: 73% docid=431 [data/db/muslim.db:829:بَاب تَرْكِ الصَّلَاةِ عَلَى الْقَاتِلِ نَفْسَهُ] 9: 67% docid=5942 [data/db/bukhari.db:4923:قوله أفرأيت الذي كفر بآياتنا وقال لأوتين مالا وولدا] 10: 67% docid=1520 [data/db/muslim.db:3006:تسمية العبد الآبق كافرا]
وهذا مثال آخر
[alsadi@pc1 thawab-python]$ time ./SearchDB.py data/index/xapian/ بدء الوحي q:[بدا الوحي] Parsed query is: Xapian::Query((Zبدا:(pos=1) OR Zالوحي:(pos=2))) 222 results found. Results 1-10: 1: 100% docid=7210 [data/db/bukhari.db:7459:بَاب أَوَّلُ مَا بُدِئَ بِهِ رَسُولُ اللَّهِ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ مِنْ الْوَحْيِ] 2: 97% docid=97 [data/db/muslim.db:161:بَاب بَدْءِ الْوَحْيِ إِلَى رَسُولِ اللَّهِ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ] 3: 89% docid=3481 [data/db/bukhari.db:1:بدْءِ الْوحْيِ] 4: 84% docid=1562 [data/db/muslim.db:3090:بدء الوحي إلى رسول الله صلى الله عليه وسلم] 5: 65% docid=6108 [data/db/bukhari.db:5255:حَدَّثَنَا قُتَيْبَةُ حَدَّثَنَا حَمَّادٌ عَنْ يَحْيَى بْنِ عَتِيقٍ عَنْ الْحَسَنِ] 6: 57% docid=6128 [data/db/bukhari.db:5295:بَاب كَيْفَ نَزَلَ الْوَحْيُ وَأَوَّلُ مَا نَزَلَ] 7: 53% docid=2573 [data/db/muslim.db:5109:عرق النبي صلى الله عليه وسلم في البرد وحين يأتيه] 8: 53% docid=1127 [data/db/muslim.db:2221:بَاب عَرَقِ النَّبِيِّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ فِي الْبَرْدِ وَحِينَ يَأْتِيهِ] 9: 50% docid=2768 [data/db/muslim.db:5498:سؤال اليهود النبي صلى الله عليه وسلم عن الروح و قوله] 10: 48% docid=864 [data/db/muslim.db:1695:بَاب فَتْحِ مَكَّةَ
محرك البحث lucene
عند تجربة فهرسة نفس العينة كانت سريعة جدا حيث احتاج إلى حوالي 10 ثواني (مع تجذيع بدائي مختلف مكتوب بلغة جافا وليس غروفي) بحجم 17 م.ب عند عدم حفظ العاوين و 19 ميغا عند حفظ العناوين
عملية البحث تستغرق ثانية تقريبا وهو الوقت اللازم لتحميل جافا (ربما إن كانت محملة مسبقا ستكون آنية تقريبا)
[alsadi@pc1 thawab]$ time groovy source/SearchDb.groovy '"بدء الوحي"' HITS 1 0.4388401 stored/uncompressed,indexed<FN:data/db/bukhari.db> stored/uncompressed,indexed<ID:1> stored/uncompressed,indexed<TITLE:بدْءِ الْوحْ real 0m1.048s user 0m1.005s sys 0m0.092s [alsadi@pc1 thawab]$ groovy source/SearchDb.groovy بدء الوحي HITS 96 0.41719502 stored/uncompressed,indexed<FN:data/db/bukhari.db> stored/uncompressed,indexed<ID:1> stored/uncompressed,indexed<TITLE:بدْءِ الْوحْيِ> 0.21379709 stored/uncompressed,indexed<FN:data/db/bukhari.db> stored/uncompressed,indexed<ID:3985> stored/uncompressed,indexed<TITLE:ما جاء في قول الله تعالى وهو الذي يبدأ الخلق ثم يعيده> 0.20339794 stored/uncompressed,indexed<FN:data/db/bukhari.db> stored/uncompressed,indexed<ID:3307> stored/uncompressed,indexed<TITLE:بَاب الشُّهَدَاءِ الْعُدُولِ> 0.20339794 stored/uncompressed,indexed<FN:data/db/bukhari.db> stored/uncompressed,indexed<ID:5205> stored/uncompressed,indexed<TITLE:قوله والرجز فاهجر> 0.20339794 stored/uncompressed,indexed<FN:data/db/bukhari.db> stored/uncompressed,indexed<ID:7769> stored/uncompressed,indexed<TITLE:بَاب مَا كَانَ النَّبِيُّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ يُسْأَلُ مِمَّا لَمْ يُنْزَلْ> 0.19176543 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:2221> stored/uncompressed,indexed<TITLE:بَاب عَرَقِ النَّبِيِّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ فِي الْبَرْدِ وَحِينَ يَأْتِيهِ> 0.18760023 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:5109> stored/uncompressed,indexed<TITLE:عرق النبي صلى الله عليه وسلم في البرد وحين يأتيه> 0.16779475 stored/uncompressed,indexed<FN:data/db/bukhari.db> stored/uncompressed,indexed<ID:2313> stored/uncompressed,indexed<TITLE:بَاب إِذَا أَحْرَمَ جَاهِلًا وَعَلَ time groovy source/SearchDb.groovy الإسبال HITS 3 0.80785483 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:4881> stored/uncompressed,indexed<TITLE:تحريم جر الثوب خيلاء وبيان حد ما يجوز إرخاؤه إليه> 0.39978445 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:5040> stored/uncompressed,indexed<TITLE:حكم إطلاق لفظة العبد والأمة والمولى والسيد> 0.3769204 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:3036> stored/uncompressed,indexed<TITLE:بيان غلظ تحريم إسبال الإزار والمن بالعطية وتنفيق> groovy source/SearchDb.groovy ترك الصلاة كفر HITS 1520 0.7442378 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:85> stored/uncompressed,indexed<TITLE:بَاب بَيَانِ إِطْلَاقِ اسْمِ الْكُفْرِ عَلَى مَنْ تَرَكَ الصَّلَاةَ> 0.66830057 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:3014> stored/uncompressed,indexed<TITLE:بيان إطلاق اسم الكفر على من ترك الصلاة> 0.4451205 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:3012> stored/uncompressed,indexed<TITLE:بيان نقصان الإيمان بنقص الطاعات وبيان إطلاق لفظ الكفر> 0.42100447 stored/uncompressed,indexed<FN:data/db/bukhari.db> stored/uncompressed,indexed<ID:7411> stored/uncompressed,indexed<TITLE:وقول الله تعالى إلا من أكره وقلبه مطمئن بالإيمان> 0.39304644 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:4072> stored/uncompressed,indexed<TITLE:استحباب النزول بالمحصب يوم النفر والصلاة به> 0.39260826 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:563> stored/uncompressed,indexed<TITLE:بَاب اسْتِحْبَابِ الْقُنُوتِ فِي جَمِيعِ الصَّلَاةِ إِذَا نَزَلَتْ بِالْمُسْلِمِينَ نَازِلَةٌ> 0.36176178 stored/uncompressed,indexed<FN:data/db/bukhari.db> stored/uncompressed,indexed<ID:771> stored/uncompressed,indexed<TITLE:بَاب مَنْ نَسِيَ صَلَاةً فَلْيُصَلِّ إِذَا ذَكَرَ وَلَا يُعِيدُ إِلَّا تِلْكَ الصَّلَاةَ> 0.353653 stored/uncompressed,indexed<FN:data/db/muslim.db> stored/uncompressed,indexed<ID:3670> stored/uncompressed,indexed<TITLE:ما عرض على النبي صلى الله عليه وسلم في صلاة الكسوف>