先进的单词搜索在SQL中

时间:2013-02-23 07:34:05

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

我需要在sql server中编写一个查询,它选择包含两个单词的行(至少/最多/完全)指定它们之间的单词...

我编写了这段代码,用于实现两者之间的确切字数:

SELECT simpledtext
FROM booktexts
WHERE simpledtext LIKE '%hello [^ ] [^ ] search%'

以及用于在其间实现最少字数的此代码:

SELECT simpledtext
FROM booktexts
WHERE simpledtext LIKE '%hello [^ ] [^ ] % search%'

但我不知道如何在t-sql代码之间编写最大单词...

另一个问题是可以在sql server 2012中使用全文搜索实现这些类型的查询吗?

1 个答案:

答案 0 :(得分:1)

你喜欢的字符串只匹配单个字符。如果这是你需要的,你可以把这样的东西放在一起:

declare @str1 varchar(1024) = 'and hello w w w search how are you',
        @str2 varchar(1024) = 'and hello w w search how are you',
        @likeStr varchar(512),
        @pos int,
        @maxMatch int;

set @maxMatch = 2;
set @pos = 0;

set @likeStr = '%hello';

while (@pos < @maxMatch)
begin
    set @likeStr += ' [^ ]';

    set @pos += 1;
end

set @likeStr += ' search%';

select @likeStr, (case when @str1 like @likeStr then 1 else 0 end), (case when @str2 like @likeStr then 1 else 0 end)

如果这不是您需要的,并且您知道这些单词将包含多少个字符,则可以在循环中的类似字符串中使用[a-zA-Z]

然而,我预计这也不会是你所追求的。我的建议是放弃像字符串一样,然后转向更复杂的regular expressions

遗憾的是,您无法将System.dll直接加载到SQL Server 2008中(我认为这也适用于SQL Server 2012),因此您需要创建自定义.NET程序集并将其加载到数据库中。您应该在.NET代码中使用IsDeterministic注释,并将自定义程序集加载到SQL Server with permission_set = safe中。这应该确保您获得函数的并行性,并且可以在计算列等位置使用它。

  

SQL Server非常擅长运行.NET代码,即它可以非常好   高性能。在正则表达式中写下你需要的东西应该是   很容易。

对于全文搜索,contains()基本上是一个全文谓词,您必须在SQL Server中启用它才能使用它。 near()用于contains()谓词。我认为这对于你想要做的事情来说很笨重,无论是在支持的功能方面(它都会模糊匹配的话),以及你需要启用它(运行额外的Windows服务)。