2010-12-16 61 views
3

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

按照documentation [MSDN用于FREETEXT:

如果的freetext_string被封闭在双引号,短语匹配代替执行;词干和词库不执行。

这将导致我相信这样的查询:

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

其中术语“市政厅”出现在描述字段将只返回结果,而是我得到的结果是这样的:

1曼宁厅残疾人坡道设计。
2天线调查。客户:克兰斯顿市工程部
3关于国际网球名人堂火灾损坏的结构调查。
4调查在先驱霍尔建议卫星设计的屋顶调查。
...等

显然,这些结果包括在我的那句话说的至少一个,但不是有句话本身。更糟糕的是,我曾经认为结果会被排名,但我实际需要的两个结果(因为它们包括实际的短语)被埋没了。现有的市政府为Pawtucket的市政厅大楼,由泄漏困扰的美国马萨诸塞州昆西
2走马结构调查

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

1主要外部和内部装修。

我敢肯定这是我不理解文档的情况,但有没有办法实现我在找的东西?也就是说,为了能够传递不带引号的搜索字符串,并准确地获取我现在得到的或带引号的内容,并只获取该确切短语?

+1

我知道这是旧的,但我遇到了同样的问题,只是发现这个错误报告:[SQL Server 2008 R2中的FREETEXT不再按照“短语搜索”](http://connect.microsoft.com)com/SQLServer/feedback/details/683573/freetext-in-sql-server-2008-r2-no-longer-works-as-documented-for-phrase-searching) – bfavaretto 2012-02-10 21:37:09

回答

4

正如你所说,FREETEXT查找你的短语中的每一个单词,而不是所有的短语。为此,您需要使用CONTAINS声明。就像这样:

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

如果你想要得到的结果的排名,你必须使用CONTAINSTABLE。它的工作原理大致相同,但它返回一个有两列的表:[Key]包含搜索表的主键和[Rank],它给出了结果的等级。

+1

所以你说当文档说, “短语匹配是相反的”这并不意味着(因为缺乏更好的条款)精确的短语匹配?我想我只是觉得这是误导。基本上没有办法得到我想要的东西,我需要解析searchterm,并将引用片段提交为CONTAINS查询,并且使用FREETEXT不引号? – MKing 2010-12-16 16:54:19

+0

您可以使用带有或不带引用文本的CONTAINS,没有它们的行为与FREETEXT类似。不同之处在于,如果FREETEXT找到了单词的派生词,而不仅仅是确切的单词。 – Lamak 2010-12-16 17:52:00

+0

太好了,谢谢你的帮助! – MKing 2010-12-16 17:54:11