【问题标题】:SQL Server Contains Full Text Function Not Returning Expected ResultsSQL Server 包含不返回预期结果的全文函数
【发布时间】:2012-05-27 23:09:32
【问题描述】:

我无法完全弄清楚为什么我会从以下查询/语句中得到意外结果。我已经包含了复制问题的代码(这可能根本不是问题,但更多的是我对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 传入的参数,因此声明该变量以模拟传入的参数。

【问题讨论】:

  • 你可以使用like查询代替..
  • like 查询将在此示例实例中起作用。但我认为在具有 300 万条记录和 5 个搜索字段的表上并不可行。查询将运行数小时。
  • 如果您还想要 mywebsite.net,那么您必须在 @search_client 中使用 * 等通配符。
  • 我刚刚尝试将@search_client 设置为'*website*' 并得到了相同的结果。
  • 查看以下答案。

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


【解决方案1】:

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

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

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

您可以在全文表格中删除“.”并存储“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)

【讨论】:

  • 嘿卢卡。在我的示例代码中,我构建了全文索引,然后立即运行查询......所以这不是一个过时的索引问题。在您的websitedotnet* 示例中,由于网站是 mywebsite.net,仍然会丢失相关记录。听起来我想要做的事情可能无法使用 FTS。
  • 不不,你的问题是 DOT。在全文中,索引中的所有非字母数字字符都将被删除并替换为空白,因此您必须进行替换。查看 SQL Server 的 BOL 了解更多信息
  • 我相信my 前缀是这里的问题,除了你谈到的dot 问题。
  • Sorry but NO again,如果问题是前缀,FTS 搜索的目的是什么?试试我的例子。 SQL的BOL(Books On Line)清楚地解释了非字母数字的概念
  • 如果我只是更改我的插入语句以插入您在 DESCFTS 列中的内容,而不是我在最初问题中插入的内容,这是行不通的。经过进一步研究,您不能在 FTS 中使用通配符前缀。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    尝试以下方法:

    更新:

    select
        *
    from
        dbo.temp
    where
        contains ((description),'"website*"')
    

    【讨论】:

    • 更新后的代码仍然返回相同的结果。此外,这将从 SSRS 报告中调用并传入一个参数,这就是为什么我在代码中声明了 @search_client 变量(以模拟传递给查询的 SSRS 参数)。
    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多