سؤال

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

حاليًا يمكن للمستخدم إدخال حقل اسم يبحث في 3 أعمدة varchar مختلفة.الأول والأخير والأسماء الوسطى

لنفترض أن لدي 3 صفوف تحتوي على المعلومات التالية.

1 - فيليب - ي - فراي

2 - إيمي - نول - وونغ

3 - ليو - نول - وونغ

إذا أدخل المستخدم اسمًا مثل "Fry"، فسوف يُرجع الصف 1.ولكن إذا دخلوا إلى فيليب فراي أو الأب أو فيل فلن يحصلوا على شيء..وأنا لا أفهم لماذا يفعل هذا.إذا بحثوا عن Wong، فسيحصلون على الصفين 2 و3. وإذا بحثوا عن Amy Wong، فلن يحصلوا على شيء مرة أخرى.

يستخدم الاستعلام حاليًا CONTAINSTABLE ولكني قمت بتبديل ذلك باستخدام FREETEXTTABLE وCONTAINS وFreeTEXT دون أي اختلافات ملحوظة في النتائج.تُفضل طرق الجدول لأنها تُرجع نفس النتائج ولكن مع الترتيب.

هنا هو الاستعلام.

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)
SET @SearchString = '"'+@Name+'"'
SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

أيه أفكار...؟لماذا لا يعمل هذا البحث عن النص الكامل بشكل صحيح؟

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

المحلول 3

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

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)

--Added this line
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*')
SET @SearchString = '"*'+@SearchString+'*"'

SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

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

شكرا للمساعدة.

نصائح أخرى

يجب أن يعمل FreeTextTable.

INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

يجب أن يحتوي @SearchString على قيم مثل "Phillip Fry" (سلسلة طويلة تحتوي على كافة سلاسل البحث مفصولة بمسافات).

إذا كنت تريد البحث عن Fr أو Phil، عليك استخدام النجمة:فيل* والأب*

يبحث "Phil" عن كلمة "Phil" بالضبط.يبحث "Phil*" عن كل كلمة تبدأ بـ "Phil"

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

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

Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%'
or MiddleName like @searchterm1 + '%'
or LastName like @searchterm1 + '%'
or Firstname like @searchterm2 + '%'
etc....

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

بمعنى آخر، قم بإنشاء طريقة عرض لبياناتك والتي تحول جميع الحقول المقسمة مثل اسم العائلة إلى حقول متسلسلة، أي.الاسم الكامل

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

قد ترغب في التحقق من ذلك لوسين.نت كبديل للنص الكامل.

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