Alimenter des index de recherche en texte intégral

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

La création et la maintenance d’un index de texte intégral consistent à alimenter l’index à l’aide d’un processus appelé population (également appelé crawl).

Types de population

Un index de texte intégral prend en charge les types de remplissage suivants :

  • Remplissage complet
  • Remplissage automatique ou manuel fondé sur le suivi des modifications
  • Remplissage incrémentiel basé sur un horodatage

Population complète

Lors d'un remplissage complet, les entrées d'index sont générées pour toutes les lignes d'une table ou d'une vue indexée. Une alimentation complète d'un index de recherche en texte intégral crée des entrées d'index pour toutes les lignes de la table de base ou de la vue indexée.

Par défaut, SQL Server alimente complètement un nouvel index de recherche en texte intégral dès que celui-ci est créé.

  • D’une part, l’ensemble de la population peut consommer une quantité importante de ressources. Par conséquent, lorsque vous créez un index de texte intégral pendant une période de pointe, il est souvent préférable de différer le remplissage complet jusqu’à une période creuse, en particulier si la table de base d’un index de texte intégral est volumineuse.
  • D’autre part, le catalogue de texte intégral auquel l’index appartient n’est pas utilisable tant que tous ses index de recherche en texte intégral ne sont pas alimentés.

Pour créer un index de recherche en texte intégral sans le remplir immédiatement, spécifiez la clause CHANGE_TRACKING OFF, NO POPULATION dans l’instruction CREATE FULLTEXT INDEX. Si vous spécifiez CHANGE_TRACKING MANUAL, le moteur d’indexation et de recherche en texte intégral ne remplit pas le nouvel index de recherche en texte intégral tant que vous n’exécutez pas une instruction ALTER FULLTEXT INDEX à l’aide de la clause START FULL POPULATION ou START INCREMENTAL POPULATION.

Exemple - Créer un index de recherche en texte intégral sans exécuter une alimentation complète

L'exemple ci-après crée un index de recherche en texte intégral sur la table Production.Document de l'exemple de base de données AdventureWorks . Cet exemple utilise WITH CHANGE_TRACKING OFF, NO POPULATION pour retarder le remplissage complet initial.

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  
  

Exemple - Effectuer une population complète d’une table

L'exemple ci-après exécute un remplissage complet de la table Production.Document de la base de données exemple AdventureWorks.

ALTER FULLTEXT INDEX ON Production.Document  
   START FULL POPULATION;  

Population fondée sur le suivi des modifications

Vous pouvez, si vous le souhaitez, utiliser le suivi des modifications pour maintenir un index de texte intégral après son remplissage complet initial. La surcharge associée au suivi des modifications est réduite, car SQL Server gère une table dans laquelle il suit les modifications apportées à la table de base depuis la dernière alimentation. Quand vous utilisez le suivi des modifications, SQL Server conserve un enregistrement des lignes de la table de base ou de la vue indexée ayant été modifiées par des opérations de mise à jour, de suppression ou d’insertion. Les modifications apportées aux données à l’aide de WRITETEXT et d’UPDATETEXT ne sont pas répercutées dans l’index de recherche en texte intégral, et ne sont pas prises en compte par le suivi des modifications.

Remarque

Pour les tables contenant une colonne timestamp, vous pouvez utiliser un chargement incrémentiel au lieu du suivi des modifications.

Quand vous activez le suivi des modifications pendant la création d’index, SQL Server alimente complètement le nouvel index de recherche en texte intégral immédiatement après sa création. Ensuite, les modifications font l'objet d'un suivi et propagées à l'index de recherche en texte intégral.

Activer le suivi des modifications

Il existe deux types de suivi des modifications :

  • Automatique (optionCHANGE_TRACKING AUTO). Le suivi des modifications automatique est le comportement par défaut.
  • Manuel (option CHANGE_TRACKING MANUAL).

