10

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

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 列在结果中具有更高的权重(Name、Keywords 和 Location 是全文索引的)。目前,如果在三列中的任何一列中找到结果,则排名不受影响。

例如,我希望名称为“Chilly Chicken”的行比关键字“Chilly Chicken”的行具有更高的排名,但要使用另一个名称。

编辑:

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

如果我误解了 CONTAINS/CONTAINSTABLE 的工作原理,我深表歉意。

4

1 回答 1

7

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

等级是 sql server 内部的,不是您可以调整的。

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

下面是一些 sql 示例
:--推荐使用 start change tracking 和 start background updateindex (see books online)

    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]

按列位置排序,排名 DESC

在生产环境中,我会将查询的输出插入到表变量中,以在返回结果之前执行任何其他操作(在这种情况下可能没有必要)。此外,避免使用 *,只需列出您真正需要的列。

编辑:使用 ContainsTable 是对的,您必须将关键字修改为“chilly*”和“chicken*”,我使用对输入短语进行标记的过程来执行此操作。如果您不想这样做,只需将上面的每个 ContainsTable 实例替换为 FreeTextTable,查询仍将正常工作。

于 2008-10-13T21:23:35.193 回答