フルテキスト検索の概要

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

SQL Server データベースでは、フルテキストが既定で有効になっています。 ただし、フルテキスト クエリを実行するには、事前にフルテキスト カタログを作成し、検索するテーブルまたはインデックス付きビューにフルテキスト インデックスを作成しておく必要があります。

フルテキスト検索をセットアップする 2 つの手順

フルテキスト検索をセットアップする基本的な手順は 2 つあります。

  1. フルテキスト カタログを作成します。
  2. 検索するテーブルまたはインデックス付きビューにフルテキスト インデックスを作成します。

各フルテキスト インデックスは、フルテキスト カタログに属している必要があります。 フルテキスト インデックスごとにテキスト カタログを作成するか、複数のフルテキスト インデックスを特定のカタログに関連付けることができます。 フルテキスト カタログは仮想オブジェクトであり、ファイル グループには属しません。 カタログは、フルテキスト インデックスのグループを指す論理的概念です。

注意

これらの手順では、SQL Server のインストール時にオプションのフルテキスト検索コンポーネントをインストールしていると想定しています。 インストールしていない場合は、SQL Server セットアップを再実行して追加する必要があります。

ウィザードでフルテキスト検索をセットアップする

ウィザードを使用してフルテキスト検索をセットアップする方法については、「Use the Full-Text Indexing Wizard」 (フルテキスト インデックス作成ウィザードの使用) を参照してください。

Transact-SQL でフルテキスト検索をセットアップする

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

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

    USE AdventureWorks;  
    GO  
    CREATE FULLTEXT CATALOG AdvWksDocFTCat;  
    

    詳細については、「Create and Manage Full-Text Catalogs」 (フルテキスト インデックスの作成と管理) を参照してください。

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

    CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentNode);  
    
  3. 次の DROP FULLTEXT INDEX ステートメントを使用して、Document テーブルの既存のフルテキスト インデックスを削除します。

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

    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 では、特定の行のファイル拡張子を使用して、その行のデータを解析するために使用する正しいフィルターを呼び出します。 フィルターで行のバイナリ データが解析された後は、指定したワード ブレーカーで内容が解析されます (この例では、英国英語のワード ブレーカーが使用されています)。詳細については、「検索のフィルターの構成と管理」を参照してください。

    詳細については、「Create and Manage Full-Text Indexes」 (フルテキスト インデックスの作成と管理) を参照してください。

フルテキスト インデックスのオプションの選択

言語の選択

列の言語の選択については、「 フルテキスト インデックス作成時の言語の選択」をご覧ください。

ファイルグループの選択

フルテキスト インデックスを構築するプロセスでは、大量の I/O が発生します。 要約すると、SQL Server のデータの読み取りと、フィルター処理されたデータのフルテキスト インデックスへの反映で構成されます。 I/O パフォーマンスの最大化に最適なデータベース ファイル グループにフルテキスト インデックスを配置するか、他のボリュームの別のファイル グループにフルテキスト インデックスを配置することをお勧めします。

フルテキスト カタログの選択

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

次のガイドラインを考慮してください。

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

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

一意のインデックスを関連付ける

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

ストップリストを関連付ける

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

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

CREATE FULLTEXT STOPLIST myStoplist FROM SYSTEM STOPLIST;  
GO  

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

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

詳細については、「 フルテキスト検索に使用するストップワードとストップリストの構成と管理」を参照してください。

フルテキスト インデックスを更新する

標準の SQL Server インデックスと同様に、フルテキスト インデックスは、関連付けられたテーブルの中でデータが変更されると、自動的に更新されます。 これが既定の動作です。 指定したスケジュール間隔または手動でフルテキスト インデックスを最新の状態に保つこともできます。 フルテキスト インデックスの作成には時間がかかり、リソースが大量に消費される可能性があります。 そのため、インデックスの更新は、通常、非同期プロセスで実行します。この非同期プロセスは、バックグラウンドで実行され、ベース テーブルの変更後にフルテキスト インデックスを最新の状態に維持します。

ベース テーブルのそれぞれの変更後すぐにフルテキスト インデックスを更新した場合にも、リソースが大量に消費されます。 そのため、更新、挿入、または削除の率が高い場合は、クエリのパフォーマンスが低下する可能性があります。 この問題が発生した場合、リソースについてクエリと競合しないよう、手動による変更追跡の更新をスケジュール設定して、適宜、大量の変更に対応することを検討してください。

詳細については、「Populate Full-Text Indexes」 (フルテキスト インデックスの作成) を参照してください。

次のステップ

SQL Server フルテキスト検索をセットアップすると、フルテキスト クエリを実行できます。 詳細については、「Query with Full-Text Search」 (フルテキスト検索でのクエリ) を参照してください。