フルテキスト インデックスの作成

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

フルテキスト インデックスの作成と保持では、 作成 (または クロール) と呼ばれるプロセスを使用してインデックスが作成されます。

設定の種類

フルテキスト インデックスは次の種類の作成に対応しています。

  • すべてのカタログの作成
  • 変更の追跡に基づく自動または手動作成
  • タイムスタンプに基づく増分作成

すべてのカタログの作成

すべてのカタログの作成では、テーブルまたはインデックス付きビューのすべての行に対してインデックス エントリが作成されます。 フルテキスト インデックスのすべてのカタログの作成では、ベース テーブルまたはインデックス付きビューのすべての行に対してインデックス エントリが作成されます。

既定では、新しいフルテキスト インデックスが作成されると、SQL Server によってすぐにそのカタログが作成されます。

  • 一方で、すべてのカタログの作成では大量のリソースが消費される可能性があります。 このため、ピーク期間にフルテキスト インデックスを作成する場合は、すべてのカタログの作成をオフピーク時間まで遅らせることが推奨されています (特にフルテキスト インデックスのベース テーブルが大きい場合)。
  • 一方で、インデックスが属するフルテキスト カタログは、そのすべてのフルテキスト インデックスのカタログが作成されるまで使用できません。

すぐに値を入力せずにフルテキスト インデックスを作成するには、CREATE FULLTEXT INDEX ステートメントに CHANGE_TRACKING OFF, NO POPULATION 句を指定します。 CHANGE_TRACKING MANUAL を指定する場合、Full-Text Engine は、START FULL POPULATION または START INCREMENTAL POPULATION により ALTER FULLTEXT INDEX ステートメントが実行されるまで、新しいフルテキスト インデックスに値を入力しません。

例 - 完全作成を実行せずにフルテキスト インデックスを作成する

次の例では、 Production.Document サンプル データベースの AdventureWorks テーブルにフルテキスト インデックスを作成します。 この例では WITH CHANGE_TRACKING OFF, NO POPULATION を利用し、最初の完全作成を遅らせます。

CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);  
CREATE FULLTEXT CATALOG AW_Production_FTCat;  
CREATE FULLTEXT INDEX ON Production.Document  
(  
    Document                         --Full-text index column name   
        TYPE COLUMN FileExtension    --Name of column that contains file type information  
        Language 1033                 --1033 is LCID for the English language  
)  
    KEY INDEX ui_ukDoc  
    ON AW_Production_FTCat  
    WITH CHANGE_TRACKING OFF, NO POPULATION;  
GO  
  

例 - テーブルで完全作成を実行する

次の例では、 Production.Document サンプル データベースの AdventureWorks テーブルで完全作成を実行します。

ALTER FULLTEXT INDEX ON Production.Document  
   START FULL POPULATION;  

変更の追跡に基づく作成

必要に応じて、変更の追跡を使用して、完全作成が最初に実行された後のフルテキスト インデックスを保持することができます。 変更の追跡には若干のオーバーヘッドが伴います。これは、前回のカタログ作成以降にベース テーブルに対して行われた変更を追跡するテーブルが SQL Server で保持されるためです。 変更の追跡を使用すると、ベース テーブルまたはインデックス付きビューで更新、削除、または挿入によって変更された行の記録が SQL Server で保持されます。 WRITETEXT や UPDATETEXT によるデータの変更は、フルテキスト インデックスには反映されず、変更の監視でも取得されません。

注意

timestamp 列を含んでいるテーブルには、変更の追跡の代わりに増分作成を使用できます。

インデックス作成時に変更の追跡を有効にすると、SQL Server で新しいフルテキスト インデックスが作成された直後にそのインデックスですべてのカタログの作成が実行されます。 それ以降は、変更が追跡されてフルテキスト インデックスに反映されます。

変更の追跡を有効化

