SQL Server 2008中FREETEXT查询无法进行短语匹配

4
我有一个在SQL Server 2008中全文索引的表格,我试图使用FULLTEXT查询确切的短语匹配。 我认为使用CONTAINS或LIKE不合适,因为在其他情况下查询可能不是精确的(用户没有用双引号包围短语),而且一般我想要FREETEXT的灵活性。
根据FREETEXT的文档[MSDN]所述:
如果freetext_string用双引号括起来,则执行短语匹配;不执行词干分析和同义词。
这会让我相信像这样的查询:
SELECT Description  
FROM Projects   
WHERE FREETEXT(Description, '"City Hall"')  

我希望的结果是只返回“市政厅”一词出现在描述字段中的结果,但实际上结果如下所示:
1. Manning Hall无障碍坡道设计。 2. 天线调查。客户:克兰斯顿市工程部。 3. 国际网球名人堂火灾损坏的结构调查。 4. Herald Hall卫星设计建议的屋顶调查。 ......等等。
显然,这些结果至少包含我短语中的一个单词,但不包括短语本身。更糟糕的是,我原以为结果会排名,但我真正想要的两个结果(因为它们包含实际短语)被埋没了。
SELECT Description  
FROM Projects  
WHERE Description LIKE '%City Hall%'  

1 对马萨诸塞州昆西市政厅进行重大的外部和内部翻新。
2 对受泄漏困扰的波塔基特市政厅塔楼进行简要结构调查。

我相信这是我没有理解文档的原因,但是否有一种方法可以实现我想要的功能?也就是说,能够传递一个没有引号的搜索字符串,并获得与现在完全相同的结果或者使用引号并仅获取确切的短语?


1
我知道这已经是老问题了,但我遇到了同样的问题,并刚刚发现了这个错误报告:SQL Server 2008 R2中的FREETEXT不再按照“短语搜索”的文档进行工作 - bfavaretto
1个回答

4

正如您所说,FREETEXT会查找短语中的每个单词,而不是整个短语。如果要查找整个短语,需要使用CONTAINS语句。代码如下:

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

如果您想获得结果的排名,您需要使用CONTAINSTABLE。它的工作方式大致相同,但是它返回一个包含两列的表:[Key] 包含搜索表的主键,[Rank] 给出结果的排名。


1
所以您的意思是当文档说“相似短语匹配”时,并不意味着(缺乏更好的术语)确切的短语被匹配?我想我只是觉得这样会产生误导。基本上,没有办法得到我想要的精确结果,我需要解析搜索词并提交带引号的片段作为CONTAINS查询,而不带引号的则使用FREETEXT? - MKing
你可以使用CONTAINS带引号或不带引号的文本,不带引号时它的行为类似于FREETEXT。区别在于,FREETEXT会找到单词的派生形式,而不仅仅是确切的单词。 - Lamak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接