CREATE FULLTEXT INDEX (Transact-SQL)
データベース内のテーブルまたはインデックス付きビューで、フルテキスト インデックスを作成します。テーブルまたはインデックス付きビューごとに 1 つのフルテキスト インデックスのみ使用でき、各フルテキスト インデックスは 1 つのテーブルまたはインデックス付きビューに適用されます。
フルテキスト インデックスには、1,024 列まで格納できます。
構文
CREATE FULLTEXT INDEX ON table_name
[ ( { column_name
[ TYPE COLUMN type_column_name ]
[ LANGUAGE language_term ]
} [ ,...n]
) ]
KEY INDEX index_name
[ ON <catalog_filegroup_option> ]
[ WITH [ ( ] <with_option> [ ,...n] [ ) ] ]
[;]
<catalog_filegroup_option>::=
{
fulltext_catalog_name
| ( fulltext_catalog_name, FILEGROUP filegroup_name )
| ( FILEGROUP filegroup_name, fulltext_catalog_name )
| ( FILEGROUP filegroup_name )
}
<with_option>::=
{
CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [, NO POPULATION ] }
| STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
}
引数
table_name
フルテキスト インデックスに含まれている列を格納するテーブルまたはインデックス付きビューの名前を指定します。column_name
フルテキスト インデックスに含める列の名前を指定します。フルテキスト検索用にインデックスを作成できるのは、データ型が char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary、varbinary(max) の列のみです。複数の列を指定するには、次のように column_name 句を繰り返します。CREATE FULLTEXT INDEX ON table_name (column_name1 […], column_name2 […]) …
TYPE COLUMN type_column_name
varbinary、varbinary(max)、または image のドキュメント型の格納に使用されるテーブル列の名前 type_column_name を指定します。型列と呼ばれるこの列には、ユーザー指定のファイル拡張子 (.doc、.pdf、.xls など) が格納されます。型列の型は、char、nchar、varchar、または nvarchar であることが必要です。TYPE COLUMN type_column_name を指定できるのは、column_name に、データがバイナリ データとして格納される varbinary、varbinary(max) または image 列を指定した場合だけです。それ以外の場合、SQL Server ではエラーが返されます。
注意 Full-Text Engine は、インデックスを作成する際に、各テーブル行の型列の省略形を使用して、column_name でドキュメントに使用するフルテキスト検索フィルタを特定します。フィルタはドキュメントをバイナリ ストリームとして読み込み、書式設定情報を削除し、ドキュメントからワード ブレーカ コンポーネントへテキストを送信します。詳細については、「フルテキスト検索フィルタ」を参照してください。
LANGUAGE language_term
column_name に格納されているデータの言語を指定します。language_term は省略可能で、言語のロケール識別子 (LCID) に対応する文字列、整数、または 16 進数の値を指定できます。値を指定しなかった場合は、SQL Server インスタンスの既定の言語が使用されます。
language_term を指定した場合、その言語は、char、nchar、varchar、nvarchar、text、および ntext 型の列に格納されているデータのインデックス作成で使用されます。クエリ実行時に、列に対するフルテキスト述語の一部として language_term を指定しない場合は、ここで指定した言語がクエリでの既定の言語になります。
language_term を文字列で指定する場合は、syslanguages システム テーブルの alias 列の値と同じ値を指定します。文字列の場合は、'language_term' のように単一引用符 (') で囲む必要があります。language_term を整数で指定する場合は、その言語を表す実際の LCID を指定します。language_term を 16 進数値で指定する場合は、「0x」の後に LCID の 16 進数値を指定します。16 進数の値は、先頭の 0 を含め、8 桁以内で指定してください。
値を 2 バイト文字セット (DBCS) の形式で指定すると、SQL Server で Unicode に変換されます。
language_term で指定した言語に対しては、単語区切りや語幹検索などのリソースが有効になっている必要があります。指定した言語でこれらのリソースがサポートされていない場合、SQL Server ではエラーが返されます。
MicrosoftSQL Server インスタンスの既定のフルテキスト言語に関する情報を取得するには、sp_configure ストアド プロシージャを使用します。詳細については、「sp_configure (Transact-SQL)」および「default full-text language オプション」を参照してください。
列のデータ型が BLOB および XML 以外で、複数の言語のテキスト データが含まれている場合や、列に格納されているテキストの言語が不明な場合は、ニュートラル (0x0) 言語リソースを使用することもできます。ただしその前に、ニュートラル (0x0) 言語リソースを使用した場合にどのような結果が起こりうるのかを理解しておく必要があります。ニュートラル (0x0) 言語リソースの使用について考えられる解決策と起こりうる結果については、「フルテキスト インデックス作成時の言語の選択に関するベスト プラクティス」を参照してください。
データ型が XML または BLOB の列に格納されているドキュメントに対しては、そのドキュメントの言語のエンコードがインデックス作成時に使用されます。たとえば、データ型が XML の列では、XML ドキュメントの属性 xml:lang によって言語が決定されます。クエリ時には、フルテキスト クエリ内で language_term を指定しない限り、前回 language_term に指定された値がフルテキスト クエリの既定の言語になります。
KEY INDEX index_name
table_name の一意なキー インデックスの名前を指定します。KEY INDEX は、一意で、単一のキーを含む、NULL 値を許容しない列であることが必要です。フルテキストの一意キーには、一番小さな一意キー インデックスを選択します。最適なパフォーマンスが得られるように、フルテキスト キーには整数データ型を使用することをお勧めします。fulltext_catalog_name
フルテキスト インデックスに使用するフルテキスト カタログを指定します。このカタログはデータベース内に存在する必要があります。この句は省略可能です。指定しない場合は、既定のカタログが使用されます。既定のカタログが存在しない場合、SQL Server ではエラーが返されます。FILEGROUP filegroup_name
指定したファイル グループに、指定したフルテキスト インデックスを作成します。ファイル グループは既に存在している必要があります。FILEGROUP 句を指定しなかった場合、フルテキスト インデックスは、非パーティション テーブルの場合にはベース テーブルまたはベース ビューと同じファイル グループに、パーティション テーブルの場合にはプライマリ ファイル グループに配置されます。CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [ , NO POPULATION ] }
フルテキスト インデックスの対象となっているテーブル列の変更 (更新、削除、または挿入) が、SQL Server によってフルテキスト インデックスに反映されるかどうかを指定します。WRITETEXT および UPDATETEXT によるデータの変更は、フルテキスト インデックスには反映されず、変更の追跡でも取得されません。MANUAL
追跡された変更の反映を ALTER FULLTEXT INDEX ... START UPDATE POPULATION Transact-SQL ステートメントの呼び出しによって手動で行うこと (手動作成) を指定します。SQL Server エージェントを使用すると、この Transact-SQL ステートメントを定期的に呼び出すことができます。AUTO
ベース テーブルでデータが変更されたときに、追跡された変更を自動的に反映すること (自動作成) を指定します。この場合、フルテキスト インデックスに対して変更は自動的に反映されますが、反映までに少し時間がかかることがあります。AUTO は既定値です。OFF [ , NO POPULATION]
SQL Server で、インデックスの対象となるデータに対して行われた変更の一覧を保持しません。NO POPULATION を指定しない場合、SQL Server では、インデックスの作成後にインデックスへの値が完全に設定されます。NO POPULATION オプションは、CHANGE_TRACKING が OFF の場合にだけ使用できます。NO POPULATION を指定した場合、SQL Server ではインデックスの作成後、インデックスに対して値は設定されません。この場合、ユーザーが START FULL POPULATION 句または START INCREMENTAL POPULATION 句を指定して ALTER FULLTEXT INDEX コマンドを実行した後でなければ、インデックスは作成されません。
STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
フルテキスト ストップ リストをインデックスに関連付けます。インデックスには、指定したストップ リストの一部であるトークンは設定されません。STOPLIST を指定しない場合、SQL Server によってシステム フルテキスト ストップ リストがインデックスに関連付けられます。OFF
フルテキスト インデックスにストップ リストを関連付けないことを指定します。SYSTEM
このフルテキスト インデックスに対して既定のフルテキスト システム ストップ リストを使用することを指定します。stoplist_name
フルテキスト インデックスに関連付けるストップ リストの名前を指定します。
説明
フルテキスト インデックスの詳細については、「データベースのフルテキスト カタログおよびフルテキスト インデックスの構成」を参照してください。
xml 列にフルテキスト インデックスを作成して XML 要素のコンテンツにインデックスを設定できますが、XML マークアップは無視されます。属性値には、数値でない限り、フルテキスト インデックスが設定されます。要素タグはトークンの境界として使用されます。複数言語を含む整形式の XML または HTML ドキュメントやフラグメントはサポートされます。詳細については、「XML 列のフルテキスト インデックス」を参照してください。
インデックス キー列は整数データ型にすることをお勧めします。整数データ型にすると、クエリの実行が最適化されます。
変更の追跡と NO POPULATION パラメータの相関関係
フルテキスト インデックスが作成されるかどうかは、変更の追跡が有効になっているかどうかと、ALTER FULLTEXT INDEX ステートメントで WITH NO POPULATION が指定されているかどうかによって決まります。次の表は、その相関関係の結果をまとめたものです。
変更の追跡 |
WITH NO POPULATION |
結果 |
---|---|---|
有効ではない |
指定なし |
インデックスで完全作成が実行されます。 |
有効ではない |
指定あり |
ALTER FULLTEXT INDEX...START POPULATION ステートメントが実行されるまで、インデックスの作成は行われません。 |
有効 |
指定あり |
エラーが発生し、インデックスは変更されません。 |
有効 |
指定なし |
インデックスで完全作成が実行されます。 |
フルテキスト インデックスの作成の詳細については、「フルテキスト インデックスのカタログ作成」を参照してください。
権限
実行するには、フルテキスト カタログに対する REFERENCES 権限とテーブルまたはインデックス付きビューに対する ALTER 権限が与えられているか、sysadmin 固定サーバー ロール、db_owner 固定データベース ロールまたは db_ddladmin 固定データベース ロールのメンバであることが必要です。
SET STOPLIST を指定した場合は、ユーザーが指定のストップ リストに対する REFERENCES 権限を持っている必要があります。ストップ リストの所有者がこの権限を許可できます。
注意 |
---|
public には、SQL Server に含まれる既定のストップ リストに対する REFERENCE 権限が許可されています。 |
例
A. 一意のインデックス、フルテキスト カタログ、およびフルテキスト インデックスを作成する
次の例では、AdventureWorks サンプル データベースの HumanResources.JobCandidate テーブルの JobCandidateID 列に一意のインデックスを作成します。その後、既定のフルテキスト カタログ、ft を作成します。そして最後に、ft カタログおよびシステム ストップ リストを使用して Resume 列にフルテキスト インデックスを作成します。
USE AdventureWorks;
GO
CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID);
CREATE FULLTEXT CATALOG ft AS DEFAULT;
CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume)
KEY INDEX ui_ukJobCand
WITH STOPLIST = SYSTEM;
GO
B. 複数のテーブル列にフルテキスト インデックスを作成する
次の例では、AdventureWorks サンプル データベースの Production.ProductReview テーブルの ReviewerName、EmailAddress、および Comments の各列にフルテキスト インデックスを作成します。各列に、列のデータの言語である英語の LCID、1033 を指定します。このフルテキスト インデックスは、既定のフルテキスト カタログおよび既存の一意なキー インデックス、PK_ProductReview_ProductReviewID を使用します。推奨されているように、このインデックス キーは整数列、ProductReviewID にあります。
USE AdventureWorks;
GO
CREATE FULLTEXT INDEX ON Production.ProductReview
(
ReviewerName
Language 1033,
EmailAddress
Language 1033,
Comments
Language 1033
)
KEY INDEX PK_ProductReview_ProductReviewID ;
GO
C. インデックスの値を設定せずにフルテキスト インデックスを作成する
次の例では、AdventureWorks サンプル データベースにフルテキスト カタログ、documents_catalog を作成します。その後、この新しいカタログを使用するフルテキスト インデックスを作成します。フルテキスト インデックスは、Production.Document テーブルの Document 列にあります。この例では、列のデータの言語である英語の LCID、1033 を指定します。このフルテキスト インデックスは、既定のフルテキスト カタログおよび既存の一意なキー インデックス、PK_Document_DocumentID を使用します。推奨されているように、このインデックス キーは整数列、DocumentID にあります。この例では、変更の追跡が OFF で、NO POPULATION を指定しています。代わりに、ALTER FULLTEXT INDEX ステートメントを指定して、後のピーク タイム以外の時間に新しいインデックスの完全作成を開始し、自動変更追跡を有効にしています。
USE AdventureWorks;
GO
CREATE FULLTEXT CATALOG documents_catalog;
GO
CREATE FULLTEXT INDEX ON Production.Document
( Document
TYPE COLUMN FileExtension
Language 1033 )
KEY INDEX PK_Document_DocumentID
ON documents_catalog
WITH CHANGE_TRACKING OFF, NO POPULATION;
GO
-- 後のピーク タイム以外の時間にインデックスを作成
ALTER FULLTEXT INDEX ON Production.Document SET CHANGE_TRACKING AUTO;
GO
変更履歴
変更内容 |
---|
「例」のセクションに例を追加しました。 |
「変更の追跡と NO POPULATION パラメータの相関関係」セクションを追加しました。 |