Partage via


Activer la recherche sémantique sur les tables et les colonnes

S'applique à : SQL Server

Décrit la procédure d'activation ou de désactivation de l'indexation sémantique statistique sur des colonnes sélectionnées qui contiennent des documents ou du texte.

La recherche sémantique statistique utilise les index créés par la recherche en texte intégral et crée des index supplémentaires. Conséquence de cette dépendance sur la recherche en texte intégral, vous créez un index sémantique lorsque vous définissez un nouvel index de recherche en texte intégral ou lorsque vous modifiez un index de recherche en texte intégral existant. Vous pouvez créer un index sémantique à l'aide d'instructions Transact-SQL ou en utilisant l'Assistant Indexation de texte intégral et d'autres boîtes de dialogue de SQL Server Management Studio, comme décrit dans cet article.

Créer un index sémantique

Exigences et restrictions concernant la création d'un index sémantique

  • Vous pouvez créer un index sur des objets de base de données pris en charge pour l'indexation de texte intégral, notamment les tables et les vues indexées.

  • Avant de pouvoir activer l'indexation sémantique pour des colonnes spécifiques, les conditions préalables suivantes doivent être remplies :

    • Un catalogue de texte intégral doit exister pour la base de données.

    • La table doit avoir un index de recherche en texte intégral.

    • Les colonnes sélectionnées doivent participer à l'index de recherche en texte intégral.

    Vous pouvez créer et activer toutes ces conditions préalables en même temps.

  • Vous pouvez créer un index sémantique sur des colonnes présentant l'un des types de données pris en charge pour l'indexation de texte intégral. Pour plus d’informations, consultez Créer et gérer des index de recherche en texte intégral.

  • Vous pouvez spécifier tout type de document pris en charge pour l’indexation de texte intégral pour des colonnes varbinary(max) . Pour plus d'informations, consultez Procédure : déterminer les types de documents pouvant être indexés dans cet article.

  • L’indexation sémantique crée deux types d’index pour les colonnes que vous sélectionnez : un index d’expressions clés et un index de similarité de document. Vous ne pouvez pas sélectionner un seul type d'index lorsque vous activez l'indexation sémantique. En revanche, vous interroger ces deux index de manière indépendante. Pour plus d’informations, consultez Rechercher des expressions clés dans les documents avec la recherche sémantique et Rechercher des documents similaires ou connexes avec la recherche sémantique.

  • Si vous ne spécifiez pas de LCID explicitement pour un index sémantique, seules la langue principale et ses statistiques linguistiques associées sont utilisées pour l'indexation sémantique.

  • Si vous spécifiez une langue pour une colonne pour laquelle le modèle linguistique n'est pas disponible, la création de l'index échoue et retourne un message d'erreur.

Créer un index sémantique lorsqu’il n’y a pas d’index de recherche en texte intégral

Lorsque vous créez un index de recherche en texte intégral avec l’instruction CREATE FULLTEXT INDEX, vous avez la possibilité d’activer l’indexation sémantique au niveau de la colonne en spécifiant le mot clé STATISTICAL_SEMANTICS dans le cadre de la définition de la colonne. Vous pouvez également activer l'indexation sémantique lorsque vous utilisez l'Assistant Indexation de texte intégral pour créer un index de recherche en texte intégral.

Créer un index sémantique à l'aide de Transact-SQL

Appelez l’instruction CREATE FULLTEXT INDEX et spécifiez STATISTICAL_SEMANTICS pour chaque colonne sur laquelle vous souhaitez créer un index sémantique. Pour plus d’informations sur toutes les options de cette instruction, consultez CREATE FULLTEXT INDEX (Transact-SQL).

Exemple 1 : créer un index unique, un index de recherche en texte intégral et un index sémantique

L’exemple suivant crée un catalogue de texte intégral par défaut, ft. L'exemple crée ensuite un index unique sur la colonne JobCandidateID de la table HumanResources.JobCandidate de l'exemple de base de données AdventureWorks2022. Cet index unique est requis en tant que colonne clé pour un index de recherche en texte intégral. L’exemple crée ensuite un index de recherche en texte intégral et un index sémantique sur la colonne Resume.

CREATE FULLTEXT CATALOG ft AS DEFAULT
GO

