2008-10-13 30 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