我在Title列上启用了全文搜索表。我尝试使用包含可稳定的加权搜索,但我得到了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函数中,查询成功完成。
请注意,如果查询无法成功完成,则需要获得一些结果。
有人知道如何解决这个问题吗?
上答案 0 :(得分:1)
限定符:由于我无法重新创建,我无法确定这是否可以解决问题。但是,这些是我所看到的一些事情。
首先,&符号,英镑符号和分号是分词符号。这意味着,而不是搜索字符串“pé toncle”,你实际上搜索的是“p”,“233”和“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))'
这些只是一些想法。就像我说的那样,如果无法访问系统或重新创建场景,我们将无法提供太多帮助。
您的研究乐趣的更多信息:
答案 1 :(得分:0)
对于那些搜索SQL Server返回的负排名结果的人来说,正如我所做的那样,如果你的某些匹配条件太长(超出某些字符限制),就会发生这种情况。 SQL Server实际上不会在查询时抱怨或产生错误,相反,排名将主要是垃圾,对于某些权重选择产生负排名(在我的情况下,特别是在超长期内具有低权重值)。限制令牌/字长并避免此问题(可能是SQL Server 2008全文搜索中的一个错误)。