次の方法で共有


Full-Text 検索を使用したクエリ

フルテキスト検索を定義するために、SQL Server フルテキスト クエリでは、フルテキスト述語 (CONTAINS および FREETEXT) と関数 (CONTAINSTABLE および FREETEXTTABLE) を使用します。 これらは、さまざまな形式のクエリ用語をサポートする豊富な Transact-SQL 構文をサポートします。 フルテキスト クエリを記述するには、これらの述語と関数を使用するタイミングと方法を学習する必要があります。

Full-Text 述語(CONTAINS または FREETEXT)の概要

CONTAINS 述語と FREETEXT 述語は、TRUE または FALSE 値を返します。 これらは、特定の行がフルテキスト クエリと一致するかどうかを判断するための選択基準を指定する場合にのみ使用できます。 一致する行が結果セットに返されます。 CONTAINS および FREETEXT は、SELECT ステートメントの WHERE 句または HAVING 句で指定されます。 LIKE や BETWEEN など、他の Transact-SQL 述語と組み合わせることができます。

これらの述語の構文と引数については、 CONTAINS (Transact-SQL) および FREETEXT (Transact-SQL) を参照してください。

CONTAINS または FREETEXT を使用する場合は、1 つの列、列の一覧、または検索するテーブル内のすべての列を指定できます。 必要に応じて、単語区切りとステミング、類義語辞典の検索、ノイズワードの削除のために、フルテキスト クエリによってリソースを使用する言語を指定できます。

CONTAINS関数とFREETEXT関数は、次のように異なる種類の一致に役立ちます。

  • CONTAINS (または CONTAINSTABLE) を使用して、単一の単語や語句に対する正確またはあいまい (精度の低い) 一致、互いに一定の距離内の単語の近接性、重み付けされた一致を使用します。 CONTAINS を使用する場合は、検索するテキストと一致を決定する条件を指定する検索条件を少なくとも 1 つ指定する必要があります。

    検索条件間で論理演算を使用できます。 詳細については、このトピックで後述 するブール演算子 AND、OR、AND NOT (CONTAINS および CONTAINSTABLE) の使用を参照してください。

  • FREETEXT (または FREETEXTTABLE) を使用して、指定した単語、語句、または文(フリーテキスト文字列)の正確な単語表現ではなく、意味を一致させます。 指定した列のフルテキスト インデックスで用語または用語の形式が見つかった場合、一致が生成されます。

CONTAINS 述語または FREETEXT 述語で 4 部構成の名前を使用して、リンク サーバー上のターゲット テーブルのフルテキスト インデックス付き列に対してクエリを実行できます。 フルテキスト クエリを受け取るようリモート サーバーを準備するには、リモート サーバー上の検索対象のテーブルおよび列にフルテキスト インデックスを作成し、リモート サーバーをリンク サーバーとして追加します。

データベース互換性レベルが 100 に設定されている場合、 OUTPUT 句 ではフルテキスト述語を使用できません。

例示

ある。 <simple_termでの CONTAINS の使用>

次の例では、"Mountain" という単語を含む価格が$80.99のすべての製品を検索します。

USE AdventureWorks2012  
GO  
  
SELECT Name, ListPrice  
FROM Production.Product  
WHERE ListPrice = 80.99  
   AND CONTAINS(Name, 'Mountain')  
GO  

B. FREETEXT を使用して、指定した文字値を含む単語を検索する

次の例では、vital、safety、components に関連する単語を含むすべてのドキュメントを検索します。

USE AdventureWorks2012  
GO  
  
SELECT Title  
FROM Production.Document  
WHERE FREETEXT (Document, 'vital safety components')  
GO  

Full-Text 関数の概要 (CONTAINSTABLE および FREETEXTTABLE)

CONTAINSTABLE 関数と FREETEXTTABLE 関数は、SELECT ステートメントの FROM 句で通常のテーブル名のように参照されます。 フルテキスト クエリに一致する 0 行、1 行、または複数行のテーブルが返されます。 返されるテーブルには、関数のフルテキスト検索条件で指定された選択条件に一致するベース テーブルの行のみが含まれます。

