أبو اليسر

تعلم كيف تتجاهل التشكيل والهمزات عند البحث بالنصوص العربية في قواعد بيانات Sql

44 ردود في هذا الموضوع

بسم الله الرحمن الرحيم

الحمد لله والصلاة والسلام على رسول الله وعلى آله وصحبه أجمعين، أما بعد:

في هذا الدرس سنتعلم بإذن الله كيف نقوم بتجاهل التشكيل والهمزات والتاء المربوطة وأحرف العلة من اللغة العربية عند البحث في النصوص العربية ضمن قواعد بيانات Sql.

ملاحظات:

• أكواد تجاهل الهمزات والتاء المربوطة وأحرف العلة تعمل في قواعد بيانات أكسس وقواعد بيانات Sql أما كود تجاهل التشكيل فلا يعمل إلا مع قواعد بيانات Sql

• يوجد مثال للدرس مرفق مصمم في vb.net 2005

نظرة تاريخية:

طرحت سؤالاً في منتديات الفريق العربي للبرمجة عن كيفية تجاهل التشكيل عند البحث باستخدام عبارات Sql وكان ذلك قبل ما يقارب السنتين..

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

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

فمثلاً: اللغات التي تحتوي على أحرف تشكيل غير اللغة العربية قامتMicrosoft بوضع خاصية لهم عند بناء قاعدة بيانات Sql وهي من خصائص الحقل لو وضعتها لقام معالج البحث بتجاهل التشكيل في هذه اللغات بكل تلقائي، هذه الخاصية هي:

Collation = SQL_Latin1_General_CP437_CI_AI

أو غيرها حسب اللغة..

فبهذا الخيار لو بحث المستخدم عن حرف a مثلاً ستظهر له كافة النتائج التي تحتوي على a والتي تحتوي على ä أو å.

أما اللغة العربية فلا يوجد خيار لدعم تجاهل التشكيل لها في قواعد بيانات Sql..

ولهذا اضطر المبرمجون العرب لسلوك طرق مختلفة معوجة حتى يصلوا إلى طريقة لتجاهل التشكيل أثناء البحث في النصوص العربية وكانت هذه الطرق حسب ما رأيت كالتالي:

طرق خاطئة:

الطريقة الأولى:

وهي أفضل طريقة من بين هذه الطرق لمن عنده نصوص كبيرة مشكلة، وهذه الطريقة تعتمد على فلترة النص من التشكيل قبل البحث فيه.

وقد رأيت كوداً في منتديات Sql هنا يقوم بفلترة التشكيل من النص من خلال Function تضاف إلى قاعدة بيانات Sql وهو الطريق الأفضل من بين طرق الفلترة أثناء البحث..

ومن مشاكل هذه الطريقة أنها تقوم بتعبئة النص المفلتر في الذاكرة ثم تبحث فيه..

وأنها تبطأ عملية البحث بشكل كبير..

ولكن ماذا يفعل من كان عنده قاعدة بيانات نصوص حجمها يصل إلى حوالي 6 جيجا كما في برنامج المكتبة الشاملة الإصدار الثاني مثلاً، لا بد أن يسلك مثل ها الطريق لأنه الأفضل بالنسبة له من بين الطرق الأخرى هذه.

الطريقة الثانية:

وهي وضع حقل مفلتر من التشكيل للنصوص المشكلة بجانب الحقل الأصلي ثم البحث في هذا الحقل وعرض النتيجة من الحقل الأصلي.

وهذه الطريقة هي المستخدمة في كثير من برامج البحث في نص القرآن الكريم لأن حجم قاعدة البيانات لنص القرآن الكريم صغيرة الحجم نسبياً..

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

الطريقة الثالثة:

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

وهذه الطريقة تلزم المستخدم بعدم كتابة أي علامة من علامات التشكيل في كلمة البحث، ثم تلزمه باختيار التشكيل الذي يريده لكلمته من خلال قاموس مشكل للكلمات لديها، ثم تقوم بالبحث عن الكلمة التي كتبها بالتشكيل الذي اختاره..

ومشكلة هذه الطريقة أنها غير فعالة إلا مع شركة كشركة صخر لأن من يملك نصوصاً لم يكتبها هو كيف سيشكلها كلها؟ وكيف سيجد هذا القاموس الذي صنعته صخر، وكيف وكيف؟

إذن فهي طريقة لن تجدي نفعاً معنا..

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

الطريقة الرابعة:

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

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

الطريقة الخامسة:

عمد بعض مبرمجي العرب إلى فلترة النصوص من التشكيل بل ومن أحرف الهمزة واستبدالها من بأحرف من غير همزة فيقوم باستبدال أحمد بـ: احمد، واستبدال هدي بـ: هدى، واستبدال أسامة بـ: اسامه.