CREATE UNIQUE INDEX ui_ukJobCand
    ON HumanResources.JobCandidate(JobCandidateID)
GO

CREATE FULLTEXT INDEX ON HumanResources.JobCandidate
    (Resume
        Language 1033
        Statistical_Semantics
    )
    KEY INDEX JobCandidateID
    WITH STOPLIST = SYSTEM
GO

Exemple 2 : créer un index sémantique et de recherche en texte intégral sur plusieurs colonnes avec remplissage différé de l'index

L'exemple suivant crée un catalogue de texte intégral, documents_catalog, dans l'exemple de base de données AdventureWorks2022. L'exemple crée ensuite un index de recherche en texte intégral qui utilise ce nouveau catalogue. L’index de recherche en texte intégral est créé sur les colonnes Title, DocumentSummary et Document de la table Production.Document, tandis que l’index sémantique est uniquement créé sur la colonne Document. Cet index de recherche en texte intégral utilise le catalogue de texte intégral nouvellement créé et un index de clé unique existant, PK_Document_DocumentID. Comme recommandé, cette clé d'index est créée sur une colonne d'entiers, DocumentID. L'exemple spécifie le LCID de l'anglais, 1033, qui est la langue des données dans les colonnes.

Cet exemple spécifie également que le suivi des modifications est désactivé et sans remplissage. Plus tard, durant les heures creuses, cet exemple utilise une instruction ALTER FULLTEXT INDEX pour démarrer un remplissage complet sur le nouvel index et activer le suivi des modifications automatique.

CREATE FULLTEXT CATALOG documents_catalog
GO

CREATE FULLTEXT INDEX ON Production.Document
    (
    Title
        Language 1033,
    DocumentSummary
        Language 1033,
    Document
        TYPE COLUMN FileExtension
        Language 1033
        Statistical_Semantics
    )
    KEY INDEX PK_Document_DocumentID
        ON documents_catalog
        WITH CHANGE_TRACKING OFF, NO POPULATION
GO

Plus tard, pendant une heure creuse, l'index est rempli :

ALTER FULLTEXT INDEX ON Production.Document SET CHANGE_TRACKING AUTO
GO

Créer un nouvel index sémantique à l'aide de SQL Server Management Studio

Exécutez l’Assistant Indexation de texte intégral et activez Sémantiques statistiques dans la page Sélectionner les colonnes de la table pour chaque colonne sur laquelle vous souhaitez créer un index sémantique. Pour plus d’informations, notamment sur le démarrage de l’Assistant Indexation de texte intégral, consultez Utiliser l’Assistant Indexation de texte intégral.

Créer un index sémantique lorsqu’un index de recherche en texte intégral existe

Vous pouvez ajouter l’indexation sémantique lorsque vous modifiez un index de recherche en texte intégral existant avec l’instruction ALTER FULLTEXT INDEX. Vous pouvez également ajouter l'indexation sémantique à l'aide de différentes boîtes de dialogue dans SQL Server Management Studio.

Ajouter un index sémantique à l'aide de Transact-SQL

Appelez l’instruction ALTER FULLTEXT INDEX avec les options décrites dans la section suivante pour chaque colonne sur laquelle vous souhaitez ajouter un index sémantique. Pour plus d’informations sur toutes les options de cette instruction, consultez ALTER FULLTEXT INDEX (Transact-SQL).

Les index sémantiques et de recherche en texte intégral sont à nouveau remplis après un appel à ALTER, sauf spécification contraire de votre part.

  • Pour ajouter l’indexation de texte intégral uniquement à une colonne, utilisez la syntaxe ADD.

  • Pour ajouter l’indexation sémantique et de texte intégral à une colonne, utilisez la syntaxe ADDavec l’option STATISTICAL_SEMANTICS.

  • Pour ajouter l’indexation sémantique à une colonne dont l’indexation de texte intégral est déjà activée, utilisez l’option ADD STATISTICAL_SEMANTICS. Vous ne pouvez ajouter l'indexation sémantique qu'à une colonne dans une instruction ALTER individuelle.

Exemple : ajouter l'indexation sémantique à une colonne dont l'indexation de texte intégral est déjà activée