これらの関数の構文と引数については、 CONTAINSTABLE (Transact-SQL) および FREETEXTTABLE (Transact-SQL) を参照してください。

これらの関数のいずれかを使用するクエリでは、次のように各行の関連性ランク付け値 (RANK) とフルテキスト キー (KEY) が返されます。

  • キー列

    KEY 列は、返された行の一意の値を返します。 KEY 列を使用して、選択条件を指定できます。

  • RANK 列

    RANK 列は、行が選択条件とどの程度一致したかを示す 各行のランク値 を返します。 行内のテキストまたはドキュメントのランク値が高いほど、指定されたフルテキスト クエリに対する行の関連性が高くなります。 異なる行を同じようにランク付けできることに注意してください。 省略可能な top_n_by_rank パラメーターを指定することで、返される一致の数を制限できます。 詳細については、「 RANK を使用して検索結果を制限する」を参照してください。

これらの関数のいずれかを使用する場合は、フルテキスト検索するベース テーブルを指定する必要があります。 述語と同様に、検索する 1 つの列、列の一覧、またはテーブル内のすべての列、および必要に応じて、指定されたフルテキスト クエリでリソースを使用する言語を指定できます。

CONTAINSTABLE は CONTAINS と同じ種類の一致に役立ち、FREETEXTTABLE は FREETEXT と同じ種類の一致に役立ちます。 詳細については、このトピック で前述した Full-Text 述語 (CONTAINS および FREETEXT) の概要を参照してください。 CONTAINSTABLE 関数と FREETEXTTABLE 関数を使用するクエリを実行する場合は、SQL Server ベース テーブルの行と共に返される行を明示的に結合する必要があります。

通常、CONTAINSTABLE または FREETEXTTABLE の結果をベース テーブルと結合する必要があります。 このような場合は、一意のキー列名を知る必要があります。 この列は、フルテキスト対応のすべてのテーブルで使用され、テーブルの一意の行 ( unique**key 列) を適用するために使用されます。 詳細については、「 Full-Text インデックスの管理」を参照してください。

例示

ある。 CONTAINSTABLE の使用

次の使用例は、[説明 ] 列に "light" または "lightweight" という単語の近くに "aluminum" という単語が含まれているすべての製品の説明 ID と説明を返します。ランク値が 2 以上の行のみが返されます。

USE AdventureWorks2012  
GO  
  
SELECT FT_TBL.ProductDescriptionID,  
   FT_TBL.Description,   
   KEY_TBL.RANK  
FROM Production.ProductDescription AS FT_TBL INNER JOIN  
   CONTAINSTABLE (Production.ProductDescription,  
      Description,   
      '(light NEAR aluminum) OR  
      (lightweight NEAR aluminum)'  
   ) AS KEY_TBL  
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
WHERE KEY_TBL.RANK > 2  
ORDER BY KEY_TBL.RANK DESC;  
GO  

B. FREETEXTTABLE の使用

次の例では、FREETEXTTABLE クエリを拡張して、最初に最も高いランク付けされた行を返し、各行のランク付けを選択リストに追加します。 クエリを指定するには、 ProductDescriptionIDProductDescription テーブルの一意のキー列であることを知っている必要があります。

USE AdventureWorks2012  
GO  
  
SELECT KEY_TBL.RANK, FT_TBL.Description  
FROM Production.ProductDescription AS FT_TBL   
     INNER JOIN  
     FREETEXTTABLE(Production.ProductDescription, Description,  
                    'perfect all-around bike') AS KEY_TBL  
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
ORDER BY KEY_TBL.RANK DESC  
GO  

ランク値が 10 以上の行のみを返す同じクエリの拡張機能を次に示します。

USE AdventureWorks2012  
GO  
  
