Share via


CONTAINSTABLE (Transact-SQL)

単語または語句との完全一致検索やあいまい一致検索、特定の範囲内での近接検索、または重み付き検索を行う列に対して、0 行以上の行を含むテーブルを返します。 CONTAINSTABLE は、Transact-SQL SELECT ステートメントの FROM 句で使用され、標準のテーブル名のように参照できます。 また、文字ベースのデータ型が格納されているフルテキスト インデックス列の SQL Server フルテキスト検索が実行されます。

CONTAINSTABLE は CONTAINS 述語と同様の検索に役立ち、CONTAINS と同様の検索条件を使用します。

ただし、CONTAINS とは異なり、CONTAINSTABLE を使用するクエリでは、各行の関連順位値 (RANK) とフルテキスト キー (KEY) が返されます。

注意

SQL Server でサポートされているフルテキスト検索の形式については、「フルテキスト検索でのクエリ」を参照してください。

トピック リンク アイコン Transact-SQL 構文表記規則

構文

CONTAINSTABLE ( table , { column_name | ( column_list ) | * } , ' <contains_search_condition> ' 
     [ , LANGUAGE language_term] 
  [ , top_n_by_rank ] 
          ) 

<contains_search_condition> ::= 
    { <simple_term> 
    | <prefix_term> 
    | <generation_term> 
    | <generic_proximity_term> 
    | <custom_proximity_term> 
    |  <weighted_term> 
    } 
    | { ( <contains_search_condition> ) 
    { { AND | & } | { AND NOT | &! } | { OR | | } } 
     <contains_search_condition> [ ...n ] 
    }

<simple_term> ::= 
     { word | "phrase" }
<prefix term> ::= 
     { "word*" | "phrase*" } 
<generation_term> ::= 
     FORMSOF ( { INFLECTIONAL | THESAURUS } , <simple_term> [ ,...n ] ) 

<generic_proximity_term> ::= 
     { <simple_term> | <prefix_term> } { { { NEAR | ~ } 
     { <simple_term> | <prefix_term> } } [ ...n ] }

<custom_proximity_term> ::= 
  NEAR ( 
     {
        { <simple_term> | <prefix_term> } [ ,…n ]
     |
        ( { <simple_term> | <prefix_term> } [ ,…n ] ) 
      [, <maximum_distance> [, <match_order> ] ]
     }
       ) 

      <maximum_distance> ::= { integer | MAX }
      <match_order> ::= { TRUE | FALSE } 

<weighted_term> ::= 
     ISABOUT
    ( { { 
  <simple_term> 
  | <prefix_term> 
  | <generation_term> 
  | <proximity_term> 
  } 
   [ WEIGHT ( weight_value ) ] 
   } [ ,...n ] 
    )

