Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql中的高级单词搜索_Sql_Sql Server_Tsql_Full Text Search - Fatal编程技术网

sql中的高级单词搜索

sql中的高级单词搜索,sql,sql-server,tsql,full-text-search,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%

我需要在sql server中编写一个查询,该查询选择包含两个单词的行,这些行之间(至少/最多/准确地)指定了单词数

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

SELECT simpledtext
FROM booktexts
WHERE simpledtext LIKE '%hello [^ ] [^ ] search%'
SELECT simpledtext
FROM booktexts
WHERE simpledtext LIKE '%hello [^ ] [^ ] % search%'
此代码用于实现最小字数:

SELECT simpledtext
FROM booktexts
WHERE simpledtext LIKE '%hello [^ ] [^ ] search%'
SELECT simpledtext
FROM booktexts
WHERE simpledtext LIKE '%hello [^ ] [^ ] % search%'
但我不知道如何在t-sql代码之间编写最大字数


另一个问题是,是否可以在sql server 2012中通过全文搜索实现此类查询?

您喜欢的字符串将只匹配单个字符的单词。如果这是您需要的,您可以将以下内容组合在一起:

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)
declare@str1 varchar(1024)='你好吗,
@str2 varchar(1024)=“你好,我们搜索一下,你好吗”,
@利克斯特·瓦查尔(512),
@位置int,
@最大匹配整数;
设置@maxMatch=2;
设置@pos=0;
设置@likeStr='%hello';
而(@pos<@maxMatch)
开始
设置@likeStr+='[^]';
设置@pos+=1;
结束
设置@likeStr+=“搜索%”;
选择@likeStr,(当@str1与@likeStr相似时为case,然后选择1 else 0 end),@str2与@likeStr相似时为case,然后选择1 else 0 end)
如果这不是您需要的,并且您知道单词将包含多少个字符,您可以在循环中的类似字符串中使用
[a-zA-Z]

然而,我想这也不是你想要的。我的建议是放弃like字符串,转而使用更复杂的
正则表达式

不幸的是,您无法将System.dll直接加载到SQL Server 2008中(我认为这也适用于SQL Server 2012),因此您需要创建一个自定义的.NET程序集并将其加载到数据库中。您应该在.NET代码中使用
IsDeterministic
注释,并使用权限\u set=safe
将自定义程序集加载到SQL Server
。这应该确保函数具有并行性,并且可以在计算列之类的地方使用它

SQL Server非常擅长运行.NET代码,也就是说,它可以非常 表演。用正则表达式编写所需内容应该是 很简单


至于全文搜索,contains()基本上是一个全文谓词,您必须在SQL Server中启用它才能使用它。near()在contains()谓词中使用。我认为这对于您想要做的事情来说是巨大的,无论是在支持的功能方面(它会对模糊匹配进行词形变化),还是在您需要启用它时(运行额外的windows服务)。

是否有帮助?您可以指定最大距离(不确定最小距离)。是。。。它只是支持max。。。因此,如果用户希望找到最小-最大组合(如2到5个单词之间),我应该在查询中同时使用“like”和“contains”。。。由于性能度量,我不喜欢使用SQL CLR…您能够使用SQL CLR吗?如果是这样,我倾向于使用正则表达式…我不知道CLR解决方案是否针对大量数据进行了优化。。。是吗?看来唯一的办法就是使用CLR函数。。。。最快的方法是使用只支持最大字数的全文搜索。。。在那个“like”表达式之后,它支持最小值和精确值,但不支持最大值。。。但仅供参考,我的经验表明CLR是最慢的方式!!CLR不会像内置功能那样快,但是性能不可接受吗?还有,你的单词真的是一个字符吗?