Sql server SQL Server包含未返回预期结果的全文函数
我不太明白为什么我会从下面的查询/语句中得到意外的结果。我已经包含了复制该问题的代码(这可能根本不是问题,但更多的是我对Sql server SQL Server包含未返回预期结果的全文函数,sql-server,sql-server-2008,full-text-search,Sql Server,Sql Server 2008,Full Text Search,我不太明白为什么我会从下面的查询/语句中得到意外的结果。我已经包含了复制该问题的代码(这可能根本不是问题,但更多的是我对如何包含的误解) 创建表dbo.temp(id int identity,description nvarchar(max)) 插入dbo.temp值(“这是一个网站”)--此记录将在select查询中返回 插入dbo.temp值('存在网站')--此记录将在select中返回 插入dbo.temp值('go to mywebsite.net')--此记录不会在select中返
如何包含的误解)
创建表dbo.temp(id int identity,description nvarchar(max))
插入dbo.temp值(“这是一个网站”)--此记录将在select查询中返回
插入dbo.temp值('存在网站')--此记录将在select中返回
插入dbo.temp值('go to mywebsite.net')--此记录不会在select中返回
插入dbo.temp值('go to mywebsite.net.')--此记录将不会在select中返回
创建全文目录临时文件
在dbo.temp(id)上创建唯一索引idx_dbo_temp_1
在dbo.temp上创建全文索引(说明)
关键字索引idx_dbo_temp_1 on temp
具有自动更改跟踪功能
声明@search_客户端nvarchar(100)=“网站”
选择
*
从…起
dbo.temp
哪里
包含((说明),@search\u客户端)
在dbo.temp上删除全文索引
将索引idx_dbo_temp_1放到dbo.temp上
删除全文目录临时文件
删除表dbo.temp
查询将返回描述字段中包含website
的记录,但不会返回描述字段中包含mywebsite.net
的记录
有什么想法吗
更新:@search\u client
变量实际上是通过SSRS传入的参数,因此声明该变量以模拟传入的参数。尝试以下操作:
更新:
select
*
from
dbo.temp
where
contains ((description),'"website*"')
在全文中,索引中的所有非字母字符都将被删除,并替换为空格。
因此,在您的搜索中,由于字符串中有“.”,因此您正在搜索“网站”和“网络”
您可以通过两种方式解决此问题
您需要有一个单独的表或单独的字段,其中包含全文数据,与保留原始数据的原始表分开
在全文表中,您可以删除“”并存储“网站”
在这种情况下,在执行查询之前,需要从搜索字符串中删除所有“.”。如果要使用“.”进行查询,则需要将“.”替换为字符串-
例如“点”
因此,在本例中,您将存储“websitedotnet”
当您这次搜索时,将查询中的所有“.”替换为“点”
好的,现在您的案例中有一个新字段,其中存储了FTS要搜索的列,因此:
ID DESCRIPTION DESCFTS
-----------------------------------------------------
1 this is a website. this is a websitedot
2 a website exists. a website existsdot
3 go to mywebsite.net go to mywebsitedotnet
4 go to mywebsite.net. go to mywebsitedotnetdot
然后您的查询:
declare @search_client nvarchar(100) = 'website'
set @search_client = replace(@search_client, '.', 'dot')
select * from dbo.temp where contains ((DESCFTS), @search_client)
我认为你面临的问题是,不幸的是,不可能在FTS中使用前导通配符进行搜索。如果使用CONTAINS短语进行搜索,则不能使用前导,只能在功能上使用尾随。寻找引导通配符搜索的解决方法。是mywebsite.net中的MY造成了问题,无法显示。这与前面提到的DOT问题相结合。虽然有一些变通方法,但对我来说,它们似乎有点粗糙,而且还研究了FREETEXT以获得性能提升的可能性。您可以使用like查询来代替。.like查询在本例中有效。但对于一个有300万条记录和5个搜索字段的表来说,这并不可行。查询将运行数小时。如果您还需要mywebsite.net,则必须在@search\u客户端中使用通配符,如*。我刚刚尝试将@search\u客户端设置为'*website*'
,得到了相同的结果。请查看以下答案。更新后的代码仍然返回相同的结果。此外,这将从SSRS报告中调用,并传入一个参数,这就是为什么我在代码中声明@search_client变量(以模拟传递给查询的SSRS参数)。在我的示例代码中,我构建了全文索引,然后立即运行了一个查询……因此这不是一个过时的索引问题。在您的websitedotnet*
示例中,由于该网站是mywebsite.net,因此仍将丢失相关记录。听起来,我试图做的事情可能不可能与FTS一起实现。不,不,你的问题是点。在全文中,索引中的所有非字母数字字符都将被删除并替换为空格,因此您必须替换。有关此问题的更多信息,请查看SQL server的BOL。除了您提到的dot
问题之外,我认为这里的问题是my
前缀。对不起,再次说明,如果问题是前缀,FTS搜索的目的是什么?试试我的例子吧。SQL的BOL(联机丛书)清楚地解释了非对数的概念,如果我只是将insert语句改为在DESCFTS列中插入您在初始问题中插入的内容,那么这是行不通的。进一步研究后,不能将通配符前缀与FTS一起使用。
declare @search_client nvarchar(100) = 'website'
set @search_client = replace(@search_client, '.', 'dot')
select * from dbo.temp where contains ((DESCFTS), @search_client)