【问题标题】:SQL Server 2008 Containstable generate negative rank with weighted_termSQL Server 2008 Containstable 使用 weighted_term 生成负排名
【发布时间】:2011-06-09 20:53:23
【问题描述】:

我有一个在标题列上启用全文搜索的表格。我尝试使用包含表进行加权搜索,但我得到 Rank 值的算术溢出。查询如下

 SELECT ID, CAST(Res_Tbl.RANK AS Decimal) AS Relevancy , Title
  FROM table1 AS INNER JOIN
    CONTAINSTABLE(table1,Title,'ISABOUT("pétoncle" weight (.8), "pétoncle" weight (.8), "PÉTONCLE" weight (.8))',LANGUAGE 1036 ) AS Res_Tbl 
     ON ID = Res_Tbl.[KEY]

当我执行这个查询时,我得到: int 类型的算术溢出错误,值 = -83886083125.000076。

如果我删除两个 ';' 之一在 ISABOUT 函数中,查询成功完成。

请注意,如果没有结果查询成功完成,则需要有一些结果。

有人知道怎么解决吗?

这个问题也在dba.stackexchange.com

【问题讨论】:

  • 您能否添加一些重现问题的示例数据?我曾尝试自己创建一些示例,但无法重新创建。另外,如果您在选择中删除 CAST 会发生什么?
  • 如果我放弃演员表,我会得到同样的错误。问题出在 CONTAINSTABLE 函数内部。我无法向您提供任何数据,因为这些数据属于我的客户。当我操纵谓词时,我会说些什么。如果我删除了一个特殊字符(&、#、;),查询就会成功运行。

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


【解决方案1】:

限定符:由于我无法重新创建它,我无法确定这是否能解决问题。然而,这些是我看到的一些东西。

首先,与号、井号和分号是断字字符。这意味着,您实际搜索的是“p”、“233”和“toncle”,而不是搜索字符串“pétoncle”。显然,这不是你的意图。

我必须假设您在数据集中的某处有文本“pétoncle”。这意味着您需要完整的整个字符串。

您可以做一些事情。

1) 一起关闭停用词。您可以通过更改全文索引将其关闭来做到这一点。

请注意,您必须将数据库设置为与 SQL Server 2008 兼容,这样才不会产生语法错误:

ALTER FULLTEXT INDEX ON Table1 SET STOPLIST OFF;

2) 创建一个新的停止列表

如果您创建一个空的 StopList,您也许可以添加您想要的停用词或复制系统停用词并删除您不想要的停用词。 (我会建议第二种方法)。

话虽如此,我无法在系统停止列表中找到 & 或 #,因此它们可能是硬编码的。您可能需要简单地关闭停止列表。

3) 更改搜索以忽略“pétoncle”案例。

如果您从 ISABOUT 中删除“pétoncle”并将它们更改为“p toncle”,它可能会起作用:

'ISABOUT("pétoncle" weight (.8), "p toncle" weight (.8))'

这些只是一些想法。就像我说的,如果无法访问系统或重新创建场景,我们将无能为力。


为您的研究提供更多信息:

【讨论】:

    【解决方案2】:

    对于那些到此页面搜索 SQL Server 返回的负排名结果的人来说,如果您的某些匹配项太长(超出某些字符限制),就会发生这种情况。 SQL Server 在查询时实际上不会抱怨或产生错误,相反,排名将主要是垃圾,对某些权重选择产生负排名(在我的情况下,特别是在超长项上权重值较低)。限制标记/单词长度并避免此问题(可能是 SQL Server 2008 全文搜索内部的一个错误)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 2010-12-21
      • 1970-01-01
      相关资源
      最近更新 更多