2

我不太明白为什么我会从以下查询/语句中得到意外结果。我已经包含了复制问题的代码(这可能根本不是问题,但更多的是我对如何contains工作的误解)。

创建表 dbo.temp (id int identity, description nvarchar(max))
插入 dbo.temp 值('这是一个网站。')——这条记录将在选择查询中返回
insert dbo.temp values ('a website exists.') --这条记录将在select中返回
插入 dbo.temp 值('go to mywebsite.net')——该记录不会在选择中返回
插入 dbo.temp 值(“转到 mywebsite.net。”)——该记录不会在选择中返回


创建全文目录临时
在 dbo.temp (id) 上创建唯一索引 idx_dbo_temp_1
在 dbo.temp(description) 上创建全文索引
    temp 上的键索引 idx_dbo_temp_1
    使用 change_tracking 自动


声明 @search_client nvarchar(100) = '网站'

选择
    *
从
    dbo.temp
在哪里
    包含((描述),@search_client)


在 dbo.temp 上删除全文索引
在 dbo.temp 上删除索引 idx_dbo_temp_1
删除全文目录临时
删除表 dbo.temp

该查询将返回website描述字段中的记录,但不会返回描述字段中的记录mywebsite.net

有什么想法吗?

更新:该@search_client变量实际上是通过 SSRS 传入的参数,因此声明了该变量以模拟传入的参数。

4

3 回答 3

2

在全文中,索引中的所有非字母数字字符都将被删除并替换为空白。所以在你的搜索中,因为你有“。” 在字符串中,您正在搜索“网站”和“网络”。

您可以通过 2 种方式解决此问题。

如果您保留原始数据,您需要有一个单独的表或单独的字段来包含全文数据,与原始表分开。

在全文表格中,您可以删除“ . ”并存储“ websitenet ”。

在这种情况下,您需要删除所有“。” 在执行查询之前从搜索字符串中提取。如果要用“.”查询,则需要替换“.”。带有字符串 - 例如“点”。

因此,在这种情况下,您将存储“ 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)
于 2012-05-21T13:34:34.280 回答
1

尝试以下操作:

更新:

select
    *
from
    dbo.temp
where
    contains ((description),'"website*"')
于 2012-05-21T12:48:52.147 回答
0

我认为您遇到的问题是,不幸的是,无法在 FTS 中使用前导通配符进行搜索。如果您使用 CONTAINS 短语进行搜索,则不能使用前导,只能使用尾随功能。寻找引导通配符搜索的解决方法。这是我在 mywebsite.net 中没有显示问题的原因。这与已经提到的 DOT 问题相结合。有一些解决方法,但它们对我来说似乎很老套——并且还研究了 FREETEXT 以获得性能提升的可能性。

于 2012-05-21T13:45:38.170 回答