ويا للعار، فهذه طريقة جداً خاطئة في نظري، فنحن نسعى لإيجاد طرق لتصحيح النصوص التي تكتب على الكمبيوتر وهذه الطريقة تسعى لتدمير كافة النصوص العربية التي ستكتب عليه..

بداية الطريق:

كانت بداية النهاية لهذه الأزمة عند ما بدأت بتجربة استخدام قوسي [] ضمن عبارات Sql أثناء عملية البحث..

هذين القوسين [] لو استخدما في كلمة البحث من جملة Sql فسيقوم البرنامج بالبحث عن أحد الأحرف الموجودة ضمن القوسين بشرط وجود جميع الأحرف.

فمثلاً:

Select * from tbl where fld like '[أكل]'

سيظهر البحث جميع النتاج التي تحتوي على أ ك ل بشرط وجود هذه الأحرف جميعها، فتظهر النتاج كالتالي:

أكل

يأكل

مأكولات

يأكلون

وهذا يعني تقريباً أنه بحث عن جذر الكلمة، ويمكن اعتماد هذه الطريقة للبحث على مستوى الجذر رغم أنها ستظهر بعض النتائج الخاطئة..

والآن الخطوة الثانية:

لو وضعنا هذين القوسين على بعض الحروف مثلاً:

Select * from tbl  where fld like '[أا]حمد'

سيظهر جميع النتائج التي تحتوي على "أحمد" والتي تحتوي على "احمد"، لأننا وضعنا "أ" و"ا" ضمن القوسين فأصبحت اختيارية بالنسبة له، ولكن بشرط وجود أحد الأحرف التي بين القوسين. فلن يظهر النتائج التي تحتوي على "حمد" فقط.

وهكذا نكون قد وصلنا إلى حل لتجاهل الهمزات أثناء البحث.

أما تجاهل التاء المربوطة فمثل هذا:

Select * from tbl where fld like 'بقر[ةه]'

وبهذا ستظهر النتائج التي تحتوي على كلمة: "بقرة" والتي تحتوي على كلمة "بقره".

ومثل هذا تجاهل أحرف العلة:

Select * from tbl where fld like 'هد[اىيو]'

عند البحث عن "هدا" أو "هدى" أو "هدي" ستظهر النتائج التي تحتوي على:

هدا

هدى

هدي

هدو

ملاحظة: يمكن استخدام كافة خيارات Sql في هذه الحالة فيمكن وضع علامة % قبل وبعد الكلمة بشكل طبيعي.

والآن كيف نستفيد من هذا الكود لتجاهل التشكيل:

لو وضعنا علامات التشكيل كلها بين القوسين [] بعد كل حرف من أحرف الكلمة ماذا سيحدث؟

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

Select * from tbl where fld like 'م[ِ َ]ن'

مثلاً: الكود السابق سيعطينا النتائج التي تحتوي على "مَن" المشكلة بالفتح بعد الميم. و"مِن" المشكلة بالكسر بعد الميم.

لكنه لن يعطينا النتائج التي لا تحتوي بعد الميم لا على علامة الفتح ولا على علامة الكسر يعني لن يعطينا "من" الغير مشكلة.

لماذا؟ كما ذكرنا أن الحروف التي ما بين القوسين مطلوب أحدها، فيرجع كافة القيم التي تحتوي على أحد الأحرف الموجودة بين القوسين ولا يرجع القيم التي ترجع 0 صفر حرف من الأحرف الموجودة بين القوسين.

هذه أول مشكلة، والمشكلة الأخرى: هي أنه لا يأخذ أكثر من حرف معاً من بين الأحرف التي بين القوسين فمثلاً لو كتبنا:

Select * from tbl  where fld like '[أا]حمد'

سيرجع النتائج:

أحمد

احمد

ولن يرجع النتيجة:

أاحمد

ولا النتيجة:

أأحمد

وبالتالي فعند استخدامه للتشكيل لن تكون النتيجة صحيحة لأن علامة الشدة قد يكون فوقها علامة الفتح أو الكسر... فلو وضعنا علامة الشدة وعلامة الفتح وعلامة الكسر بين القوسين فسيرجع القيم التي تحتوي على:

علامة الشدة وحدها؛ علامة الفتحة وحدها؛ علامة الكسرة وحدها؛ ولن يرجع النتيجة التي تحتوي على علامة الشدة مع الفتحة مثلاً.

الحل:

أصل هذين القوسين [] من العبارات الاعتيادية Regular Expressions ولكن عند استخدامهما مع جمل Sql بشكل مباشر يقوم بتنفيذ ما ذكرنا ولا يقوم بتنفيذ كافة خيارات العبارات الاعتيادية ضمن عبارات Sql.

لماذا نحتاج لاستخدام خيارات العبارات الاعتيادية هنا ضمن عبارات Sql؟