SELECT KEY_TBL.RANK, FT_TBL.Description  
FROM Production.ProductDescription AS FT_TBL   
     INNER JOIN  
     FREETEXTTABLE(Production.ProductDescription, Description,  
                    'perfect all-around bike') AS KEY_TBL  
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
WHERE KEY_TBL.RANK >= 10  
ORDER BY KEY_TBL.RANK DESC  
GO  

CONTAINS および CONTAINSTABLE でのブール演算子 (AND、OR、NOT) の使用

CONTAINS 述語と CONTAINSTABLE 関数は、同じ検索条件を使用します。 どちらの場合も、論理演算を実行するブール演算子 AND、OR、AND NOT を使用した複数の検索用語の組み合わせがサポートされています。 たとえば、AND を使用して、"latte" と "New York スタイルのベーグル" の両方を含む行を検索できます。 たとえば、AND NOT を使用して、"bagel" が含まれているが "クリーム チーズ" が含まれていない行を見つけることができます。

これに対し、FREETEXT と FREETEXTTABLE では、ブール型の用語が検索対象の単語として扱われます。

論理演算子 AND、OR、NOT を使用する他の述語と CONTAINS を組み合わせる方法については、「 検索条件 (Transact-SQL)」を参照してください。

次の例では、 AdventureWorks2012 データベースの ProductDescription テーブルを使用します。 このクエリでは、CONTAINS 述語を使用して、説明 ID が 5 に等しくなく、説明に "Aluminum" という単語と "スピンドル" という単語の両方が含まれている説明を検索します。検索条件では、AND ブール演算子を使用します。

USE AdventureWorks2012  
GO  
  
SELECT Description  
FROM Production.ProductDescription  
WHERE ProductDescriptionID <> 5 AND  
   CONTAINS(Description, 'aluminum AND spindle')  
GO  

Full-Text クエリに関するその他の考慮事項

フルテキスト クエリを記述する場合は、次の点も考慮してください。

  • LANGUAGE オプション

    多くのクエリ用語は、ワード ブレーカーの動作に大きく依存します。 正しいワード ブレーカー (およびステマー) と類義語辞典ファイルを使用していることを確認するには、LANGUAGE オプションを指定することをお勧めします。 詳細については、「 Full-Text インデックスの作成時に言語を選択する」を参照してください。

  • ストップワード

    フルテキスト クエリを定義すると、Full-Text エンジンは検索条件からストップワード (ノイズ ワードとも呼ばれます) を破棄します。 ストップワードは、頻繁に出現する可能性がありますが、通常は特定のテキストを検索するときに役立たない "a"、"and"、"is"、"the" などの単語です。 ストップワードはストップリストに表示されます。 各フルテキスト インデックスは、インデックス作成時にクエリまたはインデックスから省略されるストップワードを決定する特定のストップリストに関連付けられます。 詳細については、「 フルテキスト検索に使用するストップワードとストップリストの構成と管理」を参照してください。

  • 類義語辞典

    FREETEXT クエリと FREETEXTTABLE クエリでは、類義語辞典が既定で使用されます。 CONTAINS および CONTAINSTABLE では、省略可能な THESAURUS 引数がサポートされます。

  • 大文字と小文字の区別

    フルテキスト検索クエリでは、大文字と小文字が区別されません。 ただし、日本語では、正投影正規化の概念が大文字と小文字の区別に等しい複数の音素オルソグラフがあります (例: かな = 無感)。 この種類の正投影正規化はサポートされていません。

varbinary(max) 列と xml 列をクエリすること

varbinary(max)varbinary、またはxml列にフルテキスト インデックスが作成されている場合は、フルテキスト述語 (CONTAINS および FREETEXT) と関数 (CONTAINSTABLE および FREETEXTTABLE) を使用してクエリを実行できます。これは、他のフルテキスト インデックス付き列と同様です。

重要

