我有一个关于SQL Server 2008全文搜索的问题。我有以下查询:
SELECT *
FROM cigars
WHERE CONTAINS(cigars.*, @Search )
@Search是通过存储过程传递的值。但这不是问题所在。
如果有人搜索“Punch”,那么一切正常,我会得到所有匹配的雪茄。
问题出在如果他们搜索“Punch Cigar”,我会收到以下错误信息:
全文搜索条件“Punch Cigar”附近的语法错误。
您有什么想法如何允许搜索该短语?
我有一个关于SQL Server 2008全文搜索的问题。我有以下查询:
SELECT *
FROM cigars
WHERE CONTAINS(cigars.*, @Search )
@Search是通过存储过程传递的值。但这不是问题所在。
如果有人搜索“Punch”,那么一切正常,我会得到所有匹配的雪茄。
问题出在如果他们搜索“Punch Cigar”,我会收到以下错误信息:
全文搜索条件“Punch Cigar”附近的语法错误。
您有什么想法如何允许搜索该短语?
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) )
这个函数相对简单:
根据需要进行微调。
你需要确保在字符串前后都有引号和空格。例如,@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)