【问题标题】:FREETEXT queries in SQL Server 2008 not phrase matchingSQL Server 2008 中的 FREETEXT 查询不是短语匹配
【发布时间】:2011-05-26 15:51:10
【问题描述】:

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

根据documentation[MSDN] for FREETEXT:

如果 freetext_string 用双引号括起来,则改为执行短语匹配;不执行词干提取和词库。

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

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

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

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

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

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

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

我确定这是我不理解文档的情况,但有没有办法实现我正在寻找的东西?即,能够在不带引号的情况下传递搜索字符串并获得我现在得到的确切内容,或者使用引号并只获得那个确切的短语?

【问题讨论】:

标签: sql sql-server-2008 freetext


【解决方案1】:

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

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

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

【讨论】:

  • 所以您是说当文档说“改为执行短语匹配”时,这并不意味着(由于缺乏更好的术语)确切的短语匹配?我想我只是觉得那是误导。基本上没有办法得到我想要的,我需要解析搜索词并将引用的部分提交为 CONTAINS 查询和非引用使用 FREETEXT?
  • 您可以使用包含或不包含引用文本的 CONTAINS,没有它们它的行为类似于 FREETEXT。不同之处在于,使用 FREETEXT 时,它会找到单词的派生词,而不仅仅是确切的单词。
猜你喜欢
  • 1970-01-01
  • 2011-10-15
  • 2021-10-16
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多