如何在全文搜索中为不同列指定权重?

时间:2008-10-13 16:17:17

标签: sql-server full-text-search

在我的全文搜索查询中,我想为特定列分配更高的权重。请考虑以下问题:

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”的行,其排名高于关键词“Chilly Chicken”,但另一个名称。

编辑:

我并不急于使用ContainsTable,因为这意味着将短语(Chilly AND Chicken等)分开,这将涉及我必须搜索所有可能的组合 - Chilly AND Chicken,Chilly OR Chicken等.I我希望FTS引擎能够自动找出最匹配的结果,我认为FREETEXT可以通过这种方式做得很好。

如果我误解了CONTAINS / CONTAINSTABLE是如何工作的,请道歉。

1 个答案:

答案 0 :(得分:7)

最好的解决方案是使用ContainsTable。使用union创建一个查询所有3列的查询,并添加一个整数,用于指示搜索的列。按该整数对结果进行排序,然后对desc进行排名。

排名是sql server的内部,而不是你可以调整的。

您还可以通过将等级除以整数来操纵返回的等级(名称将除以1,关键字和位置除以2或更高)。这会导致出现不同的排名。

这是sql的一些例子: - 建议使用开始更改跟踪并启动后台更新索引(参见在线书籍)

    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实例,查询仍然可以正常工作。