2010-05-03 114 views
1

我在我的公司在一個SQL Server 2008數據庫的兩個表。第一張表格代表我公司銷售的產品。第二張表包含產品製造商的詳細信息。這些表格定義如下:SQL Server 2008中 - 全文查詢

Product 
    ------- 
    ID 
    Name 
    ManufacturerID 
    Description 

    Manufacturer 
    ------------ 
    ID 
    Name 

正如您可以想象的,我想盡可能讓客戶查詢這些數據。不過,我在編寫寬容且功能強大的搜索查詢時遇到了問題。例如,我期待人們根據拼音拼寫進行搜索。因此,數據可能與我數據庫中的確切數據不匹配。另外,我想有些人會由製造商的名稱搜索,但我想匹配的產品名稱第一次出現。基於這些要求,我目前正在對以下查詢:

select 
    p.Name as 'ProductName', 
    m.Name as 'Manufacturer', 
    r.Rank as 'Rank' 
    from 
    Product p inner join Manufacturer m on p.ManufacturerID=m.ID 
     inner join CONTAINSTABLE(Product, Name, @searchQuery) as r 

奇怪的是,這個查詢拋出一個錯誤。但是,我不知道爲什麼。 Squiggles出現在管理工作室最後一個括號的右側。工具提示說「在期望條件的上下文中指定的非布爾類型的表達式」。我明白這句話的意思。但是,我想我不知道COntainsTable如何工作。我究竟做錯了什麼?

謝謝

+0

您是否有INNER JOIN條件,您沒有粘貼? (例如AS r ON p.ID = r。[KEY]) – 2010-05-03 12:55:05

回答

2

首先我覺得你對全文CONTAINSTABLE加入時需要的「ON」的條款。從微軟的網站上看到這個例子:

USE Northwind; 
GO 
SELECT FT_TBL.Description, FT_TBL.CategoryName, KEY_TBL.RANK 
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
     '("sweet and savory" NEAR sauces) OR 
     ("sweet and savory" NEAR candies)' 
     ) AS KEY_TBL 
     ON FT_TBL.CategoryID = KEY_TBL.[KEY] 
WHERE KEY_TBL.RANK > 2 
    AND FT_TBL.CategoryName <> 'Seafood' 
ORDER BY KEY_TBL.RANK DESC; 
GO 

http://msdn.microsoft.com/en-us/library/ms177652.aspx

您需要的產品錶鏈接到正確的搜索結果中加入了加入條款是這樣的:

SELECT 
    p.Name AS 'ProductName', 
    m.Name AS 'Manufacturer', 
    r.Rank AS 'Rank' 
    FROM 
    Product p 
     INNER JOIN Manufacturer m ON p.ManufacturerID=m.ID 
     INNER JOIN CONTAINSTABLE(Product, Name, @searchQuery) AS r 
     ON p.ID = r.[KEY] 

否則你不」 t知道結果表中的哪些行會連接到源表中的相應行。

其次,除非您使用通配符(例如'"bol*"'),否則CONTAINSCONTAINSTABLE都會返回精確的字符串匹配。即使使用通配符時,你只能使用後綴通配符,所以'"bol*"'它會發現,與'bol'開始的所有單詞。 '"*bol*"'不會發現在他們'bol'話。對於一個不準確的,模糊風格的搜索,你應該使用FREETEXT(...)FREETEXTTABLE(...)

返回零個,一個或多個行含有基於字符的數據類型爲匹配的含義值的那些列的表,但沒有確切的措辭,在指定的freetext_string文本。

http://msdn.microsoft.com/en-us/library/ms177652.aspx

,這種交易是CONTAINS性能比FREETEXT好了很多,FREETEXT提供更自然的效果。

最後,如果你想從語音的SQL Server已經內置在試圖基於拼音拼寫或參數的alphanumerickey功能SOUNDEX匹配。

-- Using SOUNDEX 
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe'); 

    Copy 
----- ----- 
S530 S530 

(1 row(s) affected) 

http://msdn.microsoft.com/en-us/library/ms187384.aspx

我建議不要使用同音不過,我發現它在過去的限制,因爲探測法真的只有確保單詞發音上開始。 Soundex始終返回起始字母和數字表示的前三個輔音。這裏有更好的算法版本,可以替代soundex,參見Double Metaphone(或者您可以用作標量函數的T-SQL version of Double Metaphone)。

Soundex或DoubleMetaphone沒有內置到SQL Server Fulltext中,因此您需要手動執行搜索。

SELECT * FROM MyTable where SOUNDEX(MyColumn) = SOUNDEX('MySearchQuery') 
+0

非常感謝您的回答。這是一個如此詳細的答案,這絕對是指向正確的方向。 – user208662 2010-05-03 13:55:03