フルテキスト検索は、画像列でも機能します。 ただし、 image データ型は、将来のバージョンの SQL Server で削除される予定です。 このデータ型は新しい開発作業では使用しないでください。現在使用しているアプリケーションを変更することを計画してください。 代わりに、 varbinary(max) データ型を使用してください。

varbinary(max) または varbinary データ型

1 つの varbinary(max) または varbinary 列には、さまざまな種類のドキュメントを格納できます。 SQL Server では、フィルターがインストールされ、運用システムで使用できる任意のドキュメントの種類がサポートされています。 各ドキュメントのドキュメントの種類は、ドキュメントのファイル拡張子によって識別されます。 たとえば、.doc ファイル拡張子の場合、フルテキスト検索では、Microsoft Word 文書をサポートするフィルターが使用されます。 使用可能なドキュメントの種類の一覧については、 sys.fulltext_document_types カタログ ビューに対してクエリを実行します。

Full-Text エンジンは、オペレーティング システムにインストールされている既存のフィルターを利用できることに注意してください。 オペレーティング システム フィルター、ワード ブレーカー、ステミング機能を使用するには、次のようにサーバー インスタンスに読み込む必要があります。

EXEC sp_fulltext_service @action='load_os_resources', @value=1  

varbinary(max)列にフルテキスト インデックスを作成するには、Full-Text エンジンが varbinary(max) 列のドキュメントのファイル拡張子にアクセスする必要があります。 この情報は、フルテキスト インデックスの varbinary(max) 列に関連付ける必要がある、型列と呼ばれるテーブル列に格納する必要があります。 ドキュメントのインデックス作成時に、Full-Text エンジンは type 列のファイル拡張子を使用して、使用するフィルターを識別します。

xml データ

xmlデータ型の列には XML ドキュメントとフラグメントのみが格納され、ドキュメントには XML フィルターのみが使用されます。 そのため、型列は不要です。 xml列では、フルテキスト インデックスは XML 要素の内容にインデックスを付けますが、XML マークアップは無視されます。 属性値は、数値でない限り、フルテキスト インデックスが作成されます。 要素タグはトークンの境界として使用されます。 整形式の XML または HTML ドキュメントと、複数の言語を含むフラグメントがサポートされています。

xml列に対するクエリの詳細については、「XML 列で Full-Text 検索を使用する」を参照してください。

サポートされている形式のクエリ用語

このセクションでは、フルテキスト述語と行セット値関数によってクエリの各形式に対して提供されるサポートの概要を示します。

特定のクエリ用語の構文については、次の表の [ サポート 対象] 列の対応するリンクをクリックします。

検索用語入力フォーム 説明 サポートしているもの
1 つ以上の特定の単語または語句 (単純な用語) フルテキスト検索では、単語 (または トークン) は、指定された言語の言語規則に従って、適切なワード ブレーカーによって境界が識別される文字列です。 有効な語句は、複数の単語で構成され、その間に句読点が付いているか、含まれていないか。

たとえば、「クロワッサン」は単語で、「カフェ」もそうです。 au lait" は語句です。 このような単語や語句は、単純な用語と呼ばれます。

詳細については、このトピックの「 特定の単語または語句の検索 (単純な用語)」を参照してください。
CONTAINSCONTAINSTABLE は、語句と完全に一致するものを探します。

FREETEXTFREETEXTTABLE は 、フレーズを別々の単語に分割します。
単語が指定したテキスト (プレフィックス用語) で始まる単語または語句 プレフィックス用語とは、単語の先頭に付けられた文字列を指し、派生語または変奏形を生成します。

単一のプレフィックス用語の場合、指定した用語で始まるすべての単語が結果セットの一部になります。 たとえば、"auto*" という用語は、"automatic"、"automobile" などと一致します。

語句の場合、語句内の各単語はプレフィックス用語と見なされます。 たとえば、"auto tran*" という用語は "自動トランスミッション" と "自動車のトランスデューサー" と一致しますが、"自動モータートランスミッション" とは一致しません。