لأننا لو استطعنا استخدامها نكون قد وصلنا إلى حل للمشكلتين التين ظهرتا معنا عند استخدام القوسين [] لتجاهل التشكيل.

المشكلة الأولى أنها لا ترجع القيمة صفر من القيم التي بين القوسين، والمشكلة الثانية أنها لا تأخذ أكثر من حرف معاً من الأحرف الموجودة بين القوسين.

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

فمثلاً:

'م[ِ َ ّ]*ن'

هذه العبارة سترجع عند استخدام العبارات الاعتيادية القيم التالية:

"من" التي فوق الميم فتحة أو فوق الميم كسرة أو فوق الميم شدة.

"من" التي من غير تشكيل.

"مَّن" التي فوق الميم شدة وفوقها فتحة أو كسرة.

وهذا هو المطلوب تماماً..

فكيف نستخدم العبارات الاعتيادية ضمن عبارات البحث في Sql؟

لمعرفة التفاصيل: اقرأ هذا الموضوع:

ولعدم معرفة التفاصيل، اتبع ما يلي:

قم بتحميل المرفق الثاني مع هذا الدرس والمسمى: "SqlRegExDB" وبعد تشغيله قم بفتح نافذة My Project واذهب إلى صفحة Database ثم قم بتحديد قاعدة بيانات Sql مشروعك، عن طريق الزر استعراض.

ستظهر لك نافذة الاتصال بقاعدة البيانات وسيطلب منك أولاً تحديد اسم السيرفر: اكتب: "localhost\SQLEXPRESS"..

انظر الصورة:

6(2).jpg

بعد تحديد القاعدة والموافقة ستظهر لك رسالة لتفعيل CLR على قاعدة البيانات اختر موافق.

ملاحظة: سنحتاج لتفعيل CLR على القاعدة قبل كل اتصال بها وهذا لتستطيع القاعدة أن تفهم ال function المكتوب بال vb.net والمضاف إليها..

سنتعلم فيما بعد إن شاء الله الطريقة السهلة لتفعيل CLR.

الآن أغلق نافذة My Project ثم انقر بالزر الأيمن للفأرة فوق اسم البرنامج في solution explorer ثم اضغط الأمر Rebuild ثم الأمر Deploy

بعد انتهاء تنفيذ الأمرين تكون قاعدة بياناتك جاهزة وقد أضيف إليها Function لاستخدام العبارات الاعتيادية عند التعامل مع هذه القاعدة، واسم هذا الFunction هو: ContainsRegExp

الآن أغلق هذا المشروع ولن تحتاج إليه إلا عند صنع قاعدة بيانات جديدة.

بعد ذلك قم باستخدام قاعدة بياناتك في أي مشروع vb.net أو غيره ولكن عندما تريد الاتصال بها يجب أن تقوم بتفعيل CLR قبل الاتصال بها هذا إذا كنت تريد استخدام الFunction السابق الذي وضعته فيها.

لتفعيل CLR استخدم هذا الFunction :

  Friend Function RUNCLR(ByVal MyLibName As String) As Boolean
Try
Dim ClrCom As New SqlClient.SqlCommand
ClrCom.CommandText = "sp_configure 'clr enabled', 1; RECONFIGURE"
Dim Cn As New SqlClient.SqlConnection
Cn.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=" & MyLibName & ";Integrated Security=True;User Instance=True"
Cn.Open()
ClrCom.Connection = Cn
ClrCom.ExecuteNonQuery()
Cn.Close()
Return True
Catch ex As Exception
Return False
End Try
End Function

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

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

وسيكون شكل CommandText عند البحث مع تجاهل التشكيل على النحو التالي:

"Select * from tbl WHERE (dbo.ContainsRegExp(fld, N'" & TxtSearch & "') = 1)"

انتبه لمكان وضع اسم الحقل الذي سيتم البحث فيه fld

وأما TxtSearch فهو نص البحث مضاف إليه الشكل الذي اتفقنا عليه قبل قليل لتتم عملية تجاهل التشكيل، وللتذكرة هذا هو:

'م[ِ َ ّ]*ن'

الآن وإتماماً للفائدة قمت بكتابة Function تقوم بإعداد كلمة البحث على الشكل المطلوب لكل من تجاهل التشكيل وتجاهل الهمزات وتجاهل التاء المربوطة وتجاهل أحرف العلة:

