Install-Package SoftCircuits.FullTextSearchQuery
FullTexTsearchQuery هي مكتبة .NET فئة تقوم بتحويل مصطلح بحث سهل الاستخدام إلى استعلام صحيح في خادم Microsoft SQL Server. يحاول الكود اكتشاف ومعالجة جميع الحالات التي سيؤدي فيها الاستعلام إلى إنشاء خادم SQL لإنشاء خطأ.
يوفر Microsoft SQL Server ميزة البحث الكامل للنص. ومع ذلك ، فإن بناء الجملة خفي إلى حد ما ، وخاصة لغير المبرمجين. علاوة على ذلك ، هناك العديد من الشروط التي يمكن أن تسبب SQL Server لتلقي خطأ إذا لم تكن الأمور صحيحة تمامًا.
يقوم FullTextSearchQuery بتحويل مصطلح بحث سهل الاستخدام ، يشبه Google إلى شرط SQL SQL Full Text المقابل. هدفها هو عدم رمي الاستثناءات على المدخلات التي تم تشكيلها بشكل سيء. إنه ببساطة يبني أفضل استعلام صحيح يمكنه من المدخلات.
توضح القائمة التالية كيف يتم تحويل المدخلات المختلفة.
| مدخل | الإخراج | وصف |
|---|---|---|
| ABC | FORMSOF(INFLECTIONAL, abc) | العثور على أشكال انتقائية من ABC. |
| ~ ABC | FORMSOF(THESAURUS, abc) | العثور على اختلافات thesaurus من ABC. |
| "ABC" | "abc" | العثور على مصطلح دقيق ABC. |
| +ABC | "abc" | العثور على مصطلح دقيق ABC. |
| "ABC" بالقرب من "def" | "abc" NEAR "def" | أوجد مصطلح ABC الدقيق بالقرب من المصطلح الدقيق. |
| ABC* | "abc*" | يجد الكلمات التي تبدأ مع ABC. |
| -abc def | FORMSOF(INFLECTIONAL, def) AND NOT FORMSOF(INFLECTIONAL, abc) | العثور على أشكال انتقامية من DEF ولكن ليس أشكال انتقائية من ABC. |
| ABC DEF | FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) | العثور على أشكال انتقائية لكل من ABC و DEF. |
| ABC أو DEF | FORMSOF(INFLECTIONAL, abc) OR FORMSOF(INFLECTIONAL, def) | العثور على أشكال انتقامية إما ABC أو DEF. |
| < +abc +def> | "abc" NEAR "def" | أوجد مصطلح ABC الدقيق بالقرب من المصطلح الدقيق. |
| ABC و (DEF أو GHI) | FORMSOF(INFLECTIONAL, abc) AND (FORMSOF(INFLECTIONAL, def) OR FORMSOF(INFLECTIONAL, ghi)) | ابحث عن أشكال انتقامية لكل من ABC و DEF أو GHI. |
حتى بعد إنشاء الاستعلام الصحيح النحوي ، لا يزال بإمكان SQL Server إنشاء خطأ لبعض الاستعلامات. على سبيل المثال ، في الجدول أعلاه ، يمكنك أن ترى أن OUPUT لـ -abc def تبادل التعبيرات الفرعية. وذلك لأن NOT FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) سوف يتسبب في خطأ. SQL Server لا يحب NOT في البداية. في هذا المثال ، ستقوم FullTextSearchQuery بتبادل التعبيرات الفرعية (على جانبي AND ).
بعد إنشاء استعلام ، سوف تحقق FullTextSearchQuery هذا والعديد من شروط الخطأ الأخرى وجعل التصحيحات حسب الضرورة. يصف الجدول التالي هذه الشروط.
| شرط | اتخاذ إجراء |
|---|---|
| ليس Term1 و Term2 | تبديل التعبيرات الفرعية. |
| ليس TERM1 | تم التخلص من التعبير. |
| ليس Term1 وليس Term2 | تم التخلص من التعبير إذا تم تجميع العقدة (أقواس) أو هي عقدة الجذر ؛ خلاف ذلك ، قد تحتوي العقدة الأصل على تعبير فرعي آخر من شأنه أن يجعل هذا الأمر صالحًا. |
| Term1 أو لا Term2 | تم التخلص من التعبير. |
| Term1 بالقرب من Not Term2 | بالقرب من التزامن تغير إلى و. |
يحول FullTextSearchQuery جميع الاقتران القريب إلى وعندما لا يكون التعبير الفرعي عبارة عن internalnode مع Formmorm.Literal.
استخدم طريقة Transform() لتحويل تعبير بحث إلى شرط البحث الكامل للنص SQL Server. تأخذ هذه الطريقة استعلام بحث سهل الاستخدام وتحويله إلى حالة بحث كاملة عن النص تم تمريرها بشكل صحيح والتي يمكن تمريرها إلى SQL Server أو CONTAINS CONTAINSTABLE وظائف. إذا كان الاستعلام يحتوي على شروط غير صالحة ، فسيقوم الرمز بما في وسعه لإرجاع حالة بحث صالحة. إذا لم يتم العثور على مصطلحات صالحة ، فإن هذه الطريقة تُرجع سلسلة فارغة.
// Pass true to add the standard stop words
FtsQuery ftsQuery = new FtsQuery ( true ) ;
string searchTerm = ftsQuery . Transform ( text ) ; في مثال استعلام SQL التالي ، @SearchTerm هو إشارة إلى السلسلة التي تم إرجاعها من Transform() .
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, @SearchTerm) AS KEY_TBL
ON FT_TBL . unique_key_column = KEY_TBL.[KEY];شيء واحد يجب أن تكون على دراية به هو التعامل مع SQL Server مع الكلمات المتوقفة. توقف الكلمات هي كلمات مثل A ، و . لا يتم تضمين هذه الكلمات في فهرس النص الكامل. لا يقوم SQL Server بفهرسة هذه الكلمات لأنها شائعة جدًا ولا تضيف إلى جودة البحث. نظرًا لعدم فهرسة هذه الكلمات ، لن يجد SQL Server أبدًا تطابقًا لهذه الكلمات. والنتيجة هي أن البحث عن كلمة توقف لن يعيد أي نتائج ، على الرغم من أن كلمة التوقف قد تظهر في مقالات!
يبدو أن أفضل طريقة للتعامل مع هذا هي استبعاد هذه الكلمات من استعلام SQL. يتيح لك البحث الكامل السهل القيام بذلك عن طريق إضافة كلمات إيقاف إلى خاصية مجموعة StopWords . لن يتم تضمين كلمات الإيقاف في الاستعلام الناتج ما لم يتم نقلها ، وبالتالي منع كلمات التوقف في الاستعلام من منع جميع النتائج.
أسهل طريقة لإضافة قائمة قياسية من الكلمات الإيقاف إلى مجموعة StopWords هي true إلى مُنشئ FtsQuery . (لمعرفة الكلمات التي تمت إضافتها ، يمكنك ببساطة فحص مجموعة StopWords .) يمكنك تعديل مجموعة StopWords في أي وقت ، حسب الحاجة.
بدلاً من ذلك ، يوفر SQL Server خيارًا لمنع المشكلة الموضحة أعلاه. يمكن استخدام خيار Transform Noise Words لتمكين SQL Server من إرجاع المطابقات حتى عندما يحتوي الاستعلام على كلمة توقف (كلمة ضوضاء). اضبط هذا الخيار على 1 لتمكين تحويل كلمة الضوضاء. راجع خيار تكوين خادم تحويلات الضوضاء لمزيد من المعلومات.
يمكن استخدام الاستعلام التالي للحصول على كلمات إيقاف النظام من قاعدة بيانات SQL Server.
SELECT ssw . stopword , slg . name
FROM sys . fulltext_system_stopwords ssw
JOIN sys . fulltext_languages slg
ON slg . lcid = ssw . language_id
WHERE slg . lcid = 1033لمزيد من المعلومات ومناقشة الرمز ، يرجى الاطلاع على استعلامات البحث عن النص الكامل.