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

Don*_*mas 9 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
Run Code Online (Sandbox Code Playgroud)

现在,我希望Name列在结果中具有更高的权重(Name,Keywords和Location是全文索引的).目前,如果在三列中的任何一列中找到结果,则排名不受影响.

例如,我想要一个名为"Chilly Chicken"的行,其排名高于关键词"Chilly Chicken",但另一个名称.

编辑:

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

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

小智 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的每个实例,查询仍然可以正常工作.