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的每个实例,查询仍然可以正常工作.
| 归档时间: |
|
| 查看次数: |
4991 次 |
| 最近记录: |