L’exemple suivant modifie un index de recherche en texte intégral existant sur la table Production.Document dans l’exemple de base de données AdventureWorks2022. Il ajoute un index sémantique sur la colonne Document de la table Production.Document, qui comporte déjà un index de recherche en texte intégral. L'exemple spécifie que l'index n’est pas rempli à nouveau automatiquement.

ALTER FULLTEXT INDEX ON Production.Document
    ALTER COLUMN Document
        ADD Statistical_Semantics
    WITH NO POPULATION
GO

Ajouter un index sémantique à l'aide de SQL Server Management Studio

Vous pouvez modifier les colonnes activées pour l’indexation de texte intégral et sémantique dans la page Colonnes d’index de recherche en texte intégral de la boîte de dialogue Propriétés d’index de recherche en texte intégral . Pour plus d’informations, consultez Gérer les index de recherche en texte intégral.

Modifier un index sémantique

Exigences et restrictions concernant la modification d'un index existant

  • Vous ne pouvez pas modifier un index existant pendant que le remplissage de l'index est en cours. Pour plus d’informations sur la surveillance de la progression du remplissage d’index, consultez Gérer et surveiller la recherche sémantique.

  • Vous ne pouvez pas ajouter d'indexation à une colonne, ni modifier ou supprimer l'indexation pour la même colonne, dans un appel unique à l'instruction ALTER FULLTEXT INDEX.

Supprimer un index sémantique

Vous pouvez supprimer l’indexation sémantique lorsque vous modifiez un index de recherche en texte intégral existant avec l’instruction ALTER FULLTEXT INDEX. Vous pouvez également supprimer l'indexation sémantique à l'aide de différentes boîtes de dialogue dans SQL Server Management Studio.

Supprimer un index sémantique à l'aide de Transact-SQL

Pour supprimer l’indexation sémantique uniquement pour une ou plusieurs colonnes, appelez l’instruction ALTER FULLTEXT INDEX avec l’option ALTER COLUMN <column_name> DROP STATISTICAL_SEMANTICS. Vous pouvez supprimer l'indexation de plusieurs colonnes dans une instruction ALTER unique.

USE database_name;
GO

ALTER FULLTEXT INDEX
    ALTER COLUMN column_name
    DROP STATISTICAL_SEMANTICS;
GO

Pour supprimer à la fois l'indexation plein texte et l'indexation sémantique à partir d'une colonne, appelez l'instruction ALTER FULLTEXT INDEX avec l'option ALTER COLUMN <column_name> DROP.

USE database_name;
GO

ALTER FULLTEXT INDEX
    ALTER COLUMN column_name
    DROP;
GO

Supprimer un index sémantique avec SQL Server Management Studio

Vous pouvez modifier les colonnes activées pour l’indexation de texte intégral et sémantique dans la page Colonnes d’index de recherche en texte intégral de la boîte de dialogue Propriétés d’index de recherche en texte intégral . Pour plus d’informations, consultez Gérer les index de recherche en texte intégral.

Exigences et restrictions concernant la suppression d'un index sémantique

  • Vous ne pouvez pas supprimer l'indexation de texte intégral d'une colonne tout en conservant l'indexation sémantique. L'indexation sémantique dépend de l'indexation de texte intégral pour les résultats de ressemblance de document.

  • Vous ne pouvez pas spécifier l'option NO POPULATION lorsque vous supprimez l'indexation sémantique de la dernière colonne d'une table pour laquelle l'indexation sémantique a été activée. Un cycle de remplissage est obligatoire pour supprimer les résultats indexés précédemment.

Vérifier si la recherche sémantique est activée sur des objets de base de données

La recherche sémantique est-elle activée pour une base de données ?

Interrogez la propriété IsFullTextEnabled de la fonction de métadonnées DATABASEPROPERTYEX (Transact-SQL).

Une valeur de retour de 1 indique que la recherche en texte intégral et la recherche sémantique sont activées pour la base de données. Une valeur de retour 0 indique qu’elles ne sont pas activées.

SELECT DATABASEPROPERTYEX('database_name', 'IsFullTextEnabled');
GO

La recherche sémantique est-elle activée pour une table ?

Interrogez la propriété TableFullTextSemanticExtraction de la fonction de métadonnées OBJECTPROPERTYEX (Transact-SQL).

