フルテキスト検索の概要

SQL Server のデータベースでは、フルテキストが既定で有効になっています。ただし、テーブルでフルテキスト インデックスを使用するには、Full-Text Engine を使用してアクセスするテーブルの列に対してフルテキスト インデックス作成機能をセットアップする必要があります。

この作業には、次の基本的な手順が含まれます。

  1. フルテキスト インデックスを格納するフルテキスト カタログを作成する。

    各フルテキスト インデックスは、フルテキスト カタログに属している必要があります。フルテキスト インデックスごとにテキスト カタログを作成するか、複数のフルテキスト インデックスを特定のカタログに関連付けることができます。

    注意注意

    SQL Server 2008 以降では、フルテキスト カタログは仮想オブジェクトであり、ファイル グループには属しません。フルテキスト カタログは、フルテキスト インデックスのグループを指す論理的概念です。

  2. テーブルまたはインデックス付きビューで、フルテキスト インデックスを作成する。

    フルテキスト インデックスは、Full-Text Engine により構築および管理されるトークンベースの特殊な機能インデックスです。テーブルまたはビューにフルテキスト検索を作成するには、そのテーブルまたはビューに、単一列で非 NULL 値の一意なインデックスが作成されている必要があります。Full-Text Engine では、テーブルの各行を一意の圧縮可能なキーにマップするために、この一意のインデックスが必要になります。フルテキスト インデックスには、char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary、varbinary(max) 型の列を含めることができます。詳細については、「フルテキスト インデックスの概要」を参照してください。

フルテキスト インデックスの作成について学習する前に、フルテキスト インデックスと標準の SQL Server インデックスの違いを見ることが重要です。次の表に、両方のインデックスの相違点を示します。

フルテキスト インデックス

標準の SQL Server インデックス

1 つのテーブルに対し、1 つのフルテキスト インデックスしか使用できません。

1 つのテーブルに対し、複数の標準インデックスを使用できます。

フルテキスト インデックスへのデータの追加は作成と呼ばれ、スケジュールによる要求または個別の要求のどちらかを通じて要求できます。または、新規データの追加と共に自動的に行うことができます。

関連するデータが挿入、更新、または削除されたときに、自動的に更新されます。

同じデータベース内で 1 つ以上のフルテキスト カタログにグループ化されます。

グループ化されません。

フルテキスト インデックスの作成に関する注意点

ここでは、次について説明します。

  • 列の言語の選択

  • フルテキスト インデックスのファイル グループの選択

  • フルテキスト カタログへのフルテキスト インデックスの割り当て

  • ストップ リストとフルテキスト インデックスの関連付け

  • フルテキスト インデックスの更新

列の言語の選択

列の言語を選択する際の考慮点の詳細については、「フルテキスト インデックス作成時の言語の選択に関するベスト プラクティス」を参照してください。

フルテキスト インデックスのファイル グループの選択

フルテキスト インデックスの作成処理では、I/O が非常に集中します (高い頻度で SQL Server からデータを読み取り、フィルタ選択されたデータをフルテキスト インデックスに反映するため)。I/O パフォーマンスの最大化に最適なデータベース ファイル グループにフルテキスト インデックスを配置するか、他のボリュームの別のファイル グループにフルテキスト インデックスを配置することをお勧めします。

管理のしやすさが重要である場合は、テーブル データと関連するフルテキスト カタログは同じファイル グループに格納することをお勧めします。パフォーマンス上の理由から、別々のボリュームに格納されている別々のファイル グループにテーブル データとフルテキスト インデックスを配置して、I/O 並列処理を最大限に高めることが必要になる場合もあります。

フルテキスト カタログへのフルテキスト インデックスの割り当て

フルテキスト カタログ内のテーブルに対するフルテキスト インデックスの割り当てを立案することは重要です。

変更が少ないテーブル、変更が多いテーブル、または特定の時間帯に頻繁に変更されるテーブルなど、同じ更新特性を持つテーブルは、同じフルテキスト カタログの下にまとめて関連付けることをお勧めします。フルテキスト カタログの作成スケジュールをセットアップすると、データベースの利用率が高いときでもデータベース サーバーのリソース使用に大きな影響を及ぼすことなく、フルテキスト インデックスとテーブルの同期が維持されるようになります。

