سؤال

لقد قرأت للتو منشورًا يشير إلى "البحث عن النص الكامل" في SQL.

كنت أتساءل فقط ما هو الفرق بين FTS و LIKE.لقد قرأت عدة مقالات ولكن لم أجد أي شيء يشرح ذلك جيدًا.

هل كانت مفيدة؟

المحلول

بشكل عام، هناك مقايضة بين "الدقة" و"الاسترجاع".الدقة العالية تعني أنه تم تقديم عدد أقل من النتائج غير ذات الصلة (لا توجد نتائج إيجابية كاذبة)، في حين أن الاستدعاء العالي يعني فقدان عدد أقل من النتائج ذات الصلة (لا توجد نتائج سلبية كاذبة).يمنحك استخدام عامل التشغيل LIKE دقة بنسبة 100% دون التنازل عن الاستدعاء.تمنحك ميزة البحث عن النص الكامل قدرًا كبيرًا من المرونة لضبط الدقة من أجل تذكر أفضل.

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

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

الميزات الأخرى النموذجية للبحث عن النص الكامل هي

  • التحليل المعجمي أو الرمز المميز - اقتحام كتلة من النص غير المهيكل في الكلمات الفردية والعبارات والرموز الخاصة
  • التحليل المورفولوجي ، أو الناجمة - تباين الاختلافات لكلمة معينة في مصطلح فهرس واحد ؛على سبيل المثال ، علاج "الفئران" و "الماوس" ، أو "كهربة" و "كهربائية" مثل نفس الكلمة
  • الترتيب - قياس تشابه سجل مطابق لسلسلة الاستعلام

نصائح أخرى

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

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

وأيضا من هذه الإجابة SO:

هناك بعض المزايا للبحث عن النص الكامل.

الفهرسة:

شيء مثل:

WHERE Foo LIKE '%Bar';

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

الجذعية:

البحث عن النص الكامل يمكن أن يوقف الكلمات.إذا كنت تبحث عن تشغيل، يمكنك الحصول على نتائج لـ "تشغيل" أو "تشغيل".تحتوي معظم محركات النص الكامل على قواميس في مجموعة متنوعة من اللغات.

النتائج المرجحة:

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

سلبيات:

من المحتمل أن يكون فهرس النص الكامل ضخمًا، أكبر بعدة مرات من فهرس B-TREE القياسي.لهذا السبب، يقوم العديد من مقدمي الخدمات المستضافين الذين يقدمون مثيلات قاعدة البيانات بتعطيل هذه الميزة، أو على الأقل فرض رسوم إضافية عليها.على سبيل المثال، آخر مرة قمت فيها بالتحقق، كان Windows Azure لا يدعم استعلامات النص الكامل.

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

ومثل يستخدم البدل فقط، وليس كل ما قوية.

والنص الكامل يسمح بكثير البحث أكثر تعقيدا، بما في ذلك و، أو، لا، حتى نتائج مماثلة السبر (SOUNDEX) والعديد من البنود.

وأود أن تبدأ في النظر في SQL يحتوي على () FREETEXT () والبنود بحث النص الكامل ذات الصلة للمساعدة في الحصول على فهم أفضل ما هو متاح.

الفرق الحقيقي هو منهجيات المسح.بالنسبة للبحث عن النص الكامل، يتم استخدام الكلمات (المصطلحات) كمفاتيح تجزئة - يرتبط كل منها بمجموعة من المستندات التي تظهر فيها المفاتيح (المصطلحات).انها مثل هذا:

Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}

الآن يمكن تمثيل مصفوفة مستند المصطلح (أي عضو في أي مستند) على النحو التالي:

t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}

عندما يأتي الطلب يسأل عن "أحضر لي جميع المستندات التي تحتوي على الكلمة/المصطلح t1" - ثم مجموعة المستندات {d1, d5, d9,.. dn} يتم إرجاع.

يمكنك اختراق مخطط جدول غير مطابق لتخزين المستندات - سيتم اعتبار كل صف في جدول MySQL بمثابة "مستند" ويمكن أن يحتوي عمود TEXT على فقرة وما إلى ذلك.سيحتوي الفهرس المقلوب على المصطلحات كمفاتيح التجزئة ومعرفات الصفوف كمعرفات المستند.

تذكر أن استعلام SQL هذا سيكون له أداء O(1) أكثر أو أقل.سيكون الاستعلام مستقلاً عن

  1. عدد الكلمات/المصطلحات في عمود TEXT
  2. عدد الصفوف/المستندات المطابقة للمعايير
  3. طول الكلمات/المصطلحات

على سبيل المثال، يمكن تشغيل SQL هذا لاستخراج جميع الصفوف المطابقة للكلمة المحددة XYZ:

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

تنبيه قضائي:إذا قمت بإضافة ORDER BY إلى هذا الاستعلام، فستختلف أوقات التشغيل الخاصة بك بناءً على العديد من المعلمات، أحدها هو عدد الصفوف/المستندات المطابقة.و لذلك احذر.

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

وFTS هو أكثر كفاءة وقوية (وخاصة لبرنامج Word كسارات وظائف النابعة)  ... ولكن تحقق الاحتياجات الخاصة بك لأن في بعض الأحيان بالواجبات لا تدعم جميع اللغات على سبيل المثال MSSQL لا يدعم اليونانية (الاختيار على هذه الصفحة <لأ href = "http://msdn.microsoft.com/en-us/library/ ms176076٪ 28V = sql.110٪ 29.aspx "يختلط =" نوفولو "> http://msdn.microsoft.com/en-us/library/ms176076 (ت = sql.110) .aspx اتصال )

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top