Friend Function PrepareWords(ByVal MyWords As String, ByVal IgnoreTashkeel As Boolean, ByVal IgnoreHamzat As Boolean, ByVal IgnoreTahMarbota As Boolean, ByVal AhrofAlela As Boolean)
Dim MyNewString As String = ""
If IgnoreTashkeel Then
Dim IgnrTshForm As String = "[ًٌٍَُِّْ~`]*"
For i As Integer = 0 To Len(MyWords) - 1
MyNewString += Mid(MyWords, i + 1, 1) + IgnrTshForm
Next
Else
MyNewString = MyWords
End If
Dim uu As Integer = Len(MyNewString)
Dim aaa(uu - 1) As String
For i As Integer = 0 To uu - 1
aaa(i) = Mid(MyNewString, i + 1, 1)
Next
For t As Integer = 0 To aaa.Length - 1
Select Case aaa(t)
Case "ا"
If IgnoreHamzat Then aaa(t) = "[اأإآؤئء]"
If AhrofAlela Then aaa(t) = "[اويى]"
Case "أ"
If IgnoreHamzat Then aaa(t) = "[اأإآؤئء]"
Case "إ"
If IgnoreHamzat Then aaa(t) = "[اأإآؤئء]"
Case "آ"
If IgnoreHamzat Then aaa(t) = "[اأإآؤئء]"
Case "ؤ"
If IgnoreHamzat Then aaa(t) = "[وأإآؤئء]"
Case "ئ"
If IgnoreHamzat Then aaa(t) = "[أىإآؤئءي]"
Case "و"
If IgnoreHamzat Then aaa(t) = "[وأإآؤئء]"
If AhrofAlela Then aaa(t) = "[اويى]"
Case "ي"
If IgnoreHamzat Then aaa(t) = "[أإآؤئءي]"
If AhrofAlela Then aaa(t) = "[اويى]"
Case "ء"
If IgnoreHamzat Then aaa(t) = "[أإآؤئء]"
Case "ى"
If IgnoreHamzat Then aaa(t) = "[أىإآؤئء]"
If AhrofAlela Then aaa(t) = "[اويى]"
Case "ة"
If IgnoreTahMarbota Then aaa(t) = "[ةه]"
Case "ه"
If IgnoreTahMarbota Then aaa(t) = "[ةه]"
End Select
Next
MyNewString = Join(aaa, "")
Return MyNewString
End Function

ما عليك سوى استدعاء هذه الFunction وإعطائها كلمة البحث مع تحديد الخيارات المطلوبة لترجع لك الكلمة بالشكل المطلوب، قم باستدعائها على النحو التالي:

		Dim TxtSearch As String = PrepareWords(TextBox1.Text, True, True, True, True)

الخيار الأول لتجاهل التشكيل

الخيار الثاني لتجاهل الهمزات

الخيار الثالث لتجاهل التاء المربوطة

الخيار الرابع لتجاهل أحرف العلة

والآن قم بالبحث عن TxtSearch بعد تحضيرها في ذلك الFunction كما يلي:

Dim MyWhere As String = "Select * from book WHERE (dbo.ContainsRegExp(MyTxt, N'" & TxtSearch & "') = 1)"

وهكذا سيقوم البرنامج بتنفيذ عملية البحث مع كافة الخيارات المطلوبة..

وستدعو لي بالتوفيق إن شاء الله.

ملاحظة:

في الكود السابق لا يمكنك استخدام علامة % قبل وبعد نص البحث لأننا أبحنا نتحدث عن أكواد العبارات الاعتيادية وهو بشكل عادي في الكود السابق سيعطيك النتيجة تماماً كما لو وضعت علامة % قبل وبعد نص البحث في عبارة Sql.

ولكن حتى تقوم بعملية بحث مطابق يعني كما لو حذفت علامة % من قبل النص ومن بعده في عبارة Sql قم بوضع علامة ^ قبل نص البحث، وعلامة $ بعد نص البحث، فيصبح الكود على الشكل التالي:

"Select * from book WHERE (dbo.ContainsRegExp(MyTxt, N'^" & TxtSearch & "$') = 1)"

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

الخاتمة:

هذا الدرس آمل أن يكون حلاً لمأساة طالما عانى منها كثيرون بسبب تجاهل Microsoft لتخديم اللغة العربية بشكل جيد في برامجها..

وأنا أتصور وبما أننا وصلنا إلى الحل أن تخدم Microsoft خيارات اللغة العربية في الإصدارات القادمة من برامجها، كما هي عادتها دائماً!

وفي النهاية أقول: رغم أنه يوجد الكثير من النقاط في هذا الشرح تركتها شبه مجهولة من غير تفصيل وذلك لضيق الوقت إلا أنني آمل أن يفيد هذا الكود مبرمجي المسلمين..

وأنا سأعمل بإذن الله لتطوير برنامج ليكون بمثابة محرك بحث باللغة العربية يدعم كل خياراتها، وأسأل الله التوفيق؛ وأتصور أن تكون الخيارات التي في هذا المحرك كالتالي:

2(7).JPG

يوجد ملفين مرفقين..

هذا وآخر دعوانا أن الحمد لله رب العالمين.