フルテキスト カタログにテーブルを割り当てる際には、次のガイドラインを考慮してください。

  • 常に、一意なフルテキスト キーに利用可能な最小の一意なインデックスを選択してください。4 バイトで、整数ベースのインデックスが最適です。これにより、ファイル システム内の Microsoft Search サービスで必要となるリソースが大幅に減少します。主キーが大きい場合 (100 バイト以上)、テーブル内の他の一意なインデックスを選択するか、または他の一意なインデックスを作成して、フルテキスト インデックス用のキーにすることを検討してください。そうしないと、一意なフルテキスト キーのサイズが最大サイズ (900 バイト) を超えた場合、フルテキストの作成を続行できなくなります。

  • 数百万の行を持つテーブルにインデックスを作成しようとしている場合、そのテーブル専用のフルテキスト カタログを割り当ててください。

  • フルテキスト インデックスを作成するテーブル内の変更量だけではなく、そのテーブル内の行の総数についても考慮してください。変更される行と、最後にフルテキスト インデックスを作成したときにテーブル内に存在した行の総数が数百万行に及ぶ場合は、そのテーブルを専用のフルテキスト カタログに割り当ててください。

ストップ リストとフルテキスト インデックスの関連付け

SQL Server 2008 では、ストップ リストが導入されています。ストップ リストは、ストップ ワード (ノイズ ワードとも呼ばれます) の一覧です。ストップ リストは各フルテキスト インデックスに関連付けられ、そのストップ リスト内の単語がそのインデックスのフルテキスト クエリに適用されます。既定では、システム ストップ リストは、新しいフルテキスト インデックスに関連付けられます。ただし、独自のストップ リストを作成して使用することもできます。詳細については、「ストップ ワードとストップ リスト」を参照してください。

たとえば、次の CREATE FULLTEXT STOPLISTTransact-SQL ステートメントでは、システム ストップ リストからコピーして、myStoplist3 という名前の新しいフルテキスト ストップ リストを作成します。

CREATE FULLTEXT STOPLIST myStoplist FROM SYSTEM STOPLIST;
GO

次の ALTER FULLTEXT STOPLISTTransact-SQL ステートメントでは、myStoplist という名前のストップ リストを変更して、単語 'en' をまずスペイン語用に、次にフランス語用に追加します。

ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'Spanish';
ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'French';
GO

フルテキスト インデックスの更新

標準の SQL Server インデックスと同様に、フルテキスト インデックスは、関連付けられたテーブルの中でデータが変更されると、自動的に更新されます。これは既定の動作です。指定したスケジュール間隔または手動でフルテキスト インデックスを最新の状態に保つこともできます。フルテキスト インデックスの作成は時間とリソースの消費が大きいため、インデックスの更新は、通常、非同期プロセスで実行します。この非同期プロセスは、バックグラウンドで実行され、ベース テーブルの変更後にフルテキスト インデックスを最新の状態に維持します。ベース テーブルのそれぞれの変更後すぐにフルテキスト インデックスを更新すると、リソースを大量に消費することがあります。そのため、更新、挿入、または削除の率が非常に高い場合は、クエリのパフォーマンスが低下する可能性があります。この問題が発生した場合、リソースについてクエリと競合しないよう、手動による変更追跡の更新をスケジュール設定して、適宜、大量の変更に対応することを検討してください。

作成状態を監視するには、FULLTEXTCATALOGPROPERTY 関数または OBJECTPROPERTYEX 関数を使用します。カタログ作成状態を取得するには、次のステートメントを実行します。

SELECT FULLTEXTCATALOGPROPERTY('AdvWksDocFTCat', 'Populatestatus');

通常、カタログ全体の作成を実行している間は、結果として 1 が返されます。

例 : AdventureWorks のフルテキスト検索のセットアップ (Transact-SQL)

