4

タイトル列で全文検索が有効になっているテーブルがあります。containstable を使用して加重検索を実行しようとしましたが、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。

2つの「;」のうちの1つを削除すると ISABOUT 関数では、クエリは正常に完了します。

クエリが正常に完了した結果がない場合は、いくつかの結果が必要であることに注意してください。

誰もこれを解決する方法を知っていますか?

この質問はdba.stackexchange.comでもあります

4

2 に答える 2

1

修飾子:これを再現できないため、これで問題が解決するかどうかはわかりません。しかし、これらは私が見ているいくつかのものです。

まず、アンパサンド、ポンド記号、およびセミコロンは単語区切り文字です。つまり、文字列「pétoncle」を検索する代わりに、実際に検索しているのは「p」、「233」、および「toncle」です。明らかに、それはあなたの意図ではありません。

データセットのどこかに "pétoncle" というテキストがあると推測しなければなりません。つまり、文字列全体を完成させる必要があります。

できることがいくつかあります。

1) ストップワードをまとめてオフにします。これを行うには、全文索引を変更してオフにします。

これにより構文エラーが生成されないようにするには、データベースを SQL Server 2008 互換に設定する必要があることに注意してください。

ALTER FULLTEXT INDEX ON Table1 SET STOPLIST OFF;

2) 新しいストップリストを作成する

空のストップリストを作成すると、必要なストップワードを追加したり、システム ストップリストをコピーして不要なストップワードを削除したりできる場合があります。(2番目のアプローチをお勧めします)。

そうは言っても、システムのストップリストで & または # を見つけることができなかったので、ハードコーディングされている可能性があります。単にストップリストをオフにする必要がある場合があります。

3) 「pétoncle」のケースを無視するように検索を変更します。

「pétoncle」を ISABOUT から削除して「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 に答える