Créer et gérer des index de Full-Text

Les informations contenues dans les index de recherche en texte intégral sont utilisées par le moteur de Full-Text pour compiler des requêtes de texte intégral qui peuvent rapidement rechercher un tableau pour des mots ou combinaisons de mots particuliers. Un index de recherche en texte intégral stocke des informations sur les mots significatifs et leur emplacement dans une ou plusieurs colonnes d’une table de base de données. Un index de recherche en texte intégral est un type spécial d’index fonctionnel basé sur des jetons créé et géré par le moteur de Full-Text pour SQL Server. Le processus de création d’un index de recherche en texte intégral diffère de la création d’autres types d’index. Au lieu de construire une structure d’arborescence B basée sur une valeur stockée dans une ligne particulière, le moteur de Full-Text génère une structure d’index inversée, empilée et compressée basée sur des jetons individuels du texte indexé. La taille d’un index de recherche en texte intégral est limitée uniquement par les ressources de mémoire disponibles de l’ordinateur sur lequel l’instance de SQL Server est en cours d’exécution.

À compter de SQL Server 2008, les index de recherche en texte intégral sont intégrés au moteur de base de données, au lieu de résider dans le système de fichiers comme dans les versions précédentes de SQL Server. Pour une nouvelle base de données, le catalogue de texte intégral est désormais un objet virtuel qui n’appartient à aucun groupe de fichiers ; il s’agit simplement d’un concept logique qui fait référence à un groupe d’index de recherche en texte intégral. Notez toutefois qu’au cours de la mise à niveau d’une base de données SQL Server 2005, tout catalogue de texte intégral qui contient des fichiers de données, un nouveau groupe de fichiers est créé ; pour plus d’informations, consultez Mettre à niveau Full-Text Recherche.

Remarque

Dans SQL Server 2008 et versions ultérieures, le moteur de Full-Text réside dans le processus SQL Server, plutôt que dans un service distinct. L’intégration du moteur de Full-Text dans le moteur de base de données améliore la facilité de gestion de texte intégral, l’optimisation de la requête mixte et les performances globales.

Un seul index de recherche en texte intégral est autorisé par table. Pour qu’un index de recherche en texte intégral soit créé sur une table, la table doit avoir une colonne unique et unique non nulle. Vous pouvez créer un index de recherche en texte intégral sur des colonnes de type char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary et varbinary(max) pour la recherche en texte intégral. Création d’un index de recherche en texte intégral sur une colonne dont le type de données est varbinary, varbinary(max)imageou xml nécessite que vous spécifiiez une colonne de type. Une colonne de type est une colonne de table dans laquelle vous stockez l’extension de fichier (.doc, .pdf, .xls, etc.) du document dans chaque ligne.

Le processus de création et de maintenance d’un index de recherche en texte intégral est appelé une population (également connu sous le nom de parcours). Il existe trois types de remplissage d’index de recherche en texte intégral : population complète, population basée sur le suivi des modifications et population incrémentielle basée sur l’horodatage. Pour plus d’informations, consultez Alimenter des index de recherche en texte intégral.

Tâches courantes

Pour créer un index de recherche en texte intégral

Pour modifier un index de recherche en texte intégral

Pour supprimer un index de texte intégral

Dans cette rubrique

Full-Text Structure d’index

Une bonne compréhension de la structure d’un index de recherche en texte intégral vous aidera à comprendre le fonctionnement du moteur de Full-Text. Cette rubrique utilise l’extrait suivant de la table Document dans Adventure Works comme exemple de tableau. Cet extrait montre seulement deux colonnes, la colonne DocumentID et la colonne Title , et trois lignes de la table.

Pour cet exemple, nous partons du principe qu’un index de recherche en texte intégral a été créé sur la colonne Title .

Identifiant de Document Titre
1 Entretien des bras de manivelle et des pneus
2 Crochet de réflecteur avant et assemblage du réflecteur 3
3 Installation du support de réflecteur avant

Par exemple, le tableau suivant, qui montre Fragment 1, représente le contenu de l’index de texte intégral créé sur la colonne Titre de la table Document . Les index de recherche en texte intégral contiennent plus d’informations que ceux présentés dans ce tableau. La table est une représentation logique d’un index de recherche en texte intégral et est fournie uniquement à des fins de démonstration. Les lignes sont stockées dans un format compressé pour optimiser l’utilisation du disque.

Notez que les données ont été inversées des documents d’origine. L’inversion se produit, car les mots clés sont mappés aux ID de document. Pour cette raison, un index de recherche en texte intégral est souvent appelé index inversé.

