2013-04-16 50 views
0

我在SQL Server數據庫上使用全文搜索來返回多個表的結果。最簡單的情況是搜索人名字段和描述字段。我用它來做到這一點的代碼如下所示:全文搜索多個列的分數

select t.ProjectID as ProjectID, sum(t.rnk) as weightRank 
from 
(
select KEY_TBL.RANK * 1.0 as rnk, FT_TBL.ProjectID as ProjectID 
FROM Projects as FT_TBL 
INNER JOIN FREETEXTTABLE(Projects, Description, @SearchText) AS KEY_TBL 
    ON FT_TBL.ProjectID=KEY_TBL.[KEY] 

    union all 

select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID 
FROM Projects as FT_TBL 
... <-- complex unimportant join 
    INNER JOIN People as p on pp.PersonID = p.PersonID 
INNER JOIN FREETEXTTABLE(People, (FirstName, LastName), @SearchText) AS KEY_TBL 
    ON p.PersonID=KEY_TBL.[KEY] 
) 
group by ProjectID 

由於是(希望)清除上面,我想很大程度上體重對一個人的名字超過在項目描述字段匹配匹配。如果我搜索「約翰」這樣的東西,那麼所有名爲約翰的人的項目都會被加權(如預期的那樣)。我遇到的問題是有人提供像'約翰史密斯'這樣的全名的搜索。在這種情況下,名稱上的匹配強度要低得多(我認爲)只有一半搜索條件在每個firstname/lastname列中匹配。在許多情況下,這意味着與輸入名稱完全匹配的人不一定會在搜索結果頂部附近返回。

我已經能夠通過單獨搜索每個firstname/lastname領域,增加他們的成績一起,所以我的新的查詢看起來更正此類似:

select t.ProjectID as ProjectID, sum(t.rnk) as weightRank 
from 
(
select KEY_TBL.RANK * 1.0 as rnk, FT_TBL.ProjectID as ProjectID 
FROM Projects as FT_TBL 
INNER JOIN FREETEXTTABLE(Projects, Description, @SearchText) AS KEY_TBL 
    ON FT_TBL.ProjectID=KEY_TBL.[KEY] 

    union all 

select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID 
FROM Projects as FT_TBL 
... <-- complex unimportant join 
    INNER JOIN People as p on pp.PersonID = p.PersonID 
INNER JOIN FREETEXTTABLE(People, (FirstName), @SearchText) AS KEY_TBL 
    ON p.PersonID=KEY_TBL.[KEY] 

    union all 

select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID 
FROM Projects as FT_TBL 
... <-- complex unimportant join 
    INNER JOIN People as p on pp.PersonID = p.PersonID 
INNER JOIN FREETEXTTABLE(People, (LastName), @SearchText) AS KEY_TBL 
    ON p.PersonID=KEY_TBL.[KEY] 
) 
group by ProjectID 

我的問題:

是這個我應該採取的方法,或者有什麼辦法讓全文搜索在列表上進行操作,就好像它是一個文本塊:即將firstnamelastname列作爲單個name列處理,從而得到更高的評分匹配str包括人名和姓氏在內?

回答

1

我最近遇到了這個問題,並使用計算列將所需的列連接在一起成爲一個字符串,然後在該列上具有全文索引。

我已經通過複製計算列中的加權字段來實現加權。

即,姓氏出現3次並且名字出現一次。

​​

你必須確保你使用持久關鍵字,這樣計算各列的心不是閱讀。

+0

忘了對此置評。我採取了一種稍微不同的方法來解決這個問題,並將在未來更新我的問題 - 但這對我也很好。謝謝! – Matthew

+0

我在使用單獨列時發現的問題之一是,爲每列生成的排名不是基於相同的數字。對於相同或類似的搜索,它們可能完全不同。一列可能有700到800之間的等級,另一列有10到20之間的等級,可以運行存儲過程來調查生成的排名。 – ScottG

+0

感謝您的反饋 - 我已經忘記了這一點。 – Matthew