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

问题描述 投票:0回答:4

我有一个基本的存储过程,通过传入

@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
t-sql sql-server-2008 full-text-search
4个回答
47
投票

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

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

如果您想搜索所有单词,那么您需要类似

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

有关更多信息,请参阅 T-SQL CONTAINS 语法,特别是查看示例部分。

作为附加说明,请务必替换双引号字符(用空格),这样就不会弄乱全文查询。有关如何执行此操作的详细信息,请参阅此问题:SQL Server 全文搜索转义字符?


0
投票

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

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

这将生成一个查询字符串,您可以传递给

CONTAINS
FREETEXT
,如下所示:

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

或者,当

@Keywords
为空时:

""

0
投票

对于使用 2016 年之前的 SQL Server 的用户,您可以使用以下 SQL 来格式化您的搜索查询字符串:

    DECLARE @ContentsSearchTerm VARCHAR(500) = REPLACE(@SearchTerm, '"',' ');           
    SET @ContentsSearchTerm = '"' + REPLACE(@ContentsSearchTerm, ' ', '*" AND "') + '*"';   

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

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

0
投票

将 % 替换为文本中的所有空格

示例:“您要搜索的文本类似”==> 更新:“文本%喜欢%这个%你%想要%搜索”

代码示例:

declare @text as nvarchar(50) = 'test text'
set @text = REPLACE(@text,' ','%')
SELECT TOP (1000) [id]
  ,[value]
  ,[body]
FROM [test].[dbo].[Table_1]
where CONTAINS([body],@text)

如果您想使用全文搜索,请不要忘记在您的 mssql 上安装它

© www.soinside.com 2019 - 2024. All rights reserved.