4

我有一个在标题列上启用全文搜索的表。我尝试使用包含表进行加权搜索,但我得到 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

4

2 回答 2

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))'

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


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

于 2011-08-18T15:25:28.750 回答
0

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

于 2012-12-20T15:27:56.037 回答