Une valeur de retour de 1 indique que la recherche sémantique est activée pour la table ; une valeur de retour de 0 indique qu'elle n'est pas activée.

SELECT OBJECTPROPERTYEX(OBJECT_ID('table_name'), 'TableFullTextSemanticExtraction')
GO

La recherche sémantique est-elle activée pour une colonne ?

Pour déterminer si la recherche sémantique est activée pour une colonne spécifique :

  • Interrogez la propriété StatisticalSemantics de la fonction de métadonnées COLUMNPROPERTY (Transact-SQL).

    Une valeur de retour de 1 indique que la recherche sémantique est activée pour la colonne ; une valeur de retour de 0 indique qu'elle n'est pas activée.

    SELECT COLUMNPROPERTY(OBJECT_ID('table_name'), 'column_name', 'StatisticalSemantics');
    GO
    
  • Interrogez l’affichage catalogue sys.fulltext_index_columns (Transact-SQL) de l’index de recherche en texte intégral.

    Une valeur 1 dans la colonne statistical_semantics indique que la colonne spécifiée est activée pour l’indexation sémantique en plus de l’indexation de texte intégral.

    SELECT * FROM sys.fulltext_index_columns
    WHERE object_id = OBJECT_ID('table_name');
    GO
    
  • Dans l’Explorateur d’objets dans Management Studio, cliquez avec le bouton droit sur une colonne, puis sélectionnez Propriétés. Dans la page Général de la boîte de dialogue Propriétés de la colonne , vérifiez la valeur de la propriété Statistical Semantics .

    Une valeur True indique que la colonne spécifiée est activée pour l'indexation sémantique en plus de l'indexation de texte intégral.

Vérifier quelles langues sont prises en charge pour la recherche sémantique

Moins de langues sont prises en charge pour l'indexation sémantique que pour l'indexation de texte intégral. Par conséquent, il peut y avoir des colonnes que vous pouvez indexer pour la recherche en texte intégral, mais pas pour la recherche sémantique.

Interrogez l’affichage catalogue sys.fulltext_semantic_languages (Transact-SQL).

SELECT * FROM sys.fulltext_semantic_languages;
GO

Les langues suivantes sont prises en charge pour l'indexation sémantique. Cette liste représente la sortie de l’affichage catalogue sys.fulltext_semantic_languages (Transact-SQL), classée par LCID.

Langage LCID
Chinois traditionnel 1028
Allemand 1031
Anglais (US) 1033
Français 1036
Italien 1040
Brésilien 1046
Russe 1049
Suédois 1053
Chinois simplifié 2052
British English 2057
Portugais 2070
Chinois (Hong Kong R.A.S., RPC) 2070
Espagnol 3082
Chinese (Singapore) 4100
Chinese (Macao (R.A.S.)) 5124

Remarque

Si les résultats sont vides, vous devez télécharger et installer la base de données des statistiques linguistiques sémantiques. Pour plus d’informations, consultez Installer, attacher et inscrire la base de données de la Base de langages statistiques pour la recherche sémantique.

Déterminer les types de documents pouvant être indexés

Interrogez l’affichage catalogue sys.fulltext_document_types (Transact-SQL).

Si le type de document que vous souhaitez indexer ne figure pas dans la liste des types pris en charge, vous devrez peut-être rechercher, télécharger et installer des filtres supplémentaires. Pour plus d’informations, consultez Afficher ou modifier des filtres et des analyseurs lexicaux inscrits.

Meilleure pratique : créer un groupe de fichiers distinct pour les index sémantiques et de recherche en texte intégral

Créez un groupe de fichiers séparé pour les index sémantiques et de recherche en texte intégral si l'allocation d'espace disque pose problème. Les index sémantiques sont créés dans le même groupe de fichiers que l'index de recherche en texte intégral. Un index sémantique entièrement rempli peut contenir un grand nombre de données.

Problème : La recherche sur une colonne spécifique ne retourne aucun résultat

Est-ce qu'un LCID non-Unicode a été spécifié pour une langue Unicode ?

Il est possible d'activer l'indexation sémantique sur un type de colonne non-Unicode avec un LCID de langue qui comporte uniquement des termes Unicode, tels que LCID 1049 pour le russe. Dans ce cas, aucun résultat ne sera jamais retourné des index sémantiques sur cette colonne.