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)