我遇到SQL Server 2008全文搜索问题我有以下查询
SELECT *
FROM cigars
WHERE CONTAINS(cigars.*, @Search )
@Search是通过存储过程传入的值。但是,这不是问题。
如果有人搜索说'Punch',它会正常工作,我会收到所有匹配的雪茄。
问题所在,如果他们搜索'Punch Cigar',我会收到此错误。
全文搜索条件'Punch Cigar'中'Cigar'附近的语法错误。
有关如何获取它以允许它搜索该短语的任何想法吗?
答案 0 :(得分:4)
为什么要搜索CIGAR
表中的所有列?当然其中一些不使用基于字符串/文本的数据类型...
After looking at the CONTAINS documentation,我会看一个函数来正确地逃避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) )
功能简单:
根据需要调整。
答案 1 :(得分: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)