2009-10-12 94 views
0

我被要求蒐集一個我們的數據庫。正在搜索SQL Server

條件是用戶鍵入到搜索框中,然後SQL需要分割搜索中的所有單詞並在多個字段(可能是2或3)中搜索它們中的每一個,然後需要對結果進行加權例如,出現所有單詞的結果將成爲最高結果,如果只出現1個單詞,則它將被加權得更低。

例如,如果你搜索「這是一個演示後」

結果將被排在這樣

Rank Field1     Field2 
1:  "This is a demo post" "" 
2:  "demo post"   "" 
3:  "demo"     "post" 
4:  "post"     "" 

希望這是某種形式的意義,它的實物基礎谷歌一樣的搜索。

無論如何,我可以想到做到這一點非常混亂。

任何建議將是偉大的。

回答

0

我結束了在表上創建全文索引,並加入我的搜索結果FREETEXTTABLE,讓我看到每個結果

的排名值

的SQL結束了看起來像這樣

SELECT 
    Msgs.RecordId, 
    Msgs.Title, 
    Msgs.Body 
FROM 
    [Messages] AS Msgs 
    INNER JOIN FREETEXTTABLE([Messages],Title,@SearchText) AS TitleRanks ON Msgs.RecordId = TitleRanks.[Key]   
ORDER BY 
    TitleRanks.[Key] DESC 

我使用全文索引過去,但從來沒有意識到,你可以使用FullTextTable這樣,是非常深刻的印象是多麼容易的代碼,以及如何它運作良好。

+0

您可能需要考慮按照TitleRanks.Rank進行排序,這是隱含列(範圍從0到100),表示每行與搜索條件匹配的程度。 – JonoW

+0

抱歉應該是TitleRanks.Rank DESC(100是最相關的,至少0) – JonoW

0

從邏輯上講,你可以很容易地做到這一點,雖然它可能很難優化 - 特別是如果有人使用特別長的短語。

下面是基於表我不得不手工一個基本的例子...

SELECT TOP 100 Score, Forename FROM 
(
    SELECT 
     CASE 
      WHEN Forename LIKE '%Kerry James%' THEN 100 
      WHEN Forename LIKE '%Kerry%' AND Forename LIKE '%James%' THEN 75 
      WHEN Forename LIKE '%Kerry%' THEN 50 
      WHEN Forename LIKE '%James%' THEN 50 
     END AS Score, 
     Forename 
    FROM 
     tblPerson 
) [Query] 
WHERE 
    Score > 0 
ORDER BY 
    Score DESC 

在這個例子中,我是說完全匹配的是價值100,與之匹配的兩個方面(但不一起)的價值是75,而且一個單詞的匹配值爲50.您可以根據自己的意願將其設置爲複雜,甚至包括SOUNDEX匹配 - 但這是一個簡單的例子,可以指導您朝正確的方向發展。