Le type de suivi des modifications détermine la façon dont l'index de recherche en texte intégral est alimenté, comme expliqué ci-après.

  • Remplissage automatique

    Par défaut, ou si vous spécifiez CHANGE_TRACKING AUTO, le moteur de texte intégral utilise la population automatique pour l’index de texte intégral. Une fois le chargement complet initial terminé, les modifications sont suivies au fur et à mesure que les données sont modifiées dans la table de base, et ces modifications sont propagées automatiquement. L'index de recherche en texte intégral étant toutefois mis à jour en arrière-plan, il se peut que les modifications propagées ne soient pas répercutées immédiatement dans l'index.

    Pour commencer à suivre les modifications avec remplissage automatique

    Exemple - Modifier un index de recherche en texte intégral pour qu’il utilise le suivi des modifications automatique
    L'exemple ci-après modifie l'index de recherche en texte intégral de la table HumanResources.JobCandidate de l'exemple de base de données AdventureWorks pour qu'il utilise le suivi des modifications avec alimentation automatique.

    USE AdventureWorks;  
    GO  
    ALTER FULLTEXT INDEX ON HumanResources.JobCandidate SET CHANGE_TRACKING AUTO;  
    GO   
    
  • Saisie manuelle

    Si vous spécifiez CHANGE_TRACKING MANUAL, le Moteur de texte intégral utilise le remplissage manuel de l'index de texte intégral. Une fois le remplissage complet initial terminé, les données modifiées dans la table de base font l'objet d'un suivi. Toutefois, ils ne sont pas propagés à l’index de texte intégral tant que vous n’exécutez pas une instruction ALTER FULLTEXT INDEX ... START UPDATE POPULATION. Vous pouvez utiliser SQL Server Agent pour appeler régulièrement cette instruction Transact-SQL.

    Pour commencer le suivi des modifications avec remplissage manuel

    Exemple - Créer un index de recherche en texte intégral avec le suivi des modifications manuel
    L'exemple ci-après crée un index de recherche en texte intégral utilisant le suivi des modifications avec alimentation manuelle pour la table HumanResources.JobCandidate de la base de données exemple 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  
    

    Exemple - Lancer une population manuelle
    L'exemple ci-après exécute une alimentation manuelle sur l'index de recherche en texte intégral avec suivi des modifications de la table HumanResources.JobCandidate de l'exemple de base de données AdventureWorks.

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

Désactiver le suivi des modifications

Chargement incrémentiel à partir d’un horodatage

Le remplissage incrémentiel est un autre mécanisme permettant de remplir manuellement un index de texte intégral. Si une table reçoit un volume important d’insertions, le remplissage incrémentiel peut s’avérer plus efficace que le remplissage manuel.

Vous pouvez exécuter un remplissage incrémentiel pour un index de recherche en texte intégral dont CHANGE_TRACKING est défini sur MANUAL ou OFF.

Pour qu’un remplissage incrémentiel soit possible, la table indexée doit comporter une colonne de type de données timestamp. S'il n'existe pas de colonne timestamp, le remplissage incrémentiel ne peut pas être effectué.

SQL Server utilise la colonne timestamp pour identifier des lignes qui ont été modifiées depuis la dernière alimentation. L'alimentation incrémentielle met alors à jour l'index de texte intégral pour les lignes ajoutées, supprimées ou modifiées après la dernière alimentation, ou alors que celle-ci était en cours. À la fin d’un remplissage, le moteur de recherche en texte intégral enregistre une nouvelle valeur timestamp. Il s’agit de la plus grande valeur timestamp trouvée par l’utilitaire de rassemblement SQL. Cette valeur sera utilisée lors du prochain démarrage de l’alimentation incrémentielle.

Dans certains cas, la demande de remplissage incrémentiel entraîne un remplissage complet.

  • Une demande d'alimentation incrémentielle pour une table sans colonne de type timestamp entraîne une opération d'alimentation complète.
  • Si la première alimentation d'un index de recherche en texte intégral est une alimentation incrémentielle, elle indexe toutes les lignes, ce qui équivaut à une alimentation complète.
  • Si des métadonnées affectant l’index de texte intégral de la table ont changé depuis la dernière alimentation, les demandes d’alimentation incrémentielle sont traitées comme des populations complètes. Cela concerne les modifications de métadonnées provoquées par des modifications de définitions de colonne, d'index ou d'index de recherche en texte intégral.

