web-dev-qa-db-ja.com

SQLの問題:CONTAINS()の使用は機能しませんが、LIKEは正常に機能します

SQL ServerデータベースにProductsテーブルがあり、フルテキストインデックスを使用する従来のストアドプロシージャのトラブルシューティングを行う必要があります。ここでの目的のために、Productsテーブルに2つのフィールドID、Keywordsがあると仮定します。また、[キーワード]フィールドには次の情報が入力されます。

ROLANDSA-300このRolandSA-300はMINT状態です!

次のステートメントを実行すると、レコードを取得できます。

SELECT * FROM Products WHERE Keywords LIKE '%SA-300%'

ただし、次のステートメントのいずれかを実行すると、結果はゼロになります。

SELECT * FROM Products WHERE CONTAINS(Keywords, ' SA-300 ')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA-300')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"SA-300"')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*SA-300*"')

しかし、次のいずれかを実行すると結果が得られるため、CONTAINS()関数が機能していることはわかっています。

SELECT * FROM Products WHERE CONTAINS(Keywords, ' Roland ')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"Roland"')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*Roland*"')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland')

CONTAINS()関数が「SA-300」用語で機能しない理由を理解する必要があります。私はフルテキストインデックスに不慣れなので、どんな助けでもありがたいです。

14
jessegavin

2つの考え:

(1)ハイフンは単語区切りとして扱われる可能性がありますこれらは何を返しますか?

SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA 300')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA300')

これを参照してください 他の質問

(2)フルテキストインデックスを再構築しようとしましたか?古くなっている可能性があります。

14
JohnFx

フルテキストインデックスを再構築する必要があることがわかりました。 @MichaelGGと@JohnFxのヒントをありがとう

4
jessegavin

ああ! @GregDありがとうございます。 「this *」または「never *」を検索したときに、「thisneverends」という文字列が見つからなかった検索がありました。 両方の単語がnoiseENG.txtにあることがわかりました。

クエリごとにこれをオフにすることはできないようですが、これに基づいています: SQL 2008:全文検索クエリのストップワードをオフにする

走った

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

そして私達は私達が望む結果を得始めました。

1
Maxcelcat

ノイズワードファイルを見たことがありますか?私のマシンでは、c:\ Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData\noiseENG.txtにあります。

これをテストする1つの方法は、特定のノイズファイルを1つのスペースで編集して、すべてにインデックスを付け、クエリを再試行することです。私はこれを本番環境ではなくテスト環境で「テスト」します。

0
GregD