Comparaison des fonctions de texte intégral et des prédicats de texte intégral

Les fonctions CONTAINSTABLE et FREETEXTTABLE sont utilisées pour spécifier les requêtes de texte intégral qui renvoient les rangs de valeurs appropriés pour chaque ligne. Bien que ces fonctions soient très similaires, elles sont utilisées différemment des prédicats de texte intégral CONTAINS et FREETEXT.

Bien que les prédicats de texte intégral et les fonctions de texte intégral soient utilisés pour les requêtes de texte intégral, et que la syntaxe servant à spécifier la condition de recherche de texte intégral soit la même pour les prédicats et les fonctions, il existe des différences majeures quant à leur utilisation. La liste suivante précise les points importants de similarité et de différence :

  • CONTAINS et FREETEXT retournent tous les deux une valeur TRUE ou FALSE ; par ailleurs, ils sont spécifiés dans les clauses WHERE ou HAVING d'une instruction SELECT.
  • CONTAINSTABLE et FREETEXTTABLE renvoient tous deux une table de zéro ligne, une ligne ou davantage ; par conséquent, elles doivent toujours être spécifiées dans la clause FROM.
  • CONTAINS et FREETEXT peuvent uniquement être utilisés pour spécifier les critères de sélection que Microsoft SQL Server utilise pour déterminer l'appartenance de l'ensemble de résultats.
  • CONTAINSTABLE et FREETEXTTABLE sont également utilisées pour spécifier des critères de sélection. La table renvoyée possède une colonne appelée KEY qui comporte les valeurs des clés de texte intégral. Chaque table inscrite de texte intégral possède une colonne dont les valeurs sont assurées d'être uniques. Les valeurs renvoyées dans la colonne KEY de CONTAINSTABLE ou de FREETEXTTABLE constituent les valeurs uniques, de la table inscrite en texte intégral, des lignes qui correspondent aux critères de sélection spécifiés dans la condition de recherche de texte intégral.

En outre, la table produite par CONTAINSTABLE et FREETEXTTABLE a une colonne nommée RANK, qui contient des valeurs allant de 0 à 1 000. Une valeur inférieure indique une pertinence plus faible. Ces valeurs servent à établir le rang des lignes retournées en fonction de leur correspondance par rapport aux critères de sélection.

ms142494.note(fr-fr,SQL.90).gifRemarque :
La valeur du rang indique uniquement un ordre relatif de pertinence pour les lignes de l'ensemble de résultats. La valeur réelle n'a pas d'importance et n'est pas censée être identique à chaque exécution de la requête. Pour plus d'informations sur le classement, consultez Présentation du classement.

Les requêtes CONTAINS et FREETEXT ne retournent aucune valeur de rang.

Lorsque des requêtes s'exécutent à l'aide des fonctions CONTAINSTABLE et FREETEXTTABLE, les lignes correspondantes retournées doivent être jointes de manière explicite aux lignes de la table SQL Server d'origine.

L'exemple suivant 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 avec le nom de catégorie « Seafood » sont ignorées. Seules les lignes dont la valeur de classement est supérieure ou égale à 2 sont renvoyées.

ms142494.note(fr-fr,SQL.90).gifRemarque :
Pour exécuter certains exemples de cette rubrique, vous devez installer la base de données Northwind. Pour plus d'informations sur l'installation de la base de données Northwind, consultez Téléchargement des exemples de bases de données Northwind et pubs.
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

Comparaison entre CONTAINSTABLE et CONTAINS

La fonction CONTAINSTABLE et le prédicat CONTAINS utilisent des conditions de recherche similaires.

Cependant, dans CONTAINSTABLE, vous spécifiez la table qui fait l'objet de la recherche de texte intégral, la colonne (ou l'ensemble des colonnes) dans la table où effectuer la recherche, ainsi que la condition de recherche. Un paramètre facultatif permet à l'utilisateur d'indiquer que seul le plus grand nombre de correspondances doit être retourné. Pour plus d'informations, consultez la section « Limitation des ensembles de résultats » de cette rubrique.