Lancer une population incrémentielle

Pour exécuter un chargement incrémentiel, exécutez une instruction ALTER FULLTEXT INDEX avec la clause START INCREMENTAL POPULATION.

Créer ou modifier une planification de population incrémentielle

  1. Dans Management Studio, dans l’Explorateur d’objets, développez le serveur.

  2. Développez Bases de données, puis développez la base de données qui contient l’index de texte intégral.

  3. Développez Tables.

    Cliquez avec le bouton droit sur la table sur laquelle l’index de recherche en texte intégral est défini, sélectionnez Index de recherche en texte intégralet, dans le menu contextuel Index de recherche en texte intégral , cliquez sur Propriétés. La boîte de dialogue Propriétés d’index de recherche en texte intégral s’affiche.

    Important

    Si la table ou la vue de base ne contient pas une colonne du type de données timestamp, une alimentation incrémentielle n’est pas possible.

  4. Dans le volet Sélectionner une page, sélectionnez Planifications.

    Utilisez cette page pour créer ou gérer les planifications d’une tâche SQL Server Agent qui démarre un remplissage incrémentiel de la table de base ou de la vue indexée de l’index de recherche en texte intégral.

    Les options sont les suivantes :

    • Pour créer une planification, cliquez sur Nouveau.

      La boîte de dialogue Nouvelle planification de la table d’indexation de texte intégral s’affiche pour vous permettre de créer une planification. Pour enregistrer la planification, cliquez sur OK.

      Important

      Une tâche de l’Agent SQL Server (Démarrer le remplissage incrémentiel de la table sur nom_base_de_données.nom_table) est associée à une nouvelle planification après avoir fermé la boîte de dialogue Propriétés de l’index de texte intégral. Si vous créez plusieurs planifications pour le même index de texte intégral, elles utilisent toutes la même tâche.

    • Pour changer une planification existante, sélectionnez-la, puis cliquez sur Modifier.

      La boîte de dialogue Nouvelle planification de la table d’indexation de texte intégral s’affiche pour vous permettre de modifier la planification.

      Remarque

      Pour plus d’informations sur la modification d’un travail SQL Server Agent, consultez Modifier un travail.

    • Pour supprimer une planification existante, sélectionnez-la, puis cliquez sur Supprimer.

  5. Cliquez sur OK.

Résoudre les erreurs dans une alimentation de texte intégral (analyse)

Lorsqu'une erreur se produit durant une analyse, la fonction d'analyse de la recherche en texte intégral crée et conserve un journal de l'analyse sous forme de fichier texte. Chaque journal d’exploration correspond à un catalogue en texte intégral spécifique. Par défaut, les journaux d’analyse pour une instance donnée (dans cet exemple, l’instance par défaut) figurent dans le dossier %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG.

Le fichier journal d'exploration suit le schéma de dénomination suivant :

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

Les parties variables du nom de fichier du journal d’analyse sont les suivantes.

  • < DatabaseID> – ID d’une base de données. < dbid> est un nombre à cinq chiffres avec des zéros initiaux.
  • < FullTextCatalogID> – ID du catalogue de texte intégral. < catid> est un nombre de cinq chiffres avec des zéros initiaux.
  • < n> - Entier indiquant qu’il existe un ou plusieurs journaux d’exploration pour le même catalogue de texte intégral.

Par exemple, SQLFT0000500008.2 est le fichier journal d’analyse pour une base de données ayant un ID de base de données = 5 et un ID de catalogue de texte intégral = 8. Le 2 à la fin du nom de fichier indique qu'il existe deux fichiers journaux d'analyse pour cette combinaison base de données/catalogue.

Voir aussi

sys.dm_fts_index_population (Transact-SQL)
Commencer à utiliser la recherche en texte intégral
Créer et gérer des index de recherche en texte intégral
CREATE FULLTEXT INDEX (Transact-SQL)
ALTER FULLTEXT INDEX (Transact-SQL)