詳細については、このトピックで後述 するプレフィックス検索 (プレフィックス用語) の実行を参照してください。
CONTAINSCONTAINSTABLE
特定の単語の変曲形 (世代用語変曲) 変曲形は、動詞の異なる時制と結合、または名詞の単数形と複数形です。 たとえば、"drive" という単語の変曲形式を検索します。 テーブル内のさまざまな行に "drive"、"drives"、"drove"、"driving"、および "driven" という単語が含まれている場合、これらはすべて結果セットに含まれます。これらはそれぞれ「drive」という単語から語形変化によって生成されるためです。

詳細については、このトピック で後述する「特定の単語の変曲形式の検索 (生成用語)」を参照してください。
FREETEXTFREETEXTTABLE では、既定で指定されたすべての単語の変曲用語が検索されます。

CONTAINS および CONTAINSTABLE では、省略可能な INFLECTIONAL 引数がサポートされます。
特定の単語の類義語形式 (世代用語類義語辞典) 類義語辞典は、用語のユーザー指定のシノニムを定義します。 たとえば、類義語辞典に "{car, automobile, truck, van}" というエントリが追加されている場合は、"car" という単語の類義語辞典の形式を検索できます。 "automobile"、"truck"、"van"、または "car" という単語が含まれるテーブル内のすべての行が結果セットに表示されます。これらの各単語は、"car" という単語を含むシノニム拡張セットに属しているためです。

類義語辞典ファイルの構造については、「Full-Text 検索のための類義語辞典ファイルの構成と管理」を参照してください。
FREETEXTFREETEXTTABLE では、類義語辞典が既定で使用されます。

CONTAINS および CONTAINSTABLE では、省略可能な THESAURUS 引数がサポートされます。
別の単語または語句に近い単語または語句 (近接用語) 近接語句は、互いに近い単語または語句を示します。また、最初と最後の検索語句を区切る非検索用語の最大数を指定することもできます。 さらに、任意の順序で、または指定した順序で単語または語句を検索できます。

たとえば、"ice" という単語が "hockey" という単語の近くにある行や、"ice skating" という語句が "ice hockey" という語句の近くにある行を検索します。

詳細については、「NEAR を 使用して別の単語に近い単語を検索する」を参照してください。
CONTAINSCONTAINSTABLE
重み付け値を使用する単語または語句 (重み付け用語) 単語と語句のセット内の各単語と語句の重要度を示す重み付け値。 重み値 0.0 が最も低く、重み値が 1.0 が最も高い値です。

たとえば、複数の用語を検索するクエリでは、検索条件内の他の単語に対する重要度を示す重み値を各検索単語に割り当てることができます。 この種類のクエリの結果は、検索語句に割り当てた相対的な重みに従って、最も関連性の高い行を最初に返します。 結果セットには、指定された用語 (またはそれらの間のコンテンツ) を含むドキュメントまたは行が含まれます。ただし、一部の結果は、異なる検索語句に関連付けられた加重値の変動により、他の結果よりも関連性が高いと見なされます。

詳細については、このトピックで後述 する「加重値 (加重用語)を使用した単語または語句の検索」を参照してください。
CONTAINSTABLE

特定の単語または語句を検索する (単純な用語)

CONTAINSCONTAINSTABLEFREETEXT、または FREETEXTTABLE を使用して、テーブルで特定の語句を検索できます。 たとえば、AdventureWorks2012 データベース内の ProductReview テーブルを検索して、"学習曲線" という語句を含む製品に関するすべてのコメントを検索する場合は、次のように CONTAINS 述語を使用できます。

USE AdventureWorks2012  
GO  
  
SELECT Comments  
FROM Production.ProductReview  
WHERE CONTAINS(Comments, '"learning curve"')  
GO  

検索条件(この場合は"学習曲線") は非常に複雑であり、1 つ以上の用語で構成できます

プレフィックス検索の実行 (プレフィックス用語)

