2011-06-09 50 views
4

我有一个在Title列上启用全文搜索的表。我尝试使用containstable进行加权搜索,但是得到Rank值的算术溢出。查询是遵循SQL Server 2008 Containstable通过weighted_term生成负排名

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

+0

您可以添加一些重新创建问题的示例数据吗?我曾尝试自行创建一些示例,但无法重新创建此示例。此外,如果您在选择中删除CAST会发生什么情况? – Richard 2011-08-17 14:59:12

+0

如果我放弃演员,我得到相同的错误。麻烦在CONTAINSTABLE函数中。我无法为您提供任何数据,导致数据属于我的客户。当我操纵谓词时,我会说点什么。如果我删除了一个特殊字符(&,#,;),则查询成功运行。 – Nico 2011-08-17 22:30:22

回答

1

预选赛:既然不能重新创建此,我无法确切地知道这是否会解决这个问题。但是,这些都是我所看到的一些东西。

首先,&符号,英镑符号和分号是分词符。这意味着,不是搜索字符串“toncle”,而是实际搜索的是“p”,“233”和“toncle”。显然,那不是你的意图。

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

有几件事你可以做。

1)关闭停用词。您可以通过更改全文索引来关闭它。

注意,你必须有你的数据库设置为SQL Server 2008的兼容性此不生成语法错误:

ALTER FULLTEXT INDEX ON Table1 SET STOPLIST OFF; 

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

如果您创建一个空的非索引字表,您可能可以添加所需的停用词或复制系统停止列表并删除不需要的停用词。 (我会建议第二种方法)。尽管如此,我还是无法在系统列表中找到&或#,因此它们可能会被硬编码。您可能必须简单地关闭停止列表。 3)改变你的搜索,忽略“pé toncle”的情况。

如果你删除的 “P é toncle” 从ISABOUT,并更改为 “P toncle”,它可能工作:

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

这些只是一些想法。就像我说过的,如果不能访问系统或重新创建场景,我们将无法提供太多帮助。


为您研发的快乐一些更多的信息:

0

对于谁得到了这个网页的人寻找通过返回负排名结果SQL Server,正如我所做的,事实证明,c如果你的一些匹配条件太长(超出某个字符限制),就会发生。 SQL Server实际上不会在查询时发生抱怨或产生错误,相反,排名将大部分为垃圾,对权重的某些选择产生负排名(在我的情况下,尤其是对于超长条款,权重值较低)。限制令牌/字长并避免此问题(可能是SQL Server 2008全文搜索深处的一个漏洞)。