在FullText搜索输入字符串中使用多个单词

时间:2010-08-09 15:51:28

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

我有基本的存储过程,通过传入@Keyword参数对表中的3列执行全文搜索。它只用一个单词就可以正常工作,但是当我尝试传入多个单词时它就会失效。我不知道为什么。错误说:

全文搜索条件中“搜索项目”附近的语法错误'这是搜索项'

SELECT     S.[SeriesID], 
           S.[Name] as 'SeriesName',
           P.[PackageID],
           P.[Name]     
FROM       [Series] S
INNER JOIN [PackageSeries] PS ON S.[SeriesID] = PS.[PackageID]
INNER JOIN [Package]       P  ON PS.[PackageID] = P.[PackageID]
WHERE CONTAINS ((S.[Name],S.[Description], S.[Keywords]),@Keywords)
AND   (S.[IsActive] = 1) AND (P.[IsActive] = 1) 
ORDER BY [Name] ASC

2 个答案:

答案 0 :(得分:40)

在将@Keyword参数传递给SQL语句之前,您必须对其进行一些预处理。 SQL期望关键字搜索将由布尔逻辑分隔或用引号括起来。因此,如果您要搜索该短语,则必须使用引号:

SET @Keyword = '"this is a search item"'

如果你想搜索所有单词,那么你需要像

这样的东西
SET @Keyword = '"this" AND "is" AND "a" AND "search" AND "item"'

有关详细信息,请参阅T-SQL CONTAINS syntax,特别注意示例部分。

作为补充说明,请务必更换双引号字符(带空格),这样就不会弄乱全文查询。有关如何执行此操作的详细信息,请参阅此问题:SQL Server Full Text Search Escape Characters?

答案 1 :(得分:0)

对于 Aaron 的回答,如果您使用的是 SQL Server 2016 或更高版本 (130),您可以使用内置的字符串函数来预处理您的输入字符串。例如

SELECT
    @QueryString = ISNULL(STRING_AGG('"' + value + '*"', ' AND '), '""')
FROM
    STRING_SPLIT(@Keywords, ' ');

这将生成一个查询字符串,您可以将其传递给 CONTAINSFREETEXT,如下所示:

'"this*" AND "is*" AND "a*" AND "search*" AND "item*"'

或者,当 @Keywords 为空时:

""