حسبي الله ونعم الوكيل..

لم أعرف كيف أرفق الملفات، مع أنني أرفقت ملفات من قبل.. ولكن لا أجد أي زر أمر لإرفاق ملفات!! <_<

4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
بحث مفيد أخي أبو اليسر

شكرا لك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله الجنة وراية وجه الجليل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاكم الله خيراً..

ولكن كيف أستطيع أن أرفق الملفات؟!

أين وصلة إرفاق ملف في صفحة إضافة رد؟!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هذا رابط الملف الأول:

وهذا رابط الملف الثاني:

عفواً الروابط لا تعمل.

تم تعديل بواسطه أبو اليسر
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بارك الله فيك ، يا أبو اليسر ، ويسر لك طريقا إلى الجنة ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شي رائع وجزاك الله خيرا

هذه فعلا مشاركة مفيدة ومفهومة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

هذا هو المثال ومرفقاته مرفقة..

الملف الأول:

IgnoreTashkeel

مثال للبحث مع تجاهل التشكيل والهمزات والتاء المربوطة وأحرف العلة من اللغة العربية.

الملف الثاني:

SqlRegExDB

لإضافة Function العبارات الاعتيادية لقاعدة البيانات كما تحدثنا في الأعلى.

الملف الثالث:

EnableClR

لتفعيل CLR على السيرفر..

وأنا كنت أظن أن تفعيل CLR نحتاجه لكل قاعدة بيانات ولكن تبين لي فيما بعد أن هذا خطأ..

والصواب أن CLR تفعل على السيرفر، وبالتالي ستحتاج لتفعيلها مرة واحدة فقط عند دخولك للبرنامج.

والحمد لله رب العالمين

IgnoreTashkeel.rar

SqlRegExDB.rar

EnableClR.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

فعلاً موضوع رائع

بارك الله فيك أخي الفاضل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي أبو اليسر شكرا لك على طرح الموضوع ذو الأهمية البالغة ولكن لي طلبين لو سمحت :

الطلب الأول أن تفرق مشروع معمولة على قواعد بيانات أكسس وأن تكون الخيارات المطروحة ، وأن تكون القاعدة البيانات مثلا كفحات كتاب

الطلب الثاني طرحت موضوع مشكلة إستغراق الوقت عند تحميل قواعد البيانات حيث أستغرب مثلا في المكتبة الشاملة يكون الكتاب به أكثر من 10000 صفحة ويتم تحميله بسرعة دون أن يحس المستخدم أرجو أن تعينني في الحل ولك جزيل الشكر رابط الموضوع

http://www.arabteam2000-forum.com/index.ph...=112679&hl=

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

جزيت الفردوس الأعلى

نرجو منك أن تطبقها على بيسك 6

نحن بأمس الحاجة إليها

ولن ننساك من الدعاء أبداً

والله في عون العبد ما كان العبد في عون أخيه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيراعلى هذا المجهود الرائع و الله يعلم كم كنت محتاجة لحل هذه المشكلة ولكن:

المثال SqlRegExDB نزلته و لم يعمل معى بيقول cannot be loaded - انا اعمل على نسخة vb2008 فما الحل من فضلك انتظر الرد لان الموضوع مهم جدا جدا بالنسبة لى لانى اعمل برنامج يتطلب هذا البحث و متوقف على رد حضرتك

و شكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مشكوز على هذا الجهد المميز ....... جزاك الله كل خير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

الاخ السندبااد هذا الحل من المستحيل تطبيقه على فيجوال بيسك 6 ولا حتى على قاعدة بيانات اكسس

وبالنسبة للاخت هند قنديل فالمثال يعمل على 2008 بشكل صحيح لكن عند فتح المشروع يطلب تغيير قاعدة البيانات (نسخة 2008 مرفقة)

SqlRegExDB2008.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

انا جربت طلع لى الخطأ ده !! فى الملف المرفق

untitled.bmp

تم تعديل بواسطه هند قنديل
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اين الرد يا اخوتى ؟

انا احتاجموضوع البحث ده ضروووووورى جداااااااااااااااااااا

اين الرد يا اخوتى ؟

انا احتاجموضوع البحث ده ضروووووورى جداااااااااااااااااااا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

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

لكن هذا المشروع هو فقط يحوي على فئة واحدة ContianRegExp فقط لذا من الممكن عمل مشورع جديد من نوع Library ثم اضافة هذه الفئة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

انا عملت مشروع من نوع كلاس و اضفت له المثال بتاع حضرتك و مش عارفة أكمل .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

الأخ أبو اليسر أكرر شكري وامتناني لك على عملك الرائع

لي طلب ورجاء:

أرجو منك أن تعيد لي رفع الملف الأول IgnoreTashkeel