次の 2 部構成の例では、AdventureWorks データベースに AdvWksDocFTCat という名前のフルテキスト カタログを作成し、次に、AdventureWorks の Document テーブルにフルテキスト インデックスを作成します。このステートメントによって、セットアップ時に指定した既定のディレクトリ内にフルテキスト カタログが作成されます。AdvWksDocFTCat というフォルダが既定のディレクトリ内にあります。

  1. AdvWksDocFTCat という名前のフルテキスト カタログを作成するために、この例では、CREATE FULLTEXT CATALOG ステートメントを使用します。

    USE AdventureWorks;
    GO
    CREATE FULLTEXT CATALOG AdvWksDocFTCat;
    
  2. Document テーブルにフルテキスト インデックスを作成する前に、テーブルに一意の単一列で NULL 値にならないインデックスが含まれていることを確認します。次の CREATE INDEX ステートメントでは、Document テーブルの DocumentID 列に、一意のインデックス ui_ukDoc を作成します。

    CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);
    
  3. 一意のキーを作成したら、次の CREATE FULLTEXT INDEX ステートメントを使用して、Document テーブルにフルテキスト インデックスを作成できます。

    CREATE FULLTEXT INDEX ON Production.Document
    (
        Document                         --Full-text index column name 
            TYPE COLUMN FileExtension    --Name of column that contains file type information
            Language 2057                 --2057 is the LCID for British English
    )
    KEY INDEX ui_ukDoc ON AdvWksDocFTCat --Unique index
    WITH CHANGE_TRACKING AUTO            --Population type;
    GO
    

    この例で定義する TYPE COLUMN では、"Document" 列 (バイナリ型) の各行のドキュメント型が含まれる、テーブルの型列を指定します。この型列には、特定の行のドキュメントのユーザー指定ファイル拡張子 (".doc"、".xls" など) が格納されます。Full-Text Engine では、特定の行のファイル拡張子を使用して、その行のデータを解析するために使用する正しいフィルタを呼び出します。その行のバイナリ データをフィルタが解析した後、指定されたワード ブレーカがコンテンツを解析します (この例では、英語 (U.K.) のワード ブレーカを使用します)。フィルタ処理が行われるのは、インデックス作成時か、フルテキスト インデックスへの自動変更追跡が有効になっている場合にユーザーがベース テーブルで列を挿入または列を更新したときだけである点に注意してください。詳細については、「フルテキスト検索フィルタ」を参照してください。

一意のインデックスを作成するには

インデックスの詳細については、「インデックス」を参照してください。

フルテキスト インデックスに関する情報を表示するには

カタログ ビューまたは動的管理ビュー

説明

sys.fulltext_index_catalog_usages (Transact-SQL)

フルテキスト カタログからフルテキスト インデックスへの参照ごとに 1 行のデータを返します。

sys.fulltext_index_columns (Transact-SQL)

フルテキスト インデックスの一部となっている列ごとに 1 行のデータを格納します。

sys.fulltext_index_fragments (Transact-SQL)

フルテキスト インデックスでは、フルテキスト インデックス フラグメントと呼ばれる内部テーブルを使用して逆インデックスのデータを保存します。このビューを使用すると、これらのフラグメントに関するメタデータを照会できます。このビューは、フルテキスト インデックスが含まれているすべてのテーブルのフルテキスト インデックス フラグメントごとに 1 行のデータを格納しています。

sys.fulltext_indexes (Transact-SQL)

表形式オブジェクトのフルテキスト インデックスごとに 1 行のデータを保持します。

sys.dm_fts_index_keywords (Transact-SQL)

指定されたテーブルのフルテキスト インデックスのコンテンツに関する情報を返します。

sys.dm_fts_index_keywords_by_document (Transact-SQL)

指定されたテーブルについて、フルテキスト インデックスのドキュメント レベルのコンテンツに関連する情報を返します。個々のキーワードは、複数のドキュメントに出現する場合があります。

sys.dm_fts_index_population (Transact-SQL)

現在実行中の、フルテキスト インデックス設定に関する情報を返します。