SQL Server全文搜索包含短语问题

3

我有一个关于SQL Server 2008全文搜索的问题。我有以下查询:

SELECT *
FROM cigars
WHERE CONTAINS(cigars.*, @Search )

@Search是通过存储过程传递的值。但这不是问题所在。

如果有人搜索“Punch”,那么一切正常,我会得到所有匹配的雪茄。

问题出在如果他们搜索“Punch Cigar”,我会收到以下错误信息:

全文搜索条件“Punch Cigar”附近的语法错误。

您有什么想法如何允许搜索该短语?


你必须在字符串中使用空格和双引号引用:' "Punch Cigar" ',并删除搜索字符串中的双引号。就这样!请参考@Martin Smith的答案。 - Christian4145
2个回答

4
为什么您要在 CIGAR 表中搜索所有列?其中一些列肯定不使用字符串/文本类型的数据... 请参考 CONTAINS 文档,建议使用一个函数来正确转义 FTS 搜索中的单词:
CREATE FUNCTION [dbo].[escapeFTSSearch] (
  @SearchParameter NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
  -- Declare the return variable here
  DECLARE @result NVARCHAR(MAX)

  SELECT @result = '"'+ REPLACE(REPLACE(@SearchParameter,'"',''), ' ', '" AND "') +'"'

  -- Return the result of the function
  RETURN @result

END

测试:

SELECT [example].[dbo].[escapeFTSSearch] ('Punch Cigar')

...这给了我:

"Punch" AND "Cigar"

使用方法:

WHERE CONTAINS(cigars.*, dbo.escapeFTSSearch(@Search) )

补充

这个函数相对简单:

  • 它假设你想要提供的所有单词
  • 不支持模糊搜索
  • 它假定参数值中没有双引号

根据需要进行微调。


您可能想要删除双引号并将它们替换为空格,而不是空字符串。请参阅此答案,了解为什么这更符合 SQL 处理双引号的方式:https://dev59.com/UnNA5IYBdhLWcg3wWseK#1233862 - Aaron D
这不是一个好答案!请看一下我在问题上的评论。只需在搜索字符串周围使用空格和双引号即可。 - Christian4145

1

你需要确保在字符串前后都有引号和空格。例如,@Search的值应该是' "Punch Cigar" '

除了OMG提到的转义字符,你还需要删除任何嵌入的双引号。

declare @Search varchar(1000)
set @Search = 'punch and" cigar'

set @Search = ' "' + REPLACE(@Search,'"','') + '" '

select * from sys.dm_fts_parser(@Search,1033,null,0)

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