変更の追跡には、次の 2 種類があります。

  • 自動 (CHANGE_TRACKING AUTO オプション)。 既定では自動で変更が追跡されます。
  • 手動 (CHANGE_TRACKING MANUAL オプション)。

変更の追跡の種類によって、フルテキスト インデックスのカタログ作成方法が次のように決まります。

  • 自動でのカタログ作成

    既定では、あるいは CHANGE_TRACKING AUTO を指定した場合、Full-Text Engine によってフルテキスト インデックスに自動的にカタログが作成されます。 すべてのカタログの作成が最初に実行された後に、ベース テーブルでデータが変更されると変更が追跡され、追跡された変更が自動的に反映されます。 ただし、フルテキスト インデックスはバックグラウンドで更新されるため、変更が直ちにインデックスに反映されないこともあります。

    自動でのカタログ作成を指定して変更の追跡を開始するには

    例 - 自動で変更が追跡されるようにフルテキスト インデックスを変更する
    次の例では、 HumanResources.JobCandidate サンプル データベースの AdventureWorks テーブルで、自動作成に変更の追跡を使用するようにフルテキスト インデックスを変更します。

    USE AdventureWorks;  
    GO  
    ALTER FULLTEXT INDEX ON HumanResources.JobCandidate SET CHANGE_TRACKING AUTO;  
    GO   
    
  • 手動でのカタログ作成

    CHANGE_TRACKING MANUAL を指定すると、Full-Text Engine ではフルテキスト インデックスに対して手動作成が使用されます。 完全作成が最初に実行された後に、ベース テーブルでデータが変更されると変更が追跡されます。 ただし、ALTER FULLTEXT INDEX ... START UPDATE POPULATION ステートメントを実行するまで、フルテキスト インデックスには反映されません。 SQL Server エージェントを使用すると、この Transact-SQL ステートメントを定期的に呼び出すことができます。

    手動でのカタログ作成を指定して変更の追跡を開始するには

    例 - 手動で変更を追跡するようにフルテキスト インデックスを作成する
    次の例では、 HumanResources.JobCandidate サンプル データベースの AdventureWorks テーブルで、手動でのカタログ作成を指定した変更の追跡を使用するフルテキスト インデックスを作成します。

    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 CHANGE_TRACKING=MANUAL;  
    GO  
    

    例 - 手動作成を実行する
    次の例では、 HumanResources.JobCandidate サンプル データベースの AdventureWorks テーブルで、変更が追跡されるフルテキスト インデックスに対して手動でのカタログ作成を実行します。

    USE AdventureWorks;  
    GO  
    ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION;  
    GO  
    

変更の追跡を無効化

タイムスタンプに基づく増分作成

増分作成は、フルテキスト インデックスに手動でカタログを作成するためのもう 1 つのメカニズムです。 テーブルで大量の挿入が行われた場合は、手動でのカタログ作成よりも増分作成を使用した方が効率的です。

増分作成は、CHANGE_TRACKING が MANUAL または OFF に設定されているフルテキスト インデックスに対して実行できます。

増分作成では、インデックスが設定されたテーブルに timestamp データ型の列が存在する必要があります。 timestamp 型の列が存在しない場合には、増分作成を実行できません。

SQL Server は、timestamp 列を使用して前回の作成後に変更された行が識別されます。 増分作成では、前回のカタログ作成後、または作成中に追加、削除、または変更された行のフルテキスト インデックスが更新されます。 作成が終わると、Full-Text Engine は新しい timestamp 型の値を記録します。 この値は、SQL Gatherer が検出した timestamp 型の最大値です。 次回、増分作成を開始するとき、この値が使用されます。

増分作成が要求された結果、完全作成が行われることもあります。

  • timestamp 型の列を含んでいないテーブルで増分作成を要求すると、完全作成が実行されます。
  • フルテキスト インデックスの最初のカタログ作成が増分作成の場合、すべての行にインデックスが付けられるため、完全作成と同じになります。
  • 前回のカタログ作成後にテーブルのフルテキスト インデックスに影響するようなメタデータの変更があった場合、増分作成の要求はすべてのカタログの作成として実行されます。 これには、列、インデックス、またはフルテキスト インデックスの定義を変更したことによるメタデータの変更が含まれます。

