2011-07-08 18 views
0

1つの列(タイトル)を持つテーブル(カタログ)があります。このコラムには、曲(アーティスト、タイトル、リミックス)に関する情報が格納されています。私は検索用語から一致を見つける必要がある状況があります。SQL Server全文検索ジレンマ

SQL Server FTSを有効にし、タイトル列を使用してFTSカタログを作成しました。 FREETEXTTABLEを使ってテストを始めました。

これは、関連性のない多くの結果に戻ることがわかりましたが、トップランクの結果は通常、タイトルがカタログ表に存在する場合には通常正しく表示されます。私が持っていたアプローチの1つは、RANKをパーセントに変換し、パーセント値が90より大きい場合にのみ結果を表示することでした。問題は、タイトルがCatalogテーブルに存在しない場合でもクエリは関連性のない結果を返します。

代わりに、CONTAINSTABLEを使用します。ジレンマは、検索語には区切りがないことである

SELECT DISTINCT ft.[rank], [Id] 
FROM CONTAINSTABLE(Catalogs, Title, '"artist" AND "title" AND "remix"') AS ft 
JOIN [Catalogs] ON [Catalogs].[Id] = ft.[KEY] 

:ここでの問題は、私のようなものを作成し、動的コードでクエリを生成する必要が(言葉を打破する)ということです。つまり、文字列をアーティストとタイトルに論理的に分割することはできません。時には、他の用語がラベルのように含まれているため、上記のクエリが失敗することがあります。

私はちょっと立ち往生しています。誰もSQL ServerのFTSを使用して同様の問題を扱っていますか? CONTAINSTABLEとFREETEXTTABLEの間にアプローチがありますか?

答えて

3

ユーザーが無料のクエリ検索文字列を入力できるようにしたのと同じ問題がありましたが、FREETEXTがあまりにも多くの誤検出を返すため、CONTAINSを使用する必要がありました。私たちは、文字列をスクラブし、スペースをANDで置き換えるビジネスレイヤーで独自の検索語解析ルーチンを作成しました。これは論理グループ化(人々が角括弧を使用するとき)と複数のスペースに対応するのに十分なほど賢明でなければなりません。それは私たちのためにうまくいくようです。

私はあなたの列のデータの構造について少し戸惑っています。アーティスト、タイトル、リミックスが本当に情報の独立したビットである場合、それらを別個の列として維持して個別にクエリするのは理にかなっていませんか?