2009-07-14 8 views
1

おそらくnoobの質問ですが、それでもやります。SQL Server 2008における結合された階層レコードの全文検索

例として、私はPersonテーブル、Tagテーブル、ContactMethodテーブルを持っています。 Personには、複数のTagレコードと複数のContactMethodレコードが関連付けられます。

私は各テーブルからいくつかのフィールドを検索する寛大な検索をしたいと思います。だから私はContactMethodを使って電子メールで人を見つけ出すことができます。

FTSに完全にnoobのよう

、二つのアプローチが頭に浮かぶ:

  1. 個別に各フィールドを扱ういくつかの複雑なクエリがインデックスに私がしたいフィールドを連結したルックアップテーブルのいくつかの並べ替えを構築構築し、その派生テーブルに対してフルテキストクエリを実行するだけです。 PERSONID、ContentTypeを、コンテンツ:;

(。明確にするため、編集すること自由に感じ、私は担当者のポイントのためにそれではないよ)

+0

これは一般的なスタックオーバーフローコミュニティのものであるため、これは自分自身からの明確化の要求ではありませんが、フルテキスト検索の仕事は本当ですか? FTSはデータベース内の大きな文字列を検索するためのものですが、これは間違っていますか?記述された名前、連絡先、タグフィールドが私にとっては小さいと考えられるので、これはたくさんのLIKEクエリで処理できないでしょうか? –

+0

@Ken:サイズの問題だけでなく、シソーラス、ワードブレーカー、ステマーなどのように、FTSは言語的なことをすることはできません。 –

+0

MSは良い記事http://technet.microsoft.com/en-us /library/ms345119(SQL.90).aspx "何百万行ものテキスト・データに対するLIKE問合せ(たとえば '%cencini%')は戻すには数分かかることがありますが、フルテキスト問合せ( 'cencini'返される行の数に応じて、同じデータに対して数秒かかります。 – u07ch

答えて

0

SQL Serverでサポートされている場合は、インデックス付きのビューと全文検索を作成できます。 containstable(*、 '"chris"')を使用してすべての列を読み取ることができます。

フィールドがすべて異なるテーブルから来ているので、スケーラビリティのためにそれをサポートしていない場合は、 個々のレコードではなく、フルテキスト検索となる別のテーブルでレコードごとに1つの行にのフィールドを簡単に取り込める場合は、より複雑でないFTSカタログで終わるので、一度に4つの全文検索を行う必要はありません。複数の異なるFTSクエリを異なるテーブルで同時に実行することは、私の経験でパフォーマンスの問題をクエリするためのチケットです。これを行うことの欠点は、あなた自身が姓を検索する能力を失うことです。それがあなたが必要とするものなら、代替案を見なければならないかもしれません。

私たちのアプリでは、単一のテーブルがより速いことがわかりました(エンタープライズSQLを手に入れている顧客に依存することはできません)。そこで我々は、更新spを介してFTSテーブルにスペースを入れてデータを埋め込みます。その後、メイン連絡先ルックアップはリスト上で検索を実行します。正確さ(名前や電話番号など)を見つけたり、フリーテキストのみを検索したりするために、2つの検索が別々に用意されています。テーブルに関するもう1つの良い点は、ルックアップに列を追加するのは比較的簡単で低コストだということです(たとえば、社会保障番号を求められています。これを行うには、更新SPに列を追加しただけです。

0

一つの可能​​性は、これらの列を持つビューを作成することです。 ContentTypeは "Email"、 "PhoneNumber"などのようなものになり、Contentはそれを保持します。 [コンテンツ]列を検索すると、そのIDが何であるかを確認できます。私は完全なテキスト検索がどのように機能するかを100%確信しているわけではないので、あなたがビューでそれを使用できるかどうかはわかりません。

0

FTSは、search multiple fieldsすぐに利用できます。 CONTAINS述語は、リストの検索する列を受け入れます。またCONTAINSTABLE

+0

私は複数の列をどのようにクエリできるかを見ていますが、階層データの問題を解決するかどうかは不明です。思考? – Larsenal

関連する問題