2011-06-09 91 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全文搜索深處的一個漏洞)。