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

时间:2010-09-08 23:21:21

标签: sql sql-server tsql full-text-search

我遇到SQL Server 2008全文搜索问题我有以下查询

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

@Search是通过存储过程传入​​的值。但是,这不是问题。

如果有人搜索说'Punch',它会正常工作,我会收到所有匹配的雪茄。

问题所在,如果他们搜索'Punch Cigar',我会收到此错误。

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

有关如何获取它以允许它搜索该短语的任何想法吗?

2 个答案:

答案 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)