باستخدام بحث نص كامل في SQL Server 2008 عبر العديد من الجداول والأعمدة

StackOverflow https://stackoverflow.com/questions/403630

سؤال

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

السبب أنا خيار من أجل البحث عن نص كامل:1.أن تكون قادرة على البحث معلمة الكلمات بسهولة (مقهى) 2.أن تكون قادرة على رتبة وفقا كلمة القرب ، إلخ.3."هل يعني XXX ؟" وظائف

هنا وهمية بنية الجدول لتوضيح التحدي:

الجدول الكتاب
BookID
Name (Full-text indexed)
Notes (Full-text indexed)

الجدول الرف
ShelfID
BookID

الجدول ShelfAuthor
AuthorID
ShelfID

الجدول الكاتب
AuthorID
Name (Full-text indexed)

كنت بحاجة إلى البحث عبر الكتاب اسم الكتاب ملاحظات اسم المؤلف.

أنا أعرف اثنين من طرق لتحقيق ذلك:

  1. باستخدام النص الكامل عرض مفهرسة: هذا يمكن أن يكون بلدي الأسلوب المفضل, ولكن لا أستطيع أن أفعل هذا لأن الرأي أن يكون النص الكامل فهرستها ، فإنه يحتاج إلى أن schemabound ، وليس لديهم أي صلات خارجية ، فهرس فريد.ترى سوف تحتاج إلى الحصول على البيانات الخاصة بي لا يلبي هذه القيود (أنه يحتوي على العديد من غيرها من الجداول أنا بحاجة للحصول على البيانات من).

  2. باستخدام ينضم في إجراء مخزن:المشكلة مع هذا النهج هو أن كنت بحاجة إلى الحصول على نتائج فرز حسب الرتبة.إذا أنا على صنع متعددة ينضم عبر جداول SQL Server لن البحث عبر العديد من المجالات بشكل افتراضي.لا يمكن الجمع بين اثنين الفردية يحتوي على الاستفسارات على اثنين من الجداول المرتبطة ، ولكن لا أعرف طريقة استخراج جنبا إلى جنب رتبة من استعلامات البحث.على سبيل المثال, إذا كنت تبحث عن 'آرثر', نتائج كلا الكتاب الاستعلام المؤلف الاستعلام يجب أن تؤخذ بعين الاعتبار ، المرجحة وفقا لذلك.

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

المحلول

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

SELECT b.Name, a.Name, bkt.[Rank] + akt.[Rank]/2 AS [Rank]
FROM Book b
INNER JOIN Author a ON b.AuthorID = a.AuthorID
INNER JOIN FREETEXTTABLE(Book, Name, @criteria) bkt ON b.ContentID = bkt.[Key] 
LEFT JOIN FREETEXTTABLE(Author, Name, @criteria) akt ON a.AuthorID = akt.[Key]
ORDER BY [Rank] DESC

علما بأنني مبسطة المخطط على سبيل المثال.

نصائح أخرى

كان لدي نفس المشكلة كما كنت ولكن في الواقع تشارك 10 الجداول (أ المستخدمين الجدول والعديد من الآخرين للحصول على المعلومات)

قمت أول الاستعلام باستخدام FREETEXT في جملة WHERE لكل جدول ولكن الاستعلام كانت تأخذ وقتا طويلا جدا.

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

أنا ثابت باستخدام مزيج من FREETEXTTABLE و الاتحاد يختار:

SELECT Users.* FROM Users INNER JOIN
(SELECT Users.UserId FROM Users INNER JOIN FREETEXTTABLE(Users, (column1, column2), @variableWithSearchTerm) UsersFT ON Users.UserId = UsersFT.key
UNION
SELECT Table1.UserId FROM Table1 INNER JOIN FREETEXTTABLE(Table1, TextColumn, @variableWithSearchTerm) Table1FT ON Table1.UserId = Table1FT.key
UNION
SELECT Table2.UserId FROM Table2 INNER JOIN FREETEXTTABLE(Table2, TextColumn, @variableWithSearchTerm) Table2FT ON Table2.UserId = Table2FT.key
... --same for all tables
) fts ON Users.UserId = fts.UserId

تبين أن هذا الأمر بشكل أسرع بكثير.

وآمل أن يساعد.

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

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

FWIW, في حالة مماثلة لدينا DBA خلق DML يؤدي إلى الحفاظ على تخصيص النص الكامل البحث الجدول.لم يكن من الممكن استخدام تتحقق الرأي بسبب العديد من القيود.

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

Select SearchResults.key, SearchResults.rank From FREETEXTTABLE(myColumn, *, @searchString) as SearchResults Order By SearchResults.rank Desc

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

ثم إنشاء النص الكامل مؤشر على أن عمود و الاستعلام هذا العمود.

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

SELECT 
    FT_TBL.[EANHotelID]                 AS HotelID, 
    ISNULL(FT_TBL.[Name],'-')           AS HotelName,
    ISNULL(FT_TBL.[Address1],'-')       AS HotelAddress,
    ISNULL(FT_TBL.[City],'-')           AS HotelCity,
    ISNULL(FT_TBL.[StateProvince],'-')  AS HotelCountyState,
    ISNULL(FT_TBL.[PostalCode],'-')     AS HotelPostZipCode,
    ISNULL(FT_TBL.[Latitude],0.00)      AS HotelLatitude,
    ISNULL(FT_TBL.[Longitude],0.00)     AS HotelLongitude,
    ISNULL(FT_TBL.[CheckInTime],'-')    AS HotelCheckinTime,
    ISNULL(FT_TBL.[CheckOutTime],'-')   AS HotelCheckOutTime,
    ISNULL(b.[CountryName],'-')         AS HotelCountry,
    ISNULL(c.PropertyDescription,'-')   AS HotelDescription,
    KEY_TBL.RANK 

    FROM [EAN].[dbo].[tblactivepropertylist] AS FT_TBL INNER JOIN
     CONTAINSTABLE ([EAN].[dbo].[tblEanFullTextSearch], FullTextSearchColumn, @s)
      AS KEY_TBL
    ON FT_TBL.EANHotelID = KEY_TBL.[KEY]
    INNER JOIN [EAN].[dbo].[tblCountrylist] b
    ON FT_TBL.Country = b.CountryCode
    INNER JOIN [EAN].[dbo].[tblPropertyDescriptionList] c
    ON FT_TBL.[EANHotelID] = c.EANHotelID

في الكود أعلاه [EAN].[dbo].[tblEanFullTextSearch], FullTextSearchColumn هو الجدول الجديد عمود مع إضافة حقول, يمكنك الآن القيام استعلام على الجدول الجديد مع ينضم إلى الجدول الذي تريد عرض البيانات من.

ويساعد هذا الأمل

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