引数

  • table
    フルテキスト インデックスが作成されているテーブルの名前を指定します。 table には、1 ~ 4 つの要素で構成されるデータベース オブジェクト名を指定できます。 ビューに対してクエリを実行する場合は、フルテキスト インデックスが作成されたベース テーブルを 1 つだけ指定できます。

    table にサーバー名は指定できません。また、リンク サーバーに対するクエリでは使用できません。

  • column_name
    フルテキスト検索用にインデックスが作成される 1 つ以上の列の名前を指定します。 データ型が char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary、または varbinary(max) の列を指定できます。

  • column_list
    コンマ区切りで複数の列を指定できます。 column_list はかっこで囲む必要があります。 language_term を指定しない場合、column_list で指定するすべての列の言語は同じにする必要があります。

  • *
    table のフルテキスト インデックスを持つすべての列が、指定された検索条件の検索で使用されるように指定します。 language_term を指定しない場合、テーブルのすべての列の言語は同じであることが必要です。

  • LANGUAGE language_term
    クエリにおいて、単語区切り、語幹検索、類義語のチェック、およびノイズ語 (ストップワード) の破棄を行うときに使用する言語リソースの言語を指定します。 このパラメーターは省略可能で、言語のロケール識別子 (LCID) に対応する文字列、整数、または 16 進数の値を指定できます。 language_term を指定した場合、その言語は検索条件のすべての要素に適用されます。 値を指定しなかった場合は、列のフルテキストの言語が使用されます。

    1 つの列に言語の異なる複数のドキュメントが BLOB (Binary Large Object) として格納されている場合、そのインデックスの作成に使用される言語は、そのドキュメントのロケール識別子 (LCID) によって決まります。 そのような列に対してクエリを実行する場合は、LANGUAGE language_term を指定すると検索の一致率が高まります。

    language_term を文字列として指定する場合は、sys.syslanguages 互換性ビューの "別名" 列の値に対応します。 文字列の場合は、'language_term' のように引用符 (') で囲む必要があります。 language_term を整数で指定する場合は、その言語を表す実際の LCID を指定します。 language_term を 16 進数の値で指定する場合は、「0x」の後に LCID の 16 進数の値を指定します。 16 進数の値は、先頭の 0 を含め、8 桁以内で指定してください。

    値を 2 バイト文字セット (DBCS) の形式で指定すると、Microsoft SQL Server で Unicode に変換されます。

    指定した言語が無効であるか、その言語に該当するリソースがインストールされていない場合は、エラーが返されます。 ニュートラル言語リソースを使用するには、language_term に「0x0」を指定してください。

  • top_n_by_rank
    一致したものの中から、降順で順位の高い方から n 個だけを取得します。 これは、整数値 n を指定した場合のみ適用されます。 top_n_by_rank を他のパラメーターと組み合わせた場合、クエリから返される行数は、実際にすべての述語に一致する行数より少なくなります。 top_n_by_rank では、最も関連性の高いヒットだけを再度呼び出すことでクエリのパフォーマンスを向上させることができます。

  • <contains_search_condition>
    column_name で検索するテキストと、その一致条件を指定します。 検索条件の詳細については、「CONTAINS (Transact-SQL)」を参照してください。

説明

フルテキストの述語と関数の対象は、FROM 述語で示される 1 つのテーブルです。 複数のテーブルを検索するには、FROM 句で結合テーブルを使用して、複数のテーブルが組み合わされた結果セットを検索します。

返されるテーブルには、フルテキスト キー値を含む KEY という列があります。 フルテキスト インデックス作成対象の各テーブルには、値が一意になっていることが保証される列があります。KEY 列に返される値は、制約検索条件で指定された選択基準に一致する行のフルテキスト キー値です。 OBJECTPROPERTYEX 関数で取得できる TableFulltextKeyColumn プロパティでは、この一意なキー列の ID が提供されます。 フルテキスト インデックスのフルテキスト キーに関連付けられている列の ID を取得するには、sys.fulltext_indexes を使用します。 詳細については、「sys.fulltext_indexes (Transact-SQL)」を参照してください。

元のテーブルから目的の行を取得するには、CONTAINSTABLE 行との結合を指定してください。 CONTAINSTABLE を使用する場合、通常は次の形式で FROM 句を SELECT ステートメントに指定します。

SELECT select_list
FROM table AS FT_TBL INNER JOIN
   CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
   ON FT_TBL.unique_key_column = KEY_TBL.[KEY]

CONTAINSTABLE で生成されるテーブルには、RANK という列があります。 RANK 列の値は、選択基準と行の一致度に応じて、0 ~ 1000 の範囲の値になります。 通常、順位値は SELECT ステートメント内で次のいずれかの方法で使用します。

  • ORDER BY 句で使用し、最も順位値の高い行をテーブルの最初の行に返す。

  • 選択リストで使用し、それぞれの行に割り当てられている順位値を表示する。

権限

実行権限は、対象テーブルまたは参照されるテーブル内の列に対して SELECT 特権を持っているユーザーにだけ与えられます。

使用例

A. 順位値を返す

次の例では、"frame"、"wheel"、または "tire" という単語を含むすべての製品名を検索します。各単語にはそれぞれ異なる重みが割り当てられています。 これらの検索基準に一致し、返された行に対して、相対的な近似度合い (順位値) を表示します。 また、最も順位値の高い行を最初に返します。

USE AdventureWorks2012
GO

SELECT FT_TBL.Name, KEY_TBL.RANK
    FROM Production.Product AS FT_TBL 
        INNER JOIN CONTAINSTABLE(Production.Product, Name, 
        'ISABOUT (frame WEIGHT (.8), 
        wheel WEIGHT (.4), tire WEIGHT (.2) )' ) AS KEY_TBL
            ON FT_TBL.ProductID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO

B. 指定した値を超える順位値を返す

次の例では、NEAR を使用して、AdventureWorks2008 データベースの Production.Document 列で、相互に近接する "bracket" および "reflector" を検索します。 また、順位値が 50 以上の行だけを返します。

USE AdventureWorks2012
GO

SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable 
INNER JOIN CONTAINSTABLE(Production.Document, Document,
  'NEAR(bracket, reflector)' ) AS KEY_TBL
  ON DocTable.DocumentNode = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 50
ORDER BY KEY_TBL.RANK DESC
GO
注意

フルテキスト クエリで最大距離の整数が指定されていない場合、論理語の間隔が 100 を超えるヒットのみが含まれるドキュメントは NEAR の要件を満たさず、その順位は 0 になります。

C. top_n_by_rank を使用して上位 5 個の結果を返す

次の例では、Description 列内で "light" または "lightweight" という単語の近くに "aluminum" という語句を含んでいる、上位 5 種の製品の説明を返します。

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)',
      5
   ) AS KEY_TBL
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
GO

GO

D. LANGUAGE 引数を指定する

次の例では、LANGUAGE 引数の使用法を示します。

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)',
      LANGUAGE N'English',
      5
   ) AS KEY_TBL
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
GO
注意

LANGUAGE language_term 引数は、top_n_by_rank. を使用するときに必須ではありません。

関連項目

タスク

フルテキスト検索クエリの作成 (Visual Database Tools)

参照

CONTAINS (Transact-SQL)

SELECT (Transact-SQL)

FROM (Transact-SQL)

概念

RANK を使用して検索結果を制限する方法

フルテキスト検索でのクエリ

フルテキスト検索でのクエリ