Archive for category بحث لوسين Lucene Search

2: بناء الفهارس – لوسين Building Indexes

السلام عليكم ورحمة الله وبركاته

lucene

نتابع موضوعنا حول البحث ضمن قاعدة المعطيات باستخدم تقنية ومكتبة لوسين, التي تعتمد على تحويل محتويات قاعدة المعطيات إلى ملفات كاش, يتم البحث ضمنها بسرعة وفعالية كبيرة.

سنتحدث اليوم عن كيفية بناء الفهارس building indexes

إنشاء فهرس جديد Create New Index

تتوفر كل من امكانيات إنشاء وبناء الفهارس وتعديلها ضمن مكتبة لوسين. ويمكن الاستفادة من هذه الامكانيات لبناء وتعديل والبحث ضمن الفهارس الخاصة بنا.

الترميز ادناه يوضح لنا مثال على فهرسة ملف وذلك باستخدام واجهة التطبيقات البرمجية التي توفرها لنا مكتبة لوسين Zend_Search_Lucene indexing API

1

تصبح الوثائق documents قابلة للبحث فور اضافتها للفهرس.

تعديل الفهرس Updating Index

يتم استخدام نفس الإجراء السابق لتعديل الفهرس. الفرق الوحيد يكمن في استخدام التابع Open() method بدل من استدعاء التابع create() method:

2

تعديل الوثائق Updating Documents

لا تدعم لوسين امكانية تعديل الوثائق بعد اضافتها.

لذلك عندما نرغب بتعديل وثيقة, يتوجب علينا :

  1. البحث عنها
  2. حذفها
  3. اضافة الوثيقة الجديدة بعد التعديل.

يعمل التابع

Zend_Search_Lucene::delete()

على المعرف الداخلي للوثيقة internal index document id.

ويمكن استعادة هذا المعرف id وذلك عبر البحث عن الوثيقة باستخدام الاستعلام عنها query , ومن ثم من نتائج البحث hit نصل الخاصية id .

كما هو موضح في المثال التالي ادناه

3

معرفة حجم الفهرس retrieving index size

هنالك طريقتان لاستعادة ومعرفة حجم الفهرس ضمن مكتبة لوسين Zend_Search_Lucene.

لدينا التابع التالي :

Zend_Search_Lucene::maxDoc()

يعيد لنا عدد اكبر من العدد المحتمل للوثائق الموجودة ضمن الفهرس.

فعليا, يعيد التابع العدد الاجمالي للوثائق ضمن هذا الفهرس, يما يتضمن الوثائق المحذوفة.

ويوجد تابع مكافئ لهذا التابع ويدعى :

Zend_Search_Lucene::count().

اما التابع الثاني هو التالي:

Zend_Search_Lucene::numDocs()

ويعيد العدد الاجمالي للوثائق الغير محذوفة ضمن الفهرس.

4

يمكن استخدام التابع التالي :

Zend_Search_Lucene::isDeleted($id)

لمعرفة فيما اذا تم حذف وثيقة ام لا.

5

من الضروري ايضا القيام بامثلة الفهرس index optimization , لانها عملية الامثلة تقوم بعدد من الامور الضرورية مثل:

  • ازالة الوثائق المحذوفة من الفهرس
  • تقليص مجال معرفات الوثائق documents’ Ids إلى مجال اصغر.

وبناء على ذلك نلاحظ بان معرف الوثيقة الداخلي internal document id عبارة عن رقم ممكن ان يتغير خلال القيام بامثلة الوثيقة index optimization.

امثلة الفهرس Index optimization

يتألف فهرس لوسين من مجموعة من القطاعات segments.

كل قطاع segment عبارة عن مجموعة مستقلة من المعطيات.

إن عملية تعديل قطاع ما segment تتطلب اعادة تنظيم كل القطاعات.

بشكل عام تتم اضافة الوثائق documents إلى الفهرس عبر إنشاء قطاعات جديدة.

إن زيادة عدد القطاعات segments تودي إلى تردي جودة الفهرس, ولكن عملية امثلة الفهرس index optimization تؤدي إلى استعادة الجودة مرة اخرى.

تقوم عملية الأمثلة بشكل اساسي بدمج عدة قطاعات ضمن قطاع واحد. وهذه العملية بحد ذاتها لا تؤدي إلى تعديل القطاعاتsegments . وانما تنتج قطاعات جديدة كبيرة, وتقوم بتحديث قائمة القطاعات segment list (ما يعرف بملف القطاعاتsegments’ file ).

يمكن تنفيذ عملية امثلة كاملة للفهرس index optimization وذلك عبر استدعاء التابع

Zend_Search_Lucene::optimize().

حيث يقوم هذا التابع بدمج كل قطاعات الفهرس index segments ضمن قطاع وحيد جديد.

6

يجب القيام بشكل اوتوماتيكي بأمثلة الفهرس index optimization , وذلك من اجل الحفاظ على الفهارس بشكل مستقر ومتجانس.

الامثلة الاوتوماتيكية للفهرس automatic index optimization عبارة عن اجرائية تكرارية يتم التحكم بها عن طريق خيارات الفهرس index options. تقوم هذه العملية بدمج القطاعات الصغيرة small segments ضمن قطاعات اكبر, ومن ثم تعود فتدمج هذه القطاعات الكبيرة إلى قطاعات اكبر, وهكذا.

سنتطرق فيما يلي لعدد من خيارات الامثلة الاوتوماتيكية auto-optimization options.

MaxBufferedDocs auto-optimization option

MaxBufferedDocs : يحدد لنا العدد الادنى المطلوب من الوثائق قبل البدء بكتابة الوئائق المخزنة ضمن الذاكرةbuffered in-memory documents إلى قطاع جديدnew segment .

يمكن استعادة قيمة MaxBufferedDocs او تعديلها عبر استخدام التوابع التالية :

$index->getMaxBufferedDocs()

$index->setMaxBufferedDocs($maxBufferedDocs)

القيمة الافتراضية تبلغ 10.

MergeFactor auto-optimization option

MergeFactor : ويحدد التردد الذي يتم وفقه دمج قطاعات الفهارس segment indices عبر التابع

addDocument().

عند القيم الصغيرة: يتم استهلاك ذاكرة RAM اقل اثناء الفهرسة, ولكن الفهرسة تكون ابطأ.

اما عند القيم الكبيرة : يتم استهلاك ذاكرة RAM اكبر اثناء الفهرسة, وعملية الفهرسة اسرع.

القيم اكبر من (10) تعتبر القيم الأفضل في عمليات انشاء الفهرس لكل المعطيات مرة واحدة, اما القيم الصغيرة , اصغير من (10) تستخدم لعمليات الفهرسة التفاعلية المستمرة.

MergeFactor : يعطينا تقدير جيد لوسطي عدد القطاعات التي يتم دمجها لقطاع واحد اثناء عملية تكرارات عملية الامثلة الاوتوماتيكية auto-optimization pass.

القيم الكبيرة تسبب عدد كبير من القطاعات segments وبالتالي لا يتم دمج هذه القطاعات ضمن قطاع واحد جديد.

وربما قد تكون سبب رسالة الخطأ التالية : “failed to open stream: Too many open files” .

يمكن استعادة او تغيير قيمة MergeFactor عبر استخدام التوابع التالية :

index->getMergeFactor()

index->setMergeFactor($mergeFactor)

القيمة الافتراضية تبلغ 10.

الصلاحيات Permissions:System-Security-2-icon

بشكل افتراضي, يكون الفهرس متاحا للقراءة والكتابة لكل الاشخاص.

من الممكن تعديل هذه الصلاحية عبر استخدام التابع التالي :

Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions()

7

المحدوديات limitations

حجم الفهرس limitationsindex size

الحد الاعلى لحجم الفهرس ضمن منصات العمل 32-bit يبلغ 2 غيغا.

يمكن استخدام منصات عمل 64-bit من اجل فهارس ذات احجام اعلى.

دعم نظم الملفات المختلفة Supported Filesystems
تستخدم لوسين التابع Zend_Search_Lucene من اجل تأمين امكانيات البحث والتعديل والامثلة المتزامنة.

ولكن تبعا لتوثيق PHP. فإن التابع flock() لن يعمل على نظم NFS والعديد من نظم الملفات الشبكية الاخرى networked file systems.

نكتفي بهذا القدر في هذه الحلقة, لنتابع في الحلقة القادمة ان شاء الله موضوعنا لنتطرق للحديث عن عملية البحث ضمن الفهرس Searching an index

إلى اللقاء في الحلقة القادمة من هذه السلسلة

وإلى ذلك الحين نستودعكم الله والسلام عليكم ورحمة الله وبركاته

 

مراجع:

 

Advertisements

, , , , , , , ,

أضف تعليق

1: لمحة عامة Overview – لوسين Zend Search Lucene

السلام عليكم ورحمة الله وبركاته

سنتابع اليوم حديثنا بمقدمة عن مكتبة لوسين.

Zend_Search_Lucene : عبارة عن محرك بحث نصي تمت كتابته بشكل كامل باستخدام PHP 5.

باختصار تقوم فكرة البحث باستخدام مكتبة لوسين, على تخزين محتويات قاعدة المعطيات على شكل ملفات تخزن ضمن السيرفر server , اي ان مكتبة لوسين تقوم بكاش للمعطيات, وبالتالي يتم البحث ضمن هذه الملفات بدل من البحث ضمن قاعدة المعطيات.

نسمي هذه الملفات المخزنة التي ينتجها لوسين بدلا عن قاعدة المعطيات باسم : الفهرس Index .

ملاحظة: ستيم استخدام كلمة الفهرس Index كثيرا فيما يلي, فارجو الانتباه لمعناها الوارد فيما سبق.

إذن : العملية بمثابة كاش لمعلومات قاعدة المعطيات – ان جاز التعبير.

lucene vs db search

مقارنة بين عمل مكتبة لوسين في البحث وبين عمل قاعدة المعطيات Lucene vs DB

وبما انه يعتمد في عمله على تخزين الفهرس Index ضمن ملفات نظامية عادية, وبذلك فإن بإمكانه اضافة امكانيات البحث النصيه هذه تقرييبا إلى اي موقع مبرمج بواسطة php.

يدعم Zend_Search_Lucene الميزات التالية :

  • البحث المصنف – اي ان النتائج الأفضل في عملية البحث يتم اظهارها في مقدمة النتائج الاخرى.
  • يدعم اشكال استعلامات مختلفة:
    • استعلامات البحث عن جمل phrase queries
    • الاستعلامات المنطقية Boolean queries
    • استعلامات البحث عن كلمات غير مكتملة باستخدام المحارف البديلة wildcard queries
    • الاستعلامات المقاربة, اي البحث مثلا عن جملة وان كانت مفردات هذه الجملة تبعد عن بعضها مسافات معينة وليست متجاورة بشكل كامل proximity queries
    • استعلامات البحث ضمن مجال محدد (من الارقام, من الكلمات, …)Range queries
    • والعديد من اشكال الاستعلامات الاخرى.
  • امكانية البحث ضمن حقول محددة – على سبيل المثال البحث مثلا فقط ضمن حقل العنوان والمؤلف.

بنية محرك لوسين

components

يتألف محرك بحث لوسين من المكونات التالية :

  • الفهرس index
    • الوثائق documents
      • الحقول fields
        • ثنائية من مفتاح وقيمة pairs of key-value

كما هو واضح من التسلسل السابق يتالف محرك بحث لوسين من ما يعرف بالفهرسindex , الذي بدوره يتألف من وثائق documents التي هي عبارة عن العناصر الرئيسية المؤلفة للفهرس.

وتنقسم الوثيقة document الواحدة بدورها إلى عدة حقول Fields.

وكل حقل Field بدوره يتألف من ثنائية مفتاح-قيمة key-value

وتحوي هذه الحقول على المكونات التي يتم البحث فيها.

الوثائق والحقول عبارة عن اغراض objects.

يتم تمثيل الوثيقة document ضمن مكتبة لوسين عبر الصف Zend_Search_Lucene_Document class, والاغرض objects من هذا الصف تحوي على مستنسخات instances من الصف Zend_Search_Lucene_Field التي تمثل حقول هذه الوثيقة.

وللعلم فإنه بالامكان اضافة اي نوع من انواع المعلومات الى الفهرس index.

حيث يمكن تخزين اي نمط من انماط المعطيات ضمن حقول الوثيقة document fields, ومن ثم يمكن استعادتهم عبر البحث.

تقع مسؤولية فهرسة المعطيات وانشاء الفهرس على تطبيقك. هذا يعني بأنه يمكن فهرسة اي نوع من انواع مصارد المعطيات التي يمكن الوصول اليها عبر تطبيقك.

على سبيل المثال, بامكاننا فهرسة :

  1. نظام ملفات filesystem
  2. قاعدة معطيات Database
  3. ملفات html

يزودنا صف Zend_Search_Lucene_Field عدد من التوابع الستاتيكية static methods لانشاء الحقول وبميزات وخصواص مختلفة:

كل تابع من هذه التوابع السابقة (بما فيها التابع Zend_Search_Lucene_Field::Binary()) يحتوي على معامل خياري optional parameter يدعى $encoding وذلك بهدف التحكم بطبيعة تخزين المعطيات ضمن الفهرس.

قد يختلف الترميز بين وثيقة واخرى, وكذلك بين حقل واخر ضمن نفس الوثيقة.

2

في حال حذف معامل الترميز, عندها سوف يتم استخدام الترميز المحلي setlocale.

على سبيل المثال:

3

يتم دوما تخزين واستعادة الحقول من الفهرس باستخدام ترميز UTF-8. واي تحويل الى هذا الترميز يتم بشكل اوتوماتيكي.

قد تقوم المحللات 🙂 analyzers (سنتحدث عنها لاحقا) بتحويل ترميز النص من نمط إلى اخر.

في الواقع, المحلل الافتراضي default analyzer يقوم بتحويل النص إلى ترميز’ASCII//TRANSLIT’.

ولكن انتبهوا عند هذه النقطة, فقط تعتمد عملية التحويل في الترميز على الترميز المحلي الحاليlocale .

كما تحدثنا سابقا , فإن الوثيقة تتألف من حقول , والحقل من ثنائية مفتاح-قيمة key-value. واسماء هذه الحقول (اي اسماء المفاتيح) يتم تحديدها عبر التابع addField().

تستخدم نسخة لوسين المكتبوبة بجافا اسم الحقل ‘contents’ كاسم افتراضي ضمن البحث.

بشكل افتراضي, تبحث Zend_Search_Lucene ضمن كل الحقول. ولكن يتمكن تعديل هذا السلوك الافتراضي. سنتطرق لهذا الموضوع لاحقاً.

 

انماط الحقول Fields Types

Keyword : الحقول ذات هذا النمط يتم تخزينها وفهرستها.

هذا يعني بانه يمكن البحث ضمن هذه الحقول بالاضافة إلى استعادتها وعرضها ضمن نتائج البحث.

قيم هذه الحقول لا يتم تجزئيها الى عدة كلمات منفصلة باستخدام ال tokenization.

يستخدم هذا النمط من الحقول عادة لتخزين حقول قاعدة المعطيات المعدودة والمحدودة.

UnIndexed: لا يمكن البحث ضمن هذه الحقول, ولكن تتم اعادتها مع نتائج البحث.

عادة يتم استخدام هذا النمط من الحقول لتخزين الحقول من الانواع التالية في قاعدة المعطيات :

  • Timestamps
  • Primary keys
  • File system paths
  • Other identifiers

Binary : لا يتم تجزء القيم التي تخزن ضمن هذه الحقول ولا يتم فهرستها ايضا, ولكن يتم تخزينها واستعادتها مع نتائج البحث.

يمكن استخدام هذا الحقل لتخزين اي نمط من انماط المعطيات المرمزة على شكل سلسلة محرفية ثنائية binary string, مثل ايقونات الصور.

Text : يتم تخزين هذه القيم وفهرستها, وتقسميها الى كلمات.

يعتبر هذا النمط مناسب لتخزين المعلومات مثل العناوين والمعلومات التي نحتاج للبحث ضمنها واستعادتها مع نتائج البحث.

UnStored : يتم تقسيم قيم هذه الحقول إلى كلمات وفهرستها, ولكن لا يتم تخزينها ضمن الفهرسز

يستخدم هذا النمط من الحقول مع النصوص الكبيرة, لان تخزين المعطيات ذات الحجم الكبير ضمن الفهرس يؤدي الى ازداد الحجم الذي يستهلكه الفهرس من المساحة على القرص الصلب, لذلك في حال كنت ترغب بالبحث ضمن النصوص ولكن لا تحتاج إلى اعادة النصوص مع نتائج البحث, عندها فإن هذا النمط يمثل الاستخدام الافضل في حالتك.

4

باستطاعة مكتبة لوسين ان تقوم بفهرسة لانواع مصارد المعطيات التالية :

  • Database
  • HTML Pages
  • Word 2007 Documents
  • PowerPoint 2007 Documents
  • Excel 2007 Documents

ولكننا سوف نقتصر بشرحنا على فهرسة قاعدة المعطيات, ولمن يرغب بالتوسع بامكانه الاطلاع على المزيد عبر الروابط المدرجة.

نتابع في الحلقة القادمة حديثنا عن مكتبة لوسين, حيث سنتطرق إلى موضوع ” بناء الفهارس Building Indexes”.ط