Notez également que le mot clé « and » a été supprimé de l’index de recherche en texte intégral. Cela est fait car « et » est un mot d'arrêt, et la suppression de ces mots d'un index de texte intégral peut entraîner des économies considérables d'espace disque, ce qui améliore les performances des requêtes. Pour en savoir plus sur les mots d'arrêt, consultez Configurer et gérer les mots d'arrêt et les listes de mots d'arrêt pour Full-Text Recherche.

Fragment 1

Mot-clé ColId DocId Occurrence
Manivelle 1 1 1
ARM 1 1 2
Pneu 1 1 4
Entretien 1 1 5
Devant 1 2 1
Devant 1 3 1
Réflecteur 1 2 2
Réflecteur 1 2 5
Réflecteur 1 3 2
Parenthèse 1 2 3
Parenthèse 1 3 3
Assemblée 1 2 6
3 1 2 7
Installation 1 3 4

La colonne Mot clé contient une représentation d’un jeton unique extrait au moment de l’indexation. Les séparateurs de mots déterminent ce qui compose un élément de texte.

La colonne ColId contient une valeur qui correspond à une colonne particulière indexée en texte intégral.

La DocId colonne contient des valeurs pour un entier de huit octets qui correspond à une valeur de clé de texte intégral particulière dans une table indexée en texte intégral. Ce mappage est nécessaire lorsque la clé de texte intégral n’est pas un type de données entier. Dans ces cas, les correspondances entre les valeurs de clé de texte intégral et les valeurs DocId sont maintenues dans une table distincte appelée table de mappage DocId. Pour rechercher ces correspondances, utilisez la procédure stockée système sp_fulltext_keymappings. Pour satisfaire une condition de recherche, on doit lier les valeurs DocId de la table ci-dessus à la table de mappage DocId pour récupérer les lignes de la table de base interrogée. Si la valeur de clé de texte intégral de la table de base est un type entier, la valeur sert directement de DocId et aucun mappage n’est nécessaire. Par conséquent, l’utilisation de valeurs de clé de texte intégral entier peut vous aider à optimiser les requêtes de texte intégral.

La colonne Occurrence contient une valeur entière. Pour chaque valeur DocId, il existe une liste de valeurs d’occurrence qui correspondent aux décalages de mots relatifs du mot clé particulier dans ce DocId. Les valeurs d’occurrence sont utiles pour déterminer les correspondances d’expression ou de proximité, par exemple, les expressions ont des valeurs d’occurrences adjacentes numériquement. Ils sont également utiles pour calculer les scores de pertinence ; par exemple, le nombre d’occurrences d’un mot clé dans un DocId peut être utilisé dans le scoring.

Dans cette rubrique

fragments d’index Full-Text

L’index de recherche en texte intégral logique est généralement divisé entre plusieurs tables internes. Chaque table interne est appelée fragment d’index de texte intégral. Certains de ces fragments peuvent contenir des données plus récentes que d’autres. Par exemple, si un utilisateur met à jour la ligne suivante dont le DocId est 3 et que la table est suivie des modifications automatiquement, un nouveau fragment est créé.

DocumentID Titre
3 Réflecteur arrière

Dans l’exemple suivant, qui montre Fragment 2, le fragment contient des données plus récentes sur DocId 3 par rapport au fragment 1. Par conséquent, lorsque l’utilisateur interroge « Rélecteur arrière » les données de Fragment 2 sont utilisées pour DocId 3. Chaque fragment est marqué avec un horodatage de création qui peut être interrogé à l’aide de l’affichage catalogue sys.fulltext_index_fragments .

Fragment 2

Mot-clé ColId DocId Occ
Arrière 1 3 1
Réflecteur 1 3 2

Comme vous pouvez le voir à partir du fragment 2, les requêtes de texte intégral doivent interroger chaque fragment en interne et ignorer les entrées plus anciennes. Par conséquent, trop de fragments d’index de recherche en texte intégral dans l’index de recherche en texte intégral peuvent entraîner une dégradation substantielle des performances des requêtes. Pour réduire le nombre de fragments, réorganisez le catalogue de texte intégral à l’aide de l’option REORGANIZE de l’instruction ALTER FULLTEXT CATALOGTransact-SQL. Cette instruction effectue une fusion principale, qui fusionne les fragments en un seul fragment plus grand et supprime toutes les entrées obsolètes de l’index de recherche en texte intégral.

Après avoir été réorganisé, l’exemple d’index contient les lignes suivantes :

Mot-clé ColId DocId Occ
Manivelle 1 1 1
ARM 1 1 2
Pneu 1 1 4
Entretien 1 1 5
Devant 1 2 1
Arrière 1 3 1
Réflecteur 1 2 2
Réflecteur 1 2 5
Réflecteur 1 3 2
Parenthèse 1 2 3
Assemblée 1 2 6
3 1 2 7

Dans cette rubrique