CONTAINSTABLE retourne une table qui comporte une colonne intitulée RANK. Cette colonne RANK contient une valeur pour chaque ligne, indiquant son degré de correspondance avec les critères de sélection. Plus la valeur du rang d'une ligne est élevée, plus la ligne de la requête de texte intégral donnée est pertinente.

Comparaison entre FREETEXTTABLE et FREETEXT

La requête suivante étend une requête FREETEXTTABLE pour renvoyer les lignes des rangs les plus élevés en premier et ajouter ensuite le rang de chaque ligne à la liste de sélection. Pour spécifier la requête, il faut 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 de valeur de rang égal ou supérieur à 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

Identification du nom de colonne clé unique

Lors de l'écriture de requêtes qui utilisent des fonctions d'ensemble de lignes, il est nécessaire de connaître le nom de la colonne clé unique. Chaque table activée pour la recherche de texte intégrale a une propriété TableFulltextKeyColumn qui contient l'ID de colonne de la colonne sélectionnée pour l'application des lignes uniques de la table. Cet exemple illustre l'obtention du nom de la colonne clé par programme.

USE AdventureWorks;
GO
DECLARE @key_column sysname
SET @key_column = Col_Name(Object_Id('Production.Document'),
ObjectProperty(Object_id('Production.Document'),
'TableFulltextKeyColumn') 
)
SELECT @key_column AS 'Unique Key Column';
GO

Limitation des ensembles de résultats pour retourner les résultats les plus pertinents

Dans de nombreuses requêtes de texte intégral, le nombre d'éléments répondant aux critères de recherche est très important. Pour éviter que les requêtes ne retournent un trop grand nombre de correspondances, utilisez l'argument facultatif top_n_by_rank dans CONTAINSTABLE et FREETEXTTABLE et spécifiez le nombre de correspondances d'après le rang que vous voulez en retour.

ms142494.note(fr-fr,SQL.90).gifRemarque :
L'argument top_n_by_rank renvoie un sous-ensemble de lignes satisfaisant la requête de texte intégral. Si top_n_by_rank est associé à d'autres prédicats, la requête peut renvoyer moins de lignes que le nombre de lignes correspondant effectivement à tous les prédicats.

À l'aide de ces informations, Microsoft SQL Server classe les correspondances par rang et ne retourne que celles qui atteignent le nombre spécifié. Ce choix peut considérablement améliorer les performances. Par exemple, une requête qui doit normalement retourner 100 000 lignes d'une table en comprenant 1 million, est traitée plus rapidement si seules les 100 premières lignes sont demandées.

Si vous voulez que les 3 premières correspondances uniquement soient retournées dans l'exemple précédent à l'aide de CONTAINSTABLE, la requête doit ressembler à ce qui suit :

USE Northwind;
GO
SELECT   K.RANK, CompanyName, ContactName, Address
FROM      Customers AS C
         INNER JOIN
         CONTAINSTABLE(Customers,Address, 'ISABOUT ("des*",
            Rue WEIGHT(0.5),
            Bouchers WEIGHT(0.9))', 3) AS K
         ON C.CustomerID = K.[KEY];
GO

Voici l'ensemble de résultats obtenu :

RANK CompanyName          ContactName       address            
---- ------------         -----------       -------            
123  Bon app'             Laurence Lebihan  12, rue des Bouchers 
65   Du monde entier      Janine Labrune    67, rue des Cinquante Otages 
15   France restauration  Carine Schmitt    54, rue Royale     

L'exemple suivant retourne la description et le nom des 10 premières catégories de produits alimentaires dont la colonne Description contient les mots « sweet and savory » à proximité du mot « sauces » ou « candies ».

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)'
      , 10
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY];
GO

Voir aussi

Autres ressources

CONTAINSTABLE (Transact-SQL)
FREETEXTTABLE (Transact-SQL)

Aide et Informations

Assistance sur SQL Server 2005