لأنني حملته مراراً وتكرارا ولكنه معطوب

أريده مع السورس وأكون لك من الشاكرين ولن أنساك اليوم من الدعاء في صلاة القيام

والله في عون العبد ماكان العبد في عون أخيه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

أنا لم أدخل للمنتدى منذ زمن بعييييد.. كنت أتصفحه اليوم ففوجئت بهذه الردود حول مقالي عن البحث مع تجاهل التشكيل، ولكن هذا المقال قديم وتاريخه في الشهر 11-2006 :lol: !!

على أية حال، أرفقت من جديد الأمثلة المرفقة مع الدرس لأنها لا تعمل وأرفقت أيضاً صفحة الدرس مسحوبة سابقاً وفيها صور الدرس.

الملف مرفق..

بالنسبة لاستخدام نفس الأفكار مع قواعد بيانات أكسس فهذا غير ممكن إلا موضوع تجاهل الهمزات فهو ينجح مع قواعد بيانات أكسس أيضاً.

أما تحويلها لvb6 فما أدري كيف أو لماذا وأظن هذا غير ممكن.

وأقول لك أخي الفاضل 'السندبااد' "لخدمة البرامج الإسلامية" اترك vb6 ولا تبرمج به أي برنامج إسلامي إلا للضرورة لأنه يعطي نتيجة غير لائقة ولا تدل على إتقان أبداً! :angry:

ثم إذا كان عندك مشروع فيه نصوص كبيرة الحجم كبرامج المكتبات مثلاً فالصواب أن تستخدم طريقة الفهرسة في البحث وليس هذه الطرق العادية.

ولاسيما الطريقة التي توصلت إليها في سؤالك هنا فهي بطيئة ولن تنجح مع النصوص كبيرة الحجم.

الأخت 'هند قنديل': المشروع SqlRegExDB هو لإضافة فنكشن لقاعدة البيانات تمكننا من استخدام العبارات الاعتيادية معها..

يمكن إعادة بناؤه من جديد من خلال الخطوات التالية:

1- شغل vs2008 أو vs2005 واختر إنشاء مشروع جديد.

2- في شجرة نوع المشروع اختر من القسم visual basic العنصر Database

3- من قائمة Temlates حدد SQL Server Project

4- حدد الاسم والمسار الذي ترغب به للمشروع ثم اضغط ok لإنشاء المشروع.

5- تظهر نافذة New Database Refrence حدد منها قاعدة البيانات التي ترغب باستخدام RegExp معها.

6- بعد الموافقة تظهر لك رسالة لتفعيل clr انقر فوافق عليها.

7- بعدها اذهب إلى solution explorer وأضف للProject الملف المرفق ContainsRegExp.vb وذلك من خلال النقر باليمين على اسم البروجكت ثم add ثم existing Item

8- الآن انقر باليمين فوق عنصر البروجكت واختر الأمر Rebuild ثم الأمر Deploy

9- أصبحت قاعدة البيانات جاهزة؛ للتكد من ذلك اذهب إلى Server Explorer ثم افتح قاعدة البيانات ثم افتح منها المجلد Functions ستجد ContainsRegExp

بعدها يمكنك اسستخدام العبارات الاعتيادية مع قاعدة البيانات هذه من خلال الفنكشن ContainsRegExp

يمكنك رؤية بعض الخطوات السابقة مشروحة ومصورة في المقال الأول والصور مرفقة معه في الملف المرفق بداية من عند الجملة: "ولعدم معرفة التفاصيل، اتبع ما يلي:".

وللحفاظ على الكود أضعه هنا وهو يجب أن يوضع في ملف من نوع Class:

Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Text.RegularExpressions
Partial Public Class UserDefinedFunctions
<Microsoft.SqlServer.Server.SqlFunction(IsDeterministic:=True, DataAccess:=DataAccessKind.None, SystemDataAccess:=SystemDataAccessKind.None, IsPrecise:=True)> _
Public Shared Function ContainsRegExp(ByVal text As SqlString, ByVal pattern As SqlString) As SqlBoolean
If (text.IsNull OrElse pattern.IsNull) Then
Return New SqlBoolean(False)
Else
Return New SqlBoolean(Regex.IsMatch(text.Value, pattern.Value))
End If
End Function
End Class

أرجو أن أكون قد وفقت لإفادتكم وجزاكم الله خيراً..

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

TahkeelUpdate2.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

أنا لم أدخل للمنتدى منذ زمن بعييييد.. كنت أتصفحه اليوم ففوجئت بهذه الردود حول مقالي عن البحث مع تجاهل التشكيل، ولكن هذا المقال قديم وتاريخه في الشهر 11-2006 :lol: !!

على أية حال، أرفقت من جديد الأمثلة المرفقة مع الدرس لأنها لا تعمل وأرفقت أيضاً صفحة الدرس مسحوبة سابقاً وفيها صور الدرس.

