2011-09-15 14 views
2

私はセルフヘルプFAQタイプのアプリケーションを作成しています。要件の1つは、エンドユーザーがFAQトピックを検索できることです。ストアドプロシージャを使用して "キーワード検索"を処理する方法は?

Topic: Name, Description 
Question: Name, Answer 
Problem: Name, Solution 

すべての3つのテーブルがTopicID塔を介してトピックにリンクされている:私は彼らの関連する(すなわち、検索可能)列の下にリストされているノートの3つのモデルを、持っています。この考え方は、ユーザーが文章(例えば「Xを実行する方法」)またはフレーズ(「Performing X」または「Perform X」)として検索クエリを入力できる単一のテキストボックスを提供し、名前または説明/回答/解決フィールドのいずれかに入力した単語を持つすべてのトピック/質問/問題。モデルは検索可能な列しか見つけられませんし、 "How"やそのような一般的な単語を除外することについても心配する必要はありません(ファインドマッチではなく正確です。 )。

私のコントロール外の理由から、私はストアドプロシージャを使用する必要があります。私の質問は、このような検索を処理する最も適切な方法は何でしょうか。私は複数の列に関する同様の質問を見たことがありますが、実際には可変数の列は存在せず、実際には検索可能なテーブル当たり2つの列が常にあります。問題は、検索クエリが理論上、文、フレーズ、コンマで区切られた用語リスト(「x、y、z」など)に近いものである可能性があるため、検索用語をコンポーネント(例えば空白で区切って)を検索した後、それぞれの列のペアをすべての用語で検索しますか?それは合理的にSQL Serverで簡単ですか?代わりに、ちょっと厄介なのは、すべてのデータを元に戻してからクエリを分割し、サーバ側のコードで結果をフィルタリングして、となるべきではないということです。多くの項目が入力されましたが、そのようなことをして汚い;-)

+1

フルテキスト検索を見ましたか? http://msdn.microsoft.com/en-us/library/ms142547.aspx –

+0

私はこれをフルテキスト検索http://msdn.microsoft.com/en-us/library/ms142571%28SQLで解決します。 90%29.aspx –

+0

ああ、私は全文検索を完全に忘れてしまった! –

答えて

1

creating a new Full Text Catalogを提案し、テーブルと列をそのカタログに割り当てます。必要に応じてカタログを適切な頻度で更新してください。

このカタログには、FREETEXT述部を使用して照会できます。 'ing'のような接尾辞に一致する必要があるように聞こえるので、CONTAINSを超えてFREETEXTを提案してください。

この検索で​​は変数を使用することができるので、ストアドプロシージャに簡単に収めることができます。

declare @token varchar(256); 
select @token = 'perform'; 

select * from Problem 
where freetext(Name, @token) 
or  freetext(Solution, @token); 
--this will match 'perform' and 'performing' 
関連する問題