2008-10-13 31 views
9

在我的全文搜索查詢中,我想爲特定列指定更高的權重。考慮此查詢:如何在全文搜索中將權重分配給不同的列?

SELECT Key_Table.RANK, FT_Table.* FROM Restaurants AS FT_Table 
INNER JOIN FREETEXTTABLE(Restaurants, *, 'chilly chicken') AS Key_Table 
ON FT_Table.RestaurantID = Key_Table.[KEY] 
ORDER BY Key_Table.RANK DESC 

現在,我想的名字列在結果的權重較高(姓名,關鍵詞和位置全文索引)。目前,如果結果在三列中的任何一列中找到,則排名不受影響。

例如,我想要命名爲「Chilly Chicken」的行的排名高於關鍵字「Chili Chicken」的排名,但是是另一個名字。

編輯:

我並不急於使用CONTAINSTABLE,因爲這將意味着分離短語(寒冷和雞等),這將涉及我不得不尋找所有可能的組合 - 寒冷和雞肉,寒冷或雞等我想FTS引擎自動找出哪些結果最匹配,我認爲FREETEXT這樣做很好。

道歉,如果我誤解CONTAINS/CONTAINSTABLE如何工作。

回答

7

最好的解決方案是使用ContainsTable。使用聯合來創建一個查詢,該查詢會搜索所有3列,並添加一個用於指示搜索哪個列的整數。按該整數對結果進行排序,然後對desc進行排序。

該排名是內部的SQL服務器,而不是你可以調整。

您還可以通過將整數除以整數(名稱除以1,關鍵字和位置等於或大於2)來操縱返回的等級。這將導致不同排名的出現。

下面是一些例子SQL
:使用 --Recommend開始變化的跟蹤和啓動後臺UpdateIndex中(見書在線)

 
    SELECT 1 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM Restaurants AS FT_Table 
INNER JOIN ContainsTable(Restaurant, Name, 'chilly chicken') AS Key_Table ON 
FT_Table.RestaurantId = Key_Table.[Key] 

UNION SELECT 2 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM Restaurants AS FT_Table 
INNER JOIN ContainsTable(Restaurant, Keywords, 'chilly chicken') AS Key_Table ON 
FT_Table.RestaurantId = Key_Table.[Key] 

UNION SELECT 3 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM Restaurants AS FT_Table 
INNER JOIN ContainsTable(Restaurant, Location, 'chilly chicken') AS Key_Table ON 
FT_Table.RestaurantId = Key_Table.[Key] 

ORDER BY ColumnLocation, Rank DESC 

在生產環境中,我會插入查詢的輸出到一個表變量在返回結果之前執行任何額外的操作(在這種情況下可能不需要)。另外,避免使用*,只列出你真正需要的列。

編輯:你說得對使用CONTAINSTABLE,你將不得不修改關鍵字是「‘寒冷*’與‘雞*’」,我這樣做是使用的標記化短語輸入的過程。如果你不想這樣做,只需用FreeTextTable替換上面的ContainsTable的每個實例,查詢仍然可以工作。

+1

我想知道是否有可能使用UNION的東西,但我的大腦無法處理涉及的SQL! :)我認爲這些都是很好的解決方案,其中一個可能會解決問題!讓我檢查並回復你。然而,我不明白爲什麼你提到了額外的操作? – 2008-10-14 05:38:36