الملف مرفق..

أهلا بك أخي الحبيب وحمداً لله على سلامتك ولا تعجب فهذا من المواضيع الخالدة أسأل الله أن يجعله في صحيفة أعمالك

بالنسبة لاستخدام نفس الأفكار مع قواعد بيانات أكسس فهذا غير ممكن إلا موضوع تجاهل الهمزات فهو ينجح مع قواعد بيانات أكسس أيضاً.

أما تحويلها لvb6 فما أدري كيف أو لماذا وأظن هذا غير ممكن.

وأقول لك أخي الفاضل 'السندبااد' "لخدمة البرامج الإسلامية" اترك vb6 ولا تبرمج به أي برنامج إسلامي إلا للضرورة لأنه يعطي نتيجة غير لائقة ولا تدل على إتقان أبداً! :angry:

ثم إذا كان عندك مشروع فيه نصوص كبيرة الحجم كبرامج المكتبات مثلاً فالصواب أن تستخدم طريقة الفهرسة في البحث وليس هذه الطرق العادية.

ولاسيما الطريقة التي توصلت إليها في سؤالك هنا فهي بطيئة ولن تنجح مع النصوص كبيرة الحجم.

أخي الحبيب: على رِسلك لماذا غير ممكن؟!

ألم ترَ برنامج المكتبة الشاملة الذي يحوي الملايين من البيانات مع أسلوب راقٍ في البحث

بتجاوز التشكيل أو الهمزات وما شابه ذلك

والمكتبة الشاملة مبرمجة بالبيسك 6 على قواعد بيانات 97

إذن المسألة ممكنة

أعرف أنها طريقة صعبة ولكن يجب أن نقوم بحلها والتخلص منها إما على بيسك6 أو على بيسك دوت نت

ما شعورك وأنت تبحث في خزانة المقالات الإسلامية أو برنامج إسلامي لرد الشبهات عن كلمة "الله" أو أية آية قرآنية ثم تخرج لك رسالة تقول

" لا توجد نتائج للبحث"

لنساعد الباحثين والمبرمجين المسلمين في التخلص من هذه المشاكل أم ننتظر حلولاً من مايكروسوفت؟

ثم إذا كان عندك مشروع فيه نصوص كبيرة الحجم كبرامج المكتبات مثلاً فالصواب أن تستخدم طريقة الفهرسة في البحث وليس هذه الطرق العادية.

ولاسيما الطريقة التي توصلت إليها في سؤالك هنا فهي بطيئة ولن تنجح مع النصوص كبيرة الحجم.

هل لك أن توضح هذه النقطة لو تكرمت

ملاحظة: ما اللغة التي تنصح بها لمن يهتم بالبرمجة الإسلامية؟

ألف تحية لك

أسأل الله لك العمر المديد والعمل الصالح الرشيد

تم تعديل بواسطه السندبااد
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

حياك الله أخي 'السندبااد' وجزاك كل خير وأهلاً بك..

بالنسبة للغير ممكن أقصد استخدام طريقة العبارات الاعتيادية مع قواعد بيانات أكسس؛ أما تجاهل التشكيل فله أكثر من طريقة منها الطريقة المستخدمة في المكتبة الشاملة وهي أظن نفس التي وصلت إليها في سؤالك السابق ولكن المشكلة هو بطء هذه الطريقة لأنها تعتمد على الfor ومعالجة وفلترة كل سطر على حده.. ولهذا لو أردنا البحث في جميع كتب المكتبة الشاملة الإصدار الثاني كم ستكلفنا العملية من وقت؟

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

.........

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

طبعاً مع وجود كم هائل من النصوص لا يمكننا اعتماد آليات البحث العادية وحتى لو استخدمنا قواعد بيانات متقدمة مثل قواعد بيانات MSSQL تبقى مشكلة البحث في النصوص كبيرة الحجم قائمة في حال استخدمنا الطرق العادية من أمثال:

Select * from mytbl where txtfld like '%txtsearch%'

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

والحلول الموجودة أيضاً كثيرة منها ما صنعته مايكروسوفت وبنت عليه محرك البحث live.com وهو استخدام ما يعرف بالفهرسة أو ما يسمى FullTextSearch مع قواعد بيانات MSSQL وهو فعلياً يسرع عملية البحث بشكل هائل وهذا يتضح من فكرته، ولكن المشكلة أننا إذا أردنا أن نستخدم FullTextSearch الذي صنعته مايكروسوفت فسنكون مضطرين لاستخدام سيرفر متقدم مثل ديفلوبر سيرفر أو غيره وحتى الأدفانس سيرفر لا يكفي حسب التجربة؛ والمشكلة تكمن في أن هذا السيرفر كبير الحجم يصل حجم الجزء المطلوب منه إلى 89 ميجا فيما أذكر كما أنه غير مجاني؛ وهذا يعيق انتشاره عبر النت كما يعطل انتشاره في الدول التي تراعي حقوق الملكية؛ عدا عن مشكلته الكبيرة في التنصيب وتعقيداته، مما يؤدي بنا إلى الفشل لو استخدمناه مع برامج المكتبات الإسلامية خاصة الخيرية منها.