وإلى ذلك الحين, استودعكم الله والسلام عليكم ورحمة الله وبركاته.

مراجع:

 

, , , , ,

أضف تعليق

لوسين Zend Search Lucene

السلام عليكم ورحمة الله وبركاته

نعتذر عن هذا الغياب الطويل, ولكننا نعود بالجديد دوما ان شاء الله

سنتحدث هذه المرة عن احدث الوسائل المتقدمة في مجال البحث ضمن المعطيات بكافة اشكالها سواء كانت على شكل قاعدة معطيات, او ملفات او مواقع.

ملاحظة : سنتحدث ضمن مثالنا عن تطبيق ويب Web application .

ولكننا لن نتكلم عن البحث بالطريقة التقلدية, وانما وسيلة بحث حديثة تخفف الكثير من الضغط الذي يلحق بسيرفر قاعدة المعطيات من جراء الاستعلامات الهائلة والمعقدة التي تلحق بها بسبب الضغط الكبير عليها.

لنتخيل بأن لدينا موقع بمثابة مكتبة الكترونية متنوعة, تحوي كافة اشكال الملفات, وهي مصنفة بعدة تصنيفات مختلفة.

وكانت واجهة الموقع تتيح لنا البحث بحسب عدة عوامل مختلفة, مثلا بحسب:

  1. اسم الملف
  2. توصيف الملف
  3. الشخص الذي قام برفع الملف
  4. تصنيف الملف
  5. ….

عملية البحث ستكون عبارة عن استعلام بسيط على قاعدة المعطيات.

ولكن تخيلوا بأن هذه المكتبة كانت غنية جدا بالمعلومات, اي ان قاعدة بياناتها ضخم جدا, وكذلك لنفترض بأن عدد المستخدمين الذين يبحثون ضمن المكتبة هائل جدا, وكنا نرغب باسلوب بحث ذكي اكثر من المعتاد, عندها ماذا سيحدث::

اولا سيكون الضغط على سيرفر قاعدة المعطيات ضخم جدا وقوي, وسيؤدي إلى تراجع بالاداءmaginfier

بالاضافة إلى ان عدد الملفات الكبير جدا سيؤدي إلى بطأ تنفيذ الاستعلام query الذي سيستغرق وقتا اكبر

بالاضافة إلى العديد من المشاكل التي ستؤثر بشكل اساسي على اداء الخدمة التي يقدمها الموقع.

 اذن ما الحل:

احد الحلول المقترحة او الموجودة حاليا يدعى “لوسين”

Zend_Search_Lucene

lucene

وهذا ما سنتطرق له ضمن سلسلة من الحلقات التي سنشرح ضمنها بشكل مختصر ووافي المزيد عن هذه المكتبة الرائعة جدا.

احببت الشرح والتطرق لهذه التقنية لما لمسته عند استخدامها من توفير اداء رائع جدا ضمن عمليات البحث, واحضار نتائج البحث المعقدة جدا والذكية بسرعة كبيرة, بالاضافة إلى تخفيف الضغط على قاعدة المعطيات بشكل كبير.

عن البحث عن هذه المكتبة, للاسف وجدت افتقار الانترنت للوثائق العربية التي تتحدث عن الموضوع حتى تكاد تنعدم, لذلك قررت الكتابة عن الموضوع والاستفاضة في الشرح الوافي عنه.

لوسين … ماهي لوسين :

بالاضافة إلى اسمها الجميل, فهي عبارة عن عن مكتبة بحث نصي ذات اداء عالي وميزات كثيرة, تمت كتابتها بشكل كامل باستخدام لغة جافاJava .

عبارة عن تقنية مناسبة تقريبا لاغلب التطبيقات التي تتطلب البحث النصي, وخصوصا ضمن ضمن منصات التشغيل المختلفة cross-platform.

ستتضمن الحلقات التالية مايلي:

  1. لمحة Overview
  2. بناء الفهارس Building Indexes
  3. البحث ضمن الفهرس Searching an Index
  4. لغة الاستعلام Query Language
  5. واجهة التطبيقات البرمجية المستخدمة لبناء الاستعلامات Query Construction API
  6. المحارف Character Set
  7. التوسع ضمن الموضوع Extensibility
  8. امور متقدمة Advance
  9. أفضل الممارسات Best Practice

وإلى لقاء قريب في الحلقة القادمة ان شاء الله

وإلى ذلك الحين , استودعكم الله والسلام عليكم ورحمة الله وبركاته

, , , , ,

أضف تعليق