أدوات المستخدم

أدوات الموقع


thawab:search

اختلافات

عرض الاختلافات بين النسخة المختارة و النسخة الحالية من الصفحة.

رابط إلى هذه المقارنة

جانبي المراجعة السابقة المراجعة السابقة
المراجعة التالية
المراجعة السابقة
thawab:search [2010/06/30 22:17]
alsadi
thawab:search [2015/04/23 00:21] (حالي)
سطر 1: سطر 1:
 +====== دراسة محركات البحث ======
 +===== نظرة عامة وفهم المصطلحات =====
 +إن أي محرك بحث أو نظام IR أي نظام استخراج المعلومات Information Retrieval system يتكون من مراحل منفصلة هي
 +  * حفظ المحتوى وفي حالتنا نحن حفظ المحتوى في ملفات SQLite منفصلة
 +  * مرحلة تلقيم المحتوى للفهرسة وهي تتم مرة واحدة (ما لم يتغير المحتوى)
 +  * الاستعلام وهو أن يطلب المستخدم البحث عن شيء ما ويجب أن يعيده النظام مرتب وفق تقييم rank لمدى الارتباط Relevance
 +
 +يقسم النظام المحتوى إلى عدد من الوحدات الجوهرية تسمى كل منها وثيقة Document ويكون بها عدد من الحقول Fields أحدها معرف فريد (رقم أو URL ...) وفي حالنا الوثيقة الواحدة هي الفصل أو الباب في الكتاب (أو الحديث في كتب الحديث أو الراوي في كتب الرجال ...) ونميزه عبر وسم "​تبويب"​ وهنا نحفظ معرفه ومعرف الكتاب
 +
 +الحقول المختلفة في إما أن تكون حقول محللة ((انظر [[http://​lucene.apache.org/​java/​2_4_1/​api/​org/​apache/​lucene/​document/​Field.Index.html|أنواع الحقول في lucene من حيث الفهرسة]])) ​ أو حقول جامدة فالحقول الجامدة التي لا يتم قصها ولا تجذيعها أما الأولى فيتم تقطيعها عند المسافات ويتم قص السوابق واللواحق ...إلخ
 +
 +بعض الحقول يتم الاحتفاظ بها كما هي دون معالجة داخل الفهرس مثل المعرف وربما جزء ملخص من النص (أول فقرة مثلا ويسمى excerpt أو snippet)
 +وبعضها الآخر لا يتم الاحتفاظ بها مثل النص نفسه لأنه كبير جدا لكن في المقابل يمكن في هذه الحالة الاحتفاظ بما يسمى Term Vector أي متجه الحدود
 +((انظر [[http://​lucene.apache.org/​java/​2_4_1/​api/​org/​apache/​lucene/​document/​Field.TermVector.html|أنواع الحقول في lucene من حيث الحدود]]))
 +وهو معرّف كل كلمة وتكرارها وإزاحتها (وبالتالي ترتيبها) وحيث أن الوثائق المختلفة تستخدم نفس الكلمات يوفر الاحتفاظ بالمتجه المساحة ويقدم معلومات أكثر للفهرس. للمزيد من المعلومات انظر [[http://​en.wikipedia.org/​wiki/​Vector_Space_Model|Vector Space Model]]
 +
 +[[http://​lucene.apache.org/​java/​2_4_1/​api/​org/​apache/​lucene/​search/​BooleanQuery.html|الاستعلام الثنائي]] هو أن يتم طلب كل الوثائق التي تحقق شرط مركب من عمليات ثنائية مثل
 +  * "​و"​ AND
 +  * "​أو"​ OR
 +  * "​وليس"​ AND NOT
 +
 +مثلا البحث عن "​أنس"​ و "​بن"​ و "​مالك"​ يُحضر كل الوثائق التي تحتوي هذه الحدود معا.
 +
 +[[http://​lucene.apache.org/​java/​2_3_1/​api/​core/​org/​apache/​lucene/​search/​PhraseQuery.html|الاستعلام عن عبارة]] فهو البحث عن "​أنس بن مالك"​ متتابعة حيث يكون الانحدار بين الحدود صفر (الانحدار هو أعلى قيم مسموحة لعدد الحدود التي تفصل بين الكلمات) ويمكن تحديد قيمة عليا للانحدار مع تفضيل الأقصر.
 +
 +البحث عن عبارات مشابهة أو ما يسمى البحث الضبابي في مصطلح lucene هو البحث عن وثائق تقل فيها **مسافة التحرير** المحسوبة بخوارزمية ليفنشتاين [[http://​en.wikipedia.org/​wiki/​Levenshtein_distance|Levenshtein algorithm]] عن الحد المطلوب وهي أقل عدد من العلميات لتحويل العبارة الأولى إلى الثانية من بين العمليات التالية:​
 +  * إضافة حرف
 +  * حذف حرف
 +  * تعويض حرف مكان آخر
 +
 +مثلا التحرير بين ​ "​kitten"​ و "​sitting"​ هي 3 حيث نحتاج لتحويل k إلى s ثم تحويل e إلى i ونضيف g وعملية إيجاد الرقم معروفة بخوارزمية رياضية على المصفوفات دون تجريب
 +
 +وفي lucene يمكن أن نستعلم عن الوثائق المشابهة لعبارة ونقدم رقم بين 0 و 1 مثل 0.6 وهو رقم يضرب في طول الاستعلام
 +
 +ويقدم محرك lucene طريقة للجمع بين هذه الأنواع حيث يقدم المستخدم الباحث سلسلة نصية يتم إعرابها عبر [[http://​lucene.apache.org/​java/​2_3_1/​api/​core/​org/​apache/​lucene/​queryParser/​QueryParser.html|QueryParser]] ​ وتجد توثيق لها في 
 +[[http://​lucene.apache.org/​java/​2_4_1/​queryparsersyntax.html|query parser syntax]] مثلا يمكن أن يطلب أحدهم البحث عن  "​الخط العربي"​~10 تعني أن لا تزيد الحدود الفاصلة بين الكلمتين عن 10 حدود و roam~0.6 تعني كلمة تشبه roam بمقدار 60%  أي مقدار مسافة التحرير لا تزيد عن 1.6 حرف
 +
 +المزيد:​
 +  * [[http://​lucene.apache.org/​java/​2_4_1/​api/​overview-summary.html#​overview_description|وثائق lucene]]
 +  * [[http://​xapian.org/​docs/​glossary.html|المصطلحات من xapian]]
 +  * [[http://​whoosh.ca/​wiki/​GettingStarted|المصطلحات من Whoosh]]
 +
 +===== الكلمات المهملة stopwords =====
 +الكلمات المهملة أو المستبعدة stopwords هي الكلمات ذات التكرار العالي وليس لها دلالة خاصة مثل حروف الجر والأدوات. وهذه يتم إهمالها في أغلب محركات البحث ومن أمثلتها كلمة from (والتي تعني من) و كلمة to (والتي تعني إلى) ولان ههذه الكلمات تتكرر كثيرا فإن اهمالها يؤدي إلى تقليل حجم فهرس البحث (وبالتالي قد ينعكس هذا على زيادة السرعة وتقليل استهلاك الذاكرة) لكن الهدف من إهمالها ليس التوفير بل هو إهمال تطابقات غير مرغوبة مثلا عند البحث عن "​سلم من لسانه"​ وكان الرابط هو علاقة "​أو"​ هذا يعني أن نص وردت فيه كلمة "​من"​ كثيرا أهم من نص وردت فيه كلمة "​لسان"​ مرات قليلة مع أننا لا نهتم بكلمة من قدر اهتمامنا ببقية الكلمات. طبعا خوارزميات تقييم النتائج المختلفة مثل idf تقلل من هذا الأثر السلبي بشكل تلقائي دون الحاجة للكلمات المهملة حيث أنها تقيس أهمية الكلمة نسبة لتكرارها في كل الوثائق وحيث أن كلمة مثل "​من"​ تتكرر كثيرا مما يجعل نسبتها في أي وثيقة رقم صغير مهمل.
 +
 +في اللغة العربية أرى أنه لا يوجد حاجة لإهمال مثل هذه الكلمات مثلا لو أخذنا "​من"​ قد تكون ناتجة من تجذيع "​المن والسلوى"​ وكلمة "​إلى"​ مقارنة مع إلينا ...إلخ حيث أن الكلمات هذه يجب أن تكون منفصلة لا تقبل التصرف والإضافة.
 +يمكن حساب الكلمات المستبعدة تلقائيا وذلك بأخذ عينة ممثلة من عدد كبير من الوثائق المتنوعة (وليس وثيقة واحدة) ثم إحصاء **//idf//** (أي التردد العكسي للوثائق inverse document frequency) لكل كلمة في العينة حيث تكون قيمته للكلمات المستبعدة قريبة من الصفر (يمكن أخذها أقل من قيمة معينة مثلا 0.25) ويحسب بالعلاقة:​
 +
 +<​code>​
 +idf=log(nD/​nd)
 +</​code>​
 +
 +أي لوغاريتم النسبة بين عدد كل الوثائق 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 يحتوي على عدة محللات للتجذيع والقياسي ليس أقوى محلل للقة الإنجليزية بل هناك [[http://​lucene.apache.org/​java/​2_4_1/​api/​org/​apache/​lucene/​analysis/​snowball/​SnowballAnalyzer.html|Snowball]]
 +حيث يقوم بما يلي بعد التقطيع القياسي:​
 +  * StandardFilter
 +  * LowerCaseFilter - تحويل كل الحروف إلى صغيرة
 +  * StopFilter - إهمال الكلمات بعض الكلمات الإنجليزية
 +  * SnowballFilter - التجذيع وفق طريقة Snowball
 +
 +وطريقة [[http://​snowball.tartarus.org/​|SnowBall]] في التجذيع طريقة فريدة حيث هي لغة خاصة لوصف خوارزميات التجذيع.
 +
 +لكن لم وهناك عدد من الأمثلة [[http://​members.unine.ch/​jacques.savoy/​clef/​index.html|للغة العربية]] لكنها غالبا من وضع معاهد من يعمل عليها لا يعلم شيء عن اللغة العربية
 +
 +انظر [[stemming|التجذيع]]
 +
 +===== ترتيب النتائج Ranking =====
 +
 +بعد حصر التطابقات يتم تقييمها عبر عدة خوارزميات
 +انظر [[http://​lucene.apache.org/​java/​2_4_1/​scoring.html|scoring]] وهو تقييم يشبه حساب جتا الزاوية بين متجهين (من هنا جاء مصطلح متجه الحدود أي الكلمات الذي ذكرناه سابقا) حيث يكون جتا الزاوية يساوي 1 إذا تطابق المتجهين ويحسب جتا عن طريق الضرب بين مساقط الاستعلام والوثيقة مقسوما على طول كل منهما وهناك نموذج يبسط ذلك تستفيد منه lucene اسمه ​
 +[[http://​en.wikipedia.org/​wiki/​Tf-idf|term frequency–inverse document frequency]]
 +
 +أي حاصل ضرب tf وهو التكرار النسبي للحد في الوثيقة (أي مجموع تكرار الحد في الوثيقة td على مجموع تكرار الحد في كل الوثائق tD)
 +في idf وهو مدى أهمية الحد عبر قياس لوغاريتم النسبة بين عدد كل الوثائق nD على عدد الوثائق التي يظهر فيها الحد nd
 +
 +  tf=sum(td)/​sum(tD)
 +  idf=log(nD/​nd)
 +
 +هذا للحد الواحد
 +
 +وهناك خوارزمية أفضل اسمها [[http://​en.wikipedia.org/​wiki/​BM25|Okapi BM25]] وهي ​ [[http://​nlp.uned.es/​~jperezi/​Lucene-BM25/​|متوفرة في Lucene]]
 +
 +وهي كما تعرفها xapian تحسب بالعلاقة
 +<​code>​
 +( (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)) ​ )  )
 +</​code>​
 +
 +حيث
 +  * 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))
 +
 +المزيد:​
 +  * http://​xapian.org/​docs/​intro_ir.html
 +  * [[http://​xapian.org/​docs/​bm25.html|خوارزمية BM25]]
 +
 +===== محرك البحث Whoosh =====
 +محرك بحث مكتوب حصريا على بايثون وبالتلي يعمل على كل المنصات التي تعمل عليها بايثون
 +
 +تكمن فائدة هذا المحرك هو سرعة التطوير ويمكن الاستفادة من وضوح كود بايثون في فهم خوارزميات البحث المختلفة
 +
 +حيث أنه يوفر العديد منها مثل BM25 و tf-idf
 +
 +وعند تجربته لم يكن يعمل مع اللغة العربية لكن تخصيصه كان أمرا سهلا فهو يوفر العديد من صنوف التقطيع
 +
 +يقول الموقع أنه أقل سرعة من lucene إلا أن ذلك غير ملموس فقد استغرق الكود المبدئي أقل من دقيقة ونصف في فهرسة عينة من الكتب (بحجم 35.2 م.ب وهي بخاري ومسلم والموطأ والسلسلة الصحيحة ومقالة PyQt4 ومقالة للتجربة) وكان حجم الفهرس مقبولا جدا حيث وصل إلى حوالي 20% من حجم النص (7.1 م.ب) ربما السبب هو كثرة الحركات في النص حيث تهملها الفهرسة
 +
 +أما سرعة الاسترجاع فهي شبه آنية إليك مثال
 +<​file>​
 + ​./​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 أدنى أهل الجنة منزلة فيها
 +</​file>​
 +لاحظ أن استعمال علامة الاقتباس ""​ لاشتراط تتابع الكلمات في العبارة قلل المخرجات
 +<​file>​
 +./​WhSearchDb.py '"​تركها كفر"'​
 +3
 +data/​db/​muslim.db:​85 بَاب ​  ​بَيَانِ إِطْلَاقِ اسْمِ الْكُفْرِ عَلَى مَنْ تَرَكَ الصَّلَاةَ
 +data/​db/​muslim.db:​3014 بيان إطلاق اسم الكفر على من ترك الصلاة
 +data/​db/​muslim.db:​2986 تفاضل أهل الإيمان فيه ورجحان أهل اليمن فيه
 +</​file>​
 +
 +
 +مثال آخر لاحظ بدئ وبدأ وبدء
 +<​file>​
 +./​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 فتح مكة
 +</​file>​
 +لاحظ أنني استعملت ال التعريف ووجدها البرنامج دونها
 +<​file>​
 +./​WhSearchDb.py الإسبال
 +2
 +data/​db/​muslim.db:​4881 تحريم جر الثوب خيلاء وبيان حد ما يجوز إرخاؤه إليه
 +data/​db/​muslim.db:​3036 بيان غلظ تحريم إسبال الإزار والمن بالعطية وتنفيق
 +</​file>​
 +
 +===== محرك البحث xapian =====
 +كتب على لغة سي+ وله ربط على كل اللغات الأخرى
 +به العديد من المزايا لكنه كغيره فقير بدعمه للعربية ​
 +
 +عند تجربته احتجنا للرقعة التالية:​
 +<code diff>
 +--- 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);
 + }
 +</​code>​
 +لحل [[http://​trac.xapian.org/​ticket/​355|مشكلة]] كانت به حيث أنه يعتبر الحركات العربية non-spacing marks تفصل الكلمات ​
 +
 +كما اصطدمت بكونه يحتاج لكتابة دالة التجذيع في سي++ فقط ولا يمكن عملها في باثون مما يؤخر سرعة التطوير
 +
 +إذا كنت سنضيف دالة تجذيع كبقية اللغات فالبرنامج يستخدم تقنية snowball حيث توضع ملفات بلغة برمجة خاصة في المجلد languages ويتم تعديل ملفات Makefile لتصنيف الكود الجديد
 +
 +للمزيد انظر http://​snowball.tartarus.org
 +
 +كانت سرعة الفهرسة لعينة الكتب حوالي نصف دقيقة لكن الغريب هو حجم الفهرس الكبير حيث وصل إلى 200% من حجم العينة (58.8 م.ب) ومع التجذيع اليدوي كانت النتيجة 100% (نفس حجم العينة تقريبا)
 +
 +وكانت سرعة البحث آنية (أقل من 5 اجزاء من مئة من الثانية مع أنه وجد 1215 تطابقا)
 +<code bash>
 +[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:​تسمية العبد الآبق كافرا]
 +</​code>​
 +وهذا مثال آخر
 +<​code>​
 +[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:​بَاب ​  ​فَتْحِ مَكَّةَ
 +</​code>​
 +
 +===== محرك البحث lucene =====
 +عند تجربة فهرسة نفس العينة كانت سريعة جدا حيث احتاج إلى حوالي 10 ثواني (مع تجذيع بدائي مختلف مكتوب بلغة جافا وليس غروفي)
 +بحجم 17 م.ب عند عدم حفظ العاوين و 19 ميغا عند حفظ العناوين
 +
 +عملية البحث تستغرق ثانية تقريبا وهو الوقت اللازم لتحميل جافا (ربما إن كانت محملة مسبقا ستكون آنية تقريبا)
 +<​code>​
 +[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:​ما عرض على النبي صلى الله عليه وسلم في صلاة الكسوف>​
 +
 +</​code>​
  
thawab/search.txt · آخر تعديل: 2015/04/23 00:21 (تحرير خارجي)