الحل هو فهم آلية عمل هذه الخاصية وتطبيقها بصورة مناسبة لنا؛ فأما فكرتها (الفهرسة) في فكرة بسيطة لو لم تكن تعلمها فإليك هي:

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

فمثلاً: لو عندنا الصفحة 11 من كتاب تحتوي على النص: "بسم الله الرحمن الرحيم"، والصفحة 12 من الكتاب تحتوي على النص: "بسم الله الذي لا يضر مع اسمه شيء" تأتي عملية الفهرسة لتأخذ الكلمات دون تكرار فينتج عندنا الجدول التالي:

الكلمة - الموضع

بسم - 12،11

الله - 11،12

الرحمن - 11

الرحيم - 11

الذي - 12

لا - 12

يضر - 12

مع - 12

اسمه - 12

شيء - 12

الآن لو بحث المستخدم عن كلمة "بسم" فإننا نبحث في هذا الجدول بدلاً من أن نبحث في نفس النص ثم نعرض النتائج حسب رقم الصفحة..

والفائدة واضحة فبالنصوص الطويلة يتم اختزال عدد كبير من الكلمات المتكررة وهذا يعني توفير الجهد على البرنامج فبدلاً من أن يبحث في نص يتكون من 10 آلاف كلمة مثلاً فيها متكررات يبحث في 1000 كلمة مفهرسة بدون تكرار وهذا يسرع عملية البحث 10 مرات!! ويعطي نفس النتائج..

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

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

وإليك فكرة إضافية: ماذا لو طورنا جدول الفهرس بحيث جعلناه جداول متعددة حسب أحرف اللغة يعني فهرسة للفهرس، مثلاً:

نقوم بفصل كل الكلمات التي تبدأ بالحرف ألف في جدول منفصل وكذلك فصل الكلمات التي تبدأ بالحرف باء بشكل منفصل وهكذا على جميع الحروف؛ ثم كل جدول من هذا الجداول نرتب الكلمات فيه هجائياً وهكذا نحصل على نتيجة أسرع من البرق عند البحث:

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

هذه فكرة ولو أمعنا النظر لوجدنا غيرها وغيرها مما يجعل عملية البحث في مكتبة بحجم المكتبة الشاملة فقط بمجرد الضغط على زر البحث تظهر جميع النتائج مباشرة دون أي انتظار؛ ولو كان هذا مستحيلاً إذن كيف نجح Google وكيف نجحت محركات البحث الأخرى؟؟

طبعاً لا ننسى أن الأخ مبرمج المكتبة الشاملة استخدم فكرة الفهرسة في الإصدار الثاني من البرنامج ولكنها تعطي أخطاء وتحتاج إلى تطوير..

...........

النقطة الأخيرة: ما اللغة التي تنصح بها لمن يهتم بالبرمجة الإسلامية؟

ليست المشكلة في اللغة هذه أو تلك، ولكن علينا أن نواكب التطورات في عالم البرمجة، حتى لا تكون برامجنا دائماً في المؤخرة، وهذا لا يمكن إدراكه مع vb6 فعالم البرمجة الآن في واد وvb6 في واد آخر؛ والمشكلة أن عدد هائل من البرامج الإسلامية مصنوعة بلغة vb6 ونبقى مع المكتبة الشاملة جزى الله القائمين عليها خير الجزاء، هي على درجة ممتازة جداً من الناحية البرمجية بالنسبة للvb6 لكن لو قارنا ما يمكننا إنجازه بالvb.net لمشروع المكتبة الشاملة لوجدنا أن ما أنجز بواسطة vb6 لهذا المشروع لا يعتبر شيئاً فيكون vb6 سبباً في جعل مثل هذا البرنامج أقل في المستوى البرمجي رغم التعب والجهد الكبير الذي بذل لتحقيقه..

فهذه هي الفكرة، ولم يعد للvb6 دور كبير في البرمجة إلا في حالات قليلة جداً مثل العمليات المخفية والمراقبة ونحو ذلك..

وأعتقد أن هذا الموضوع ليس فيه مجالاً للنقاش لوضوح المشكلات والتقصير عند استخدام vb6..

أسأل الله أن يوفقنا للخير والسداد وأن يستعملنا في طاعته وفي نصرة دينه، آمين..

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

تم تعديل بواسطه أبو اليسر
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .