SQL Server 2008中的FREETEXT查询不是短语匹配

时间:2010-12-16 16:18:39

标签: sql sql-server-2008 freetext

我在SQL Server 2008中有一个全文索引表,我试图使用FULLTEXT查询完全匹配的短语。我不相信使用CONTAINS或LIKE是合适的,因为在其他情况下查询可能不准确(用户不会用双引号括起来)并且通常我想要FREETEXT的灵活性。

根据FREETEXT的documentation [MSDN]:

  

如果freetext_string包含在双引号中,则执行短语匹配;词干和词库没有被执行。

这会让我相信这样的查询:

SELECT Description  
FROM Projects   
WHERE FREETEXT(Description, '"City Hall"')  

只返回“City Hall”一词出现在Description字段中的结果,但我得到的结果如下:

  

1 Manning Hall的障碍坡道设计   2天线调查。客户:克兰斯顿市工程部   3关于国际网球名人堂火灾损害的结构调查   4对先驱大厅拟议卫星设计的调查屋顶调查   ......等等。

显然,这些结果至少包括我的短语中的一个词,而不是短语本身。更糟糕的是,我原本以为结果会被排名,但我实际想要的两个结果(因为它们包括实际的短语)都被埋没了。

SELECT Description  
FROM Projects  
WHERE Description LIKE '%City Hall%'  
  

1马萨诸塞州昆西现有市政厅的主要外部和内部装修   2 Pawtucket市政厅大楼的粗略结构调查受到泄漏的困扰。

我确信这是我不理解文档的情况,但有没有办法实现我正在寻找的东西?也就是说,为了能够传入一个没有引号的搜索字符串并准确获取我现在获得的内容或者使用引号获得的内容并且只获得那个确切的短语?

1 个答案:

答案 0 :(得分:4)

如你所说,FREETEXT会查找您词组中的每个单词,而不是短语作为全部。为此,您需要使用CONTAINS语句。像这样:

SELECT Description  
FROM Projects   
WHERE CONTAINS(Description, '"City Hall"')

如果您想获得结果的排名,则必须使用CONTAINSTABLE。它的工作方式大致相同,但它返回一个包含两列的表:[Key]包含搜索表的主键和[Rank],它为您提供结果的排名。