Vue d'ensemble des fonctions et prédicats de texte intégral

Les requêtes de texte intégral utilisent les prédicats de texte intégral (CONTAINS et FREETEXT) et les fonctions de texte intégral (CONTAINSTABLE et FREETEXTTABLE). Ces derniers prennent en charge la syntaxe Transact-SQL enrichie qui accepte divers formulaires de termes de requête. Pour écrire des requêtes de texte intégral, vous devez apprendre quand et comment utiliser ces prédicats et ces fonctions. Cette rubrique recense les prédicats et les fonctions et présente les similitudes entre le prédicat CONTAINS et la fonction CONTAINSTABLE.

Vue d'ensemble des prédicats de texte intégral (CONTAINS et FREETEXT)

CONTAINS et FREETEXT sont spécifiés dans la clause WHERE ou HAVING d'une instruction SELECT. Ils peuvent être associés à l'un quelconque des autres prédicats Transact-SQL tels que LIKE et BETWEEN.

Les prédicats CONTAINS et FREETEXT retournent une valeur TRUE ou FALSE. Ils peuvent être utilisés uniquement pour spécifier des critères de sélection permettant de déterminer si une ligne donnée correspond à la requête de texte intégral. Les lignes correspondantes sont retournées dans le jeu de résultats.

Lorsque vous utilisez CONTAINS ou FREETEXT, vous pouvez spécifier une colonne unique, une liste de colonnes, ou toutes les colonnes de la table sur laquelle porte la recherche. Vous pouvez éventuellement spécifier la langue dont les ressources seront utilisées par une requête de texte intégral donnée pour l'analyse lexicale et la recherche de radical, les consultations de dictionnaire des synonymes et la suppression de mots parasites.

Les prédicats CONTAINS et FREETEXT sont utiles pour différents types de correspondance, comme expliqué ci-après.

  • Utilisez CONTAINS (ou CONTAINSTABLE) pour des concordances précises ou approximatives (moins précises) avec des mots isolés ou des expressions, des répétitions ou des concordances pondérées. Lorsque vous utilisez CONTAINS, vous devez spécifier au moins une condition de recherche qui indique le texte que vous recherchez ainsi que les conditions qui déterminent les correspondances.

    Vous pouvez utiliser une opération logique entre les conditions de recherche. Pour plus d'informations, consultez la section Utilisation des opérateurs booléens AND, OR, AND NOT (dans CONTAINS et CONTAINSTABLE), présentée ultérieurement dans cette rubrique.

  • Utilisez FREETEXT (ou FREETEXTTABLE) pour rechercher des correspondances de signification, et non pas le libellé exact, des mots, expressions ou phrases spécifiés (chaîne en texte libre). Des correspondances sont générées si un terme ou une forme de quelque terme que ce soit est trouvé dans l'index de recherche en texte intégral d'une colonne spécifiée.

Pour exécuter des requêtes sur des serveurs liés, vous pouvez utiliser des noms en quatre parties dans CONTAINS ou FREETEXT. Pour plus d'informations, consultez Interrogation de serveurs liés (Recherche en texte intégral).

Pour plus d'informations sur la syntaxe et les arguments de ces prédicats, consultez CONTAINS (Transact-SQL) et FREETEXT (Transact-SQL).

[!REMARQUE]

Les prédicats de texte intégral ne sont pas autorisés dans la clause OUTPUT lorsque le niveau de compatibilité de la base de données a la valeur 100.

Exemples

A. Utilisation de CONTAINS avec <simple_term>

L'exemple ci-dessous recherche tous les produits qui contiennent le mot "Mountain" et qui coûtent $80.99.

USE AdventureWorks;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
   AND CONTAINS(Name, 'Mountain');
GO

B. Utilisation de FREETEXT pour rechercher des mots contenant les valeurs de caractère spécifiées

L'exemple ci-après recherche tous les documents contenant les mots liés à « vital », « safety » et « components ».

USE AdventureWorks;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO

Vue d'ensemble des fonctions de texte intégral (CONTAINSTABLE et FREETEXTTABLE)

Les fonctions CONTAINSTABLE et FREETEXTTABLE sont référencées comme un nom de table régulier dans la clause FROM d'une instruction SELECT. Ils retournent une table contenant aucune, une ou plusieurs ligne(s) correspondant à la requête de texte intégral. La table retournée contient uniquement les lignes de la table de base qui correspondent aux critères de sélection spécifiés dans la condition de recherche en texte intégral de la fonction.

Les requêtes utilisant l'une de ces fonctions retournent une valeur de classement de pertinence (RANK) et une clé de texte intégral (KEY) pour chaque ligne, comme suit :

  • KEY (colonne)

    La colonne KEY retourne les valeurs uniques des lignes retournées. La colonne KEY peut être utilisée pour spécifier des critères de sélection.

  • RANK (colonne)

    La colonne RANK retourne une valeur de classement pour chaque ligne qui indique le degré de correspondance de cette dernière avec les critères de sélection. Plus la valeur de classement du texte ou document d'une ligne est élevée, plus celle-ci est pertinente pour la requête de texte intégral. Notez que différentes lignes peuvent avoir le même classement. Vous pouvez limiter le nombre de correspondances à retourner en spécifiant le paramètre facultatif top_n_by_rank. Pour plus d'informations, consultez Limitation des jeux de résultats classés (recherche en texte intégral) et Classement des résultats d'une requête de recherche (Recherche en texte intégral).

