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

Sql server 如何为全文搜索中的不同列指定权重?,sql-server,full-text-search,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 现在,我希望Name

在全文搜索查询中,我希望为特定列分配更高的权重。考虑这个查询:

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
现在,我希望Name列在结果中具有更高的权重,名称、关键字和位置都是全文索引的。目前,如果在三列中的任何一列中找到结果,则列组不受影响

例如,我希望名为Chilly Chicken的行比名为Chilly Chicken但另一个名称的行具有更高的排名

编辑:

我并不急于使用ContainsTable,因为这意味着要将短语Chilly和Chicken等分开,这将需要我搜索所有可能的组合-Chilly和Chicken、Chilly或Chicken等。我希望FTS引擎能够自动找出最匹配的结果,我认为FREETEXT这样做很好


如果我误解了CONTAINS/CONTAINSTABLE的工作原理,请道歉

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

排名是sql server内部的,您无法调整

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

下面是一些sql示例: -建议使用start change tracking和start background 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是对的,你必须将关键字修改为“chilly*和chicken*”,我使用一个标记输入短语的过程来实现这一点。如果您不想这样做,只需用FreeTextTable替换上面ContainsTable的每个实例,查询仍然可以正常工作。

我想知道使用UNION是否可行,但我的大脑无法处理所涉及的SQL!:我认为这两个都是很好的解决方案,其中一个可能会解决这个问题!让我查一查,然后给你回电话。然而,我不明白你为什么提到额外的操作?戴夫,这个解决方案很有效。问题是,select返回重复的结果。我想最好的选择是存储到一个表变量中,正如您所建议的那样?select将返回重复项,使用表变量,然后选择distinct。返回重复项是因为每个select中的ColumnLocation和Rank值不同,因此sql在按联合联接时不会将它们视为重复项。在多个联接上进行联合有什么好处吗?