増分作成を実行する

増分作成を実行するには、START INCREMENTAL POPULATION 句を利用して ALTER FULLTEXT INDEX ステートメントを実行します。

増分作成のスケジュールを作成または変更する

  1. Management Studio で、オブジェクト エクスプローラーでサーバーを展開します。

  2. [データベース]を展開し、フルテキスト インデックスを含むデータベースを展開します。

  3. [テーブル]を展開します。

    フルテキスト インデックスが定義されているテーブルを右クリックし、 [フルテキスト インデックス]コンテキスト メニューの [フルテキスト インデックス] をクリックして、 [プロパティ]をクリックします。 [フルテキスト インデックスのプロパティ] ダイアログ ボックスが表示されます。

    重要

    ベース テーブルまたはビューに timestamp データ型の列が含まれていない場合は、増分作成はできません。

  4. [ページの選択] ペインで [スケジュール] をクリックします。

    このページでは、フルテキスト インデックスのベース テーブルまたはインデックス付きビューの増分作成を開始する SQL Server エージェント ジョブのスケジュールを作成または管理できます。

    次のようなオプションがあります。

    • 新しいスケジュールを作成するには、[新規作成] をクリックします。

      スケジュールを作成できる [新しいフルテキスト インデックス テーブルのスケジュール] ダイアログ ボックスが表示されます。 スケジュールを保存するには、 [OK] をクリックします。

      重要

      [フルテキスト インデックスのプロパティ]ダイアログ ボックスを閉じると、新しいスケジュールが SQL Server エージェント ジョブ (database_name. table_name でテーブルの増分作成を開始) に関連付けられます。 同じフルテキスト インデックスのスケジュールを複数作成した場合、すべてのスケジュールで同じジョブが使用されます。

    • 既存のスケジュールを変更するには、それを選択し、[編集] をクリックします。

      スケジュールを変更できる [新しいフルテキスト インデックス テーブルのスケジュール] ダイアログ ボックスが表示されます。

      注意

      SQL Server エージェント ジョブの変更については、「ジョブの変更」を参照してください。

    • 既存のスケジュールを削除するには、それを選択し、[削除] をクリックします。

  5. [OK] を選択します。

フルテキスト作成 (クロール) で発生したエラーのトラブルシューティング

クロール時にエラーが発生すると、フルテキスト検索クロール ログ記録機能によってクロール ログが作成および保持されます。このログはプレーンテキスト ファイルです。 各クロール ログは特定のフルテキスト カタログに対応します。 既定では、所与のインスタンス (この例では、既定のインスタンス) のクロール ログは %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG フォルダーにあります。

クロール ログは次のような規則に従って命名されます。

SQLFT<DatabaseID><FullTextCatalogID>.LOG[<n>]

クロール ログ ファイルの可変部分は次のようになります。

  • <DatabaseID> - データベースの ID。 <dbid> は、ゼロで始まる 5 桁の数字です。
  • <FullTextCatalogID> - フルテキスト カタログ ID。 <catid> は、ゼロで始まる 5 桁の数字です。
  • <n> - 同じフルテキスト カタログに 1 つ以上のクロール ログが存在することを示す整数です。

たとえば、SQLFT0000500008.2 はデータベース ID が 5 で、フルテキスト カタログ ID が 8 のクロール ログ ファイルです。 ファイル名の最後の 2 は、このデータベースとカタログのペアに 2 つのクロール ログ ファイルが存在することを示しています。

参照

sys.dm_fts_index_population (Transact-SQL)
フルテキスト検索の概要
フルテキスト インデックスの作成と管理
CREATE FULLTEXT INDEX (Transact-SQL)
ALTER FULLTEXT INDEX (Transact-SQL)