Lorsque vous utilisez l'une ou l'autre de ces fonctions, vous devez spécifier la table de base sur laquelle doit porter la recherche en texte intégral. Comme avec les prédicats, vous pouvez spécifier une colonne unique, une liste de colonnes, ou toutes les colonnes de la table sur laquelle doit porter la recherche, et éventuellement, la langue dont les ressources seront utilisées par une requête de texte intégral donnée.

CONTAINSTABLE est utile pour les mêmes types de correspondance que CONTAINS, et FREETEXTTABLE est utile pour les mêmes types de correspondance que FREETEXT. Pour plus d'informations, consultez la section Vue d'ensemble des prédicats de texte intégral (CONTAINS et FREETEXT), présentée précédemment dans cette rubrique. Lorsque vous exécutez des requêtes qui utilisent les fonctions CONTAINSTABLE et FREETEXTTABLE, vous devez joindre explicitement des lignes qui sont retournées avec les lignes de la table de base SQL Server.

Pour plus d'informations sur la syntaxe et les arguments de ces fonctions, consultez CONTAINSTABLE (Transact-SQL) et FREETEXTTABLE (Transact-SQL).

Exemples

A. Utilisation de CONTAINSTABLE

L'exemple ci-après retourne la description et le nom de toutes les catégories de produits alimentaires dont la colonne Description contient les mots « sweet and savory » à proximité du mot « sauces » ou « candies ». Toutes les lignes contenant le nom de catégorie « Seafood » sont ignorées. Seules les lignes dont la valeur de classement est supérieure ou égale à 2 sont retournées.

USE Northwind;
GO
SELECT FT_TBL.Description, 
   FT_TBL.CategoryName, 
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description, 
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
   AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO

B. Utilisation de FREETEXTTABLE

L'exemple ci-après étend une requête FREETEXTTABLE afin de retourner en premier les lignes dont le niveau de classement est le plus élevé et d'ajouter le classement de chaque ligne à la liste de sélection. Pour spécifier la requête, vous devez savoir que CategoryID constitue la colonne clé unique de la table Categories.

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories AS FT_TBL 
     INNER JOIN
     FREETEXTTABLE(Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Voici l'extension de la même requête renvoyant uniquement les lignes dont la valeur de classement est égale ou supérieure à 10 :

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories FT_TBL 
     INNER JOIN
     FREETEXTTABLE (Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

Utilisation des opérateurs booléens AND, OR, AND NOT (dans CONTAINS et CONTAINSTABLE)

Le prédicat CONTAINS et la fonction CONTAINSTABLE utilisent les mêmes conditions de recherche. Ils permettent tous les deux de combiner plusieurs termes à rechercher via les opérateurs booléens AND, OR, AND NOT, pour effectuer des opérations logiques. Par exemple, vous pouvez utiliser AND pour rechercher des lignes qui contiennent à la fois « latte » et « New York-style bagel ». Vous pouvez utiliser AND NOT pour rechercher les lignes qui contiennent « bagel » mais qui ne contiennent pas « cream cheese ».

[!REMARQUE]

En revanche, FREETEXT et FREETEXTTABLE traitent les termes booléens comme des mots à rechercher.

Pour plus d'informations sur la façon de combiner CONTAINS avec d'autres prédicats qui utilisent les opérateurs logiques AND, OR et NOT, consultez Condition de recherche (Transact-SQL).

Exemple

L'exemple ci-après utilise la table ProductDescription de la base de données AdventureWorks. Cette requête utilise le prédicat CONTAINS pour rechercher des descriptions dont l'ID de description est autre que 5 et qui contiennent les mots « Aluminum » et « spindle ». La condition de recherche utilise l'opérateur booléen AND.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
   CONTAINS(Description, ' Aluminum AND spindle');
GO

Considérations supplémentaires

Chaque table activée pour la recherche en texte intégral comporte une colonne qui est utilisée pour garantir l'unicité des lignes de la table (colonne cléunique). Lorsque vous écrivez le type CONTAINSTABLE ou FREETEXTTABLE des requêtes de texte intégral, vous devez connaître le nom de la colonne clé unique. Pour plus d'informations, consultez Procédure : obtenir des informations sur la colonne de clés de texte intégral (Transact-SQL).

De nombreux termes de requête dépendent fortement du comportement de l'analyseur lexical. Pour être certain d'utiliser l'analyseur lexical (et le générateur de formes dérivées) et le dictionnaire des synonymes appropriés, nous vous recommandons de spécifier l'argument LANGUAGE. Pour plus d'informations, consultez Méthodes conseillées pour le choix d'une langue lors de la création d'un index de recherche en texte intégral.

Lorsqu'une requête de texte intégral est définie, le Moteur d'indexation et de recherche en texte intégral supprime les mots vides (également appelés mots parasites) des critères de recherche. Les mots vides sont des mots tels que « un », « et », « est » ou « le » dont les occurrences sont fréquentes mais qui ne sont pas utiles pour une recherche de texte spécifique. Les mots vides sont répertoriés dans une liste de mots vides. Chaque index de recherche en texte intégral est associé à une liste de mots vides spécifique, qui détermine les mots vides à omettre de la requête ou de l'index au moment de l'indexation. Pour plus d'informations, consultez Mots vides et listes de mots vides.

La mise en correspondance avec le dictionnaire des synonymes intervient pour les requêtes Transact-SQL CONTAINS et CONTAINSTABLE qui spécifient la clause FORMSOF THESAURUS et par défaut, pour les requêtes FREETEXT et FREETEXTABLE.