CONTAINS または CONTAINSTABLE を使用して、指定したプレフィックスを持つ単語または語句を検索できます。 指定したプレフィックスで始まるテキストを含む列のすべてのエントリが返されます。 たとえば、top``pletop``pingtopのように、プレフィックス top を含むすべての行を検索します。 クエリは次のようになります。

USE AdventureWorks2012  
GO  
  
SELECT Description, ProductDescriptionID  
FROM Production.ProductDescription  
WHERE CONTAINS (Description, '"top*"' )  
GO  

アスタリスク (*) の前に指定されたテキストと一致するすべてのテキストが返されます。 CONTAINS (DESCRIPTION, 'top*')のように、テキストとアスタリスクが二重引用符で区切られない場合、フルテキスト検索ではアスタリスクはワイルドカードとは見なされません。

プレフィックス用語が語句の場合、語句を構成する各トークンは個別のプレフィックス用語と見なされます。 プレフィックス用語で始まる単語を含むすべての行が返されます。 たとえば、プレフィックス "light bread*" という用語では、"ライト ブレッド"、"ライト ブレッド"、または "ライト ブレッド" のテキストを含む行が見つかりますが、"薄くトーストされたパン" は返されません。

特定の単語の変曲形の検索 (生成用語)

CONTAINSCONTAINSTABLEFREETEXT、または FREETEXTTABLE を使用すると、動詞のすべての異なる時制と結合、または名詞の単数形と複数形の両方 (変曲検索) を検索したり、特定の単語の類義語形式 (類義語辞典検索) を検索したりできます。

次の例では、AdventureWorks データベースのProductReview テーブルのComments列で、任意の形式の "foot" ("foot"、"feet"など) を検索します。

USE AdventureWorks2012  
GO  
  
SELECT Comments, ReviewerName  
FROM Production.ProductReview  
WHERE CONTAINS (Comments, 'FORMSOF(INFLECTIONAL, "foot")')  
GO  

フルテキスト検索ではステマーを使用します。これにより、動詞のさまざまな時制と結合、または名詞の単数形と複数形の両方を検索できます。 ステマーの詳細については、「 検索用のワード ブレーカーとステマーの構成と管理」を参照してください。

重み付け値 (加重用語) を使用した単語または語句の検索

CONTAINSTABLE を使用すると、単語または語句を検索し、重み付け値を指定できます。 重みは、0.0 から 1.0 までの数値として測定され、単語と語句のセット内の各単語と語句の重要性を示します。 重み 0.0 が最も低く、重み 1.0 が最も高くなります。

次の例は、重みを使用して、すべての顧客アドレスを検索するクエリを示しています。このクエリでは、文字列 "Bay" で始まるテキストに "Street" または "View" が含まれています。 結果は、指定された単語の数が多い行に高いランクを与えます。

USE AdventureWorks2012  
GO  
  
SELECT AddressLine1, KEY_TBL.RANK   
FROM Person.Address AS Address INNER JOIN  
CONTAINSTABLE(Person.Address, AddressLine1, 'ISABOUT ("Bay*",   
         Street WEIGHT(0.9),   
         View WEIGHT(0.1)  
         ) ' ) AS KEY_TBL  
ON Address.AddressID = KEY_TBL.[KEY]  
ORDER BY KEY_TBL.RANK DESC  
GO  

重み付け用語は、任意の単純な用語、プレフィックス用語、生成用語、または近接項と組み合わせて使用できます。

ワード ブレーカー、類義語辞典、ストップリストの組み合わせのトークン化結果の表示

クエリ文字列入力に特定のワード ブレーカー、類義語辞典、ストップリストの組み合わせを適用した後、 sys.dm_fts_parser 動的管理ビューを使用してトークン化の結果を表示できます。 詳細については、「 sys.dm_fts_parser (Transact-SQL)」を参照してください。

こちらもご覧ください

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
Full-Text 検索クエリの作成 (Visual Database Tools)
Full-Text クエリのパフォーマンスを向上させる