Exécuter une requête avec une recherche en texte intégral

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

Écrivez des requêtes de recherche en texte intégral à l’aide des prédicats CONTAINS et FREETEXT et des fonctions de jeu de résultats CONTAINSTABLE et FREETEXTTABLE avec une instruction SELECT. Cet article fournit des exemples de chaque prédicat et de chaque fonction, et vous aide à choisir le mieux adapté.

  • Pour faire correspondre les mots et expressions, utilisez CONTAINS et CONTAINSTABLE.
  • Pour correspondre au sens, mais pas à la formulation exacte, utilisez FREETEXT et FREETEXTTABLE.

Exemples des différents prédicats et fonctions

Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.

Pour exécuter les exemples de requêtes, vous devez également configurer la recherche en texte intégral. Pour plus d’informations, consultez Prise en main de la recherche en texte intégral.

Exemple : CONTIENT

L’exemple suivant recherche tous les produits dont le prix est $80.99 et qui contiennent le mot Mountain :

USE AdventureWorks2025;
GO

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

Exemple : TEXTE LIBRE

L’exemple suivant recherche tous les documents qui contiennent des mots relatifs à des vital safety components :

USE AdventureWorks2025;
GO

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

Exemple : CONTAINSTABLE

L’exemple suivant renvoie l’identifiant de description et la description de tous les produits pour lesquels la Description colonne contient le mot aluminum près soit du mot light , soit du mot lightweight. Seules les lignes de rang supérieur à 2 sont renvoyées.

USE AdventureWorks2025;
GO

SELECT FT_TBL.ProductDescriptionID,
       FT_TBL.Description,
       KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN CONTAINSTABLE (Production.ProductDescription, Description, '(light NEAR aluminum) OR
      (lightweight NEAR aluminum)') AS KEY_TBL
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO

Exemple : FREETEXTTABLE

L’exemple suivant étend une FREETEXTTABLE requête pour retourner d’abord les lignes les mieux classées et ajouter le classement de chaque ligne à la liste de sélection. Pour écrire une requête similaire, il faut savoir que ProductDescriptionID c’est la colonne clé unique du ProductDescription tableau.

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Voici une extension de la même requête qui retourne seulement les lignes avec un classement égal ou supérieur à 10 :

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

Rechercher des mots ou rechercher une signification

CONTAINS et CONTAINSTABLE, ou FREETEXT et FREETEXTTABLE, sont utiles pour différents types d’appariement. Les informations suivantes vous aident à choisir le meilleur prédicat ou fonction pour votre requête :

CONTAINS et CONTAINSTABLE

  • Recherchez des correspondances exactes ou approximatives (moins précises) de mots et d’expressions.
  • Vous pouvez également effectuer les opérations suivantes :
    • Indiquez à quelle distance les mots doivent se trouver les uns des autres.
    • Retourner des correspondances pondérées.
    • Combiner des conditions de recherche avec des opérateurs logiques. Pour plus d’informations, voir Utiliser les opérateurs booléens (AND, OR et NOT) plus loin dans cet article.

FREETEXT et FREETEXTTABLE

  • Recherchez des correspondances de signification, et non pas du 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.

Comparer des prédicats et des fonctions

Les prédicats CONTAINS ou FREETEXT et les fonctions générant des ensembles de lignes CONTAINSTABLE ou FREETEXTTABLE ont une syntaxe et des options différentes. Les informations suivantes vous aident à choisir le meilleur prédicat ou fonction pour votre requête :

Prédicats CONTAINS et FREETEXT

Utilisation. Utilisez les prédicats de texte intégral CONTAINS et FREETEXT dans la clause WHERE ou HAVING d’une instruction SELECT.

Résultats. Les prédicats CONTAINS et FREETEXT retournent une valeur TRUE ou FALSE indiquant si une ligne donnée correspond à la requête en texte intégral. Les lignes correspondantes sont retournées dans le jeu de résultats.

Autres options. Vous pouvez combiner les prédicats avec n’importe lequel des autres prédicats Transact-SQL, tels que LIKE et BETWEEN.

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 sont utilisées par la requête de texte intégral pour l’analyse lexicale et la recherche de radical, les consultations de dictionnaire des synonymes et la suppression de mots parasites.

Vous pouvez utiliser un nom en quatre parties dans le CONTAINS prédicat ou FREETEXT pour interroger les colonnes indexées en texte intégral des tables cibles sur un serveur lié. Pour préparer un serveur distant à recevoir des requêtes de texte intégral, créez un index de recherche en texte intégral sur les tables et colonnes cibles du serveur distant, puis ajoutez le serveur distant comme serveur lié.

Pour plus d’informations sur la syntaxe et les arguments de ces prédicats, voir CONTAINS et FREETEXT.

Vue d’ensemble des fonctions d’ensemble de lignes CONTAINSTABLE et FREETEXTTABLE

Utilisation. Utilisez les fonctions de texte intégral CONTAINSTABLE et FREETEXTTABLE comme un nom de table ordinaire dans la clause FROM d’une instruction SELECT.

Vous devez spécifier la table de base à rechercher lorsque vous utilisez l’une de ces fonctions. 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 sont utilisées par une requête de texte intégral donnée.

En général, il faut relier les résultats de CONTAINSTABLE ou FREETEXTTABLE avec la table de base. Pour joindre les tables, vous devez connaître le nom de la colonne clé unique. Cette colonne, qui apparaît dans chaque tableau activé en texte intégral, sert à imposer des lignes uniques pour la table (la colonne clé unique). Pour plus d’informations sur la colonne clé, voir Créer et gérer des index en texte intégral.

Résultats. Ces fonctions retournent une table contenant zéro, une ou plusieurs lignes 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 également une valeur de classement de pertinence (RANK) et une clé de texte intégral (KEY) pour chaque ligne retournée, comme suit :

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

  • RANK colonne. La RANK colonne renvoie une valeur de rang pour chaque ligne qui indique à quel point la ligne correspondait aux 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. 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, voir Limiter les résultats de recherche par classement.

Pour plus d’informations sur la syntaxe et les arguments de ces fonctions, voir CONTAINSTABLE et FREETEXTTABLE.

Types spécifiques de recherches

Recherchez un mot ou une expression spécifique (terme simple)

Vous pouvez utiliser CONTAINS, CONTAINSTABLE, FREETEXT, ou FREETEXTTABLE rechercher dans un tableau un mot ou une expression spécifique. Par exemple, si vous souhaitez rechercher dans le ProductReview tableau de la AdventureWorks2025 base de données tous les commentaires sur un produit contenant la phrase learning curve, vous pouvez utiliser le CONTAINS prédicat comme suit :

USE AdventureWorks2025;
GO

SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS ((Comments), '"learning curve"');
GO

La condition de recherche, dans ce cas learning curve, peut être complexe et peut être composée d’un ou plusieurs termes.

Plus d’informations sur les recherches de termes simples

Dans une recherche en texte intégral, un mot (ou jeton) est une chaîne dont les limites sont identifiées par les analyseurs lexicaux appropriés, qui suivent les règles linguistiques de la langue spécifiée. Une expression valide est constituée de plusieurs mots, avec ou sans signes de ponctuation entre eux.

Par exemple, croissant est un mot, et café au lait est une expression. Des mots et expressions comme ceux-ci sont appelés termes simples.

CONTAINS et CONTAINSTABLE cherche une correspondance exacte pour l’expression. FREETEXT et FREETEXTTABLE décomposez la phrase en mots séparés.

Recherchez un mot avec un préfixe (terme préfixe)

Vous pouvez utiliser CONTAINS ou CONTAINSTABLE rechercher des mots ou expressions avec un préfixe spécifié. Toutes les entrées de la colonne qui contiennent le texte commençant par le préfixe spécifié sont retournées. Par exemple, pour rechercher toutes les lignes contenant le préfixe top-, comme dans topple, topping, et top, la requête ressemble à l’exemple suivant :

USE AdventureWorks2025;
GO

SELECT Description,
       ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS ((Description), '"top*"');
GO

Tout texte correspondant au texte spécifié avant l'astérisque (*) est renvoyé. Si le texte et l’astérisque ne sont pas délimités par des guillemets doubles, comme dans CONTAINS (DESCRIPTION, 'top*'), la recherche en texte intégral ne considère pas l’astérisque comme un joker.

Lorsque le préfixe est une expression, chaque jeton à l'intérieur de l'expression est considéré comme un préfixe distinct. Toutes les lignes dont les mots commencent par les termes préfixes sont retournées. Par exemple, le préfixe light bread* trouve les lignes contenant le texte light breaded, lightly breaded ou light bread, mais il ne renvoie pas lightly toasted bread.

Plus d’informations sur les recherches par préfixe

Un terme de préfixe fait référence à une chaîne apposée au devant d’un mot pour produire un mot dérivatif ou une forme fléchie.

  • Pour un seul terme préfixe, tout mot commençant par le terme spécifié fait partie de l’ensemble des résultats. Par exemple, le terme auto* correspond automaticà , automobile, et ainsi de suite.

  • Dans le cas d'une expression, chaque mot faisant partie de l'expression est considéré comme un terme préfixe. Par exemple, le terme auto tran* correspond à automatic transmission et automobile transducer, mais il ne correspond pas à automatic motor transmission.

Les recherches par préfixes sont prises en charge par CONTAINS et CONTAINSTABLE.

Recherchez les formes flexionnelles d’un mot spécifique (terme générationnel)

Vous pouvez utiliser CONTAINS, CONTAINSTABLE, FREETEXT, ou FREETEXTTABLE pour rechercher tous les différents temps et conjugaisons d’un verbe ou à la fois les formes singulière et plurielle d’un nom (une recherche d’inflexion) ou les formes synonymes d’un mot spécifique (recherche de thésaurus).

L’exemple suivant recherche n’importe quelle forme de foot (foot, feet, etc.) dans la Comments colonne du ProductReview tableau de la AdventureWorks2025 base de données :

USE AdventureWorks2025;
GO

SELECT Comments,
       ReviewerName
FROM Production.ProductReview
WHERE CONTAINS ((Comments), 'FORMSOF(INFLECTIONAL, "foot")');
GO

La recherche en texte intégral utilise des générateurs de formes dérivées, qui vous permettent de rechercher les différents temps et conjugaisons d’un verbe, ou à la fois le pluriel et le singulier d’un nom. Pour plus d’informations sur les générateurs de formes dérivées, consultez Configurer et gérer les analyseurs lexicaux et générateurs de formes dérivées.

Plus d’informations sur les recherches de termes de génération

Les formes fléchies correspondent aux différents temps et conjugaisons d’un verbe et au pluriel et au singulier d’un nom.

Par exemple, cherchez la forme flexionnelle du mot drive. Si diverses lignes du tableau contiennent les mots drive, drives, drove, driving et driven, ils figureraient tous dans l’ensemble de résultats, car chacun peut être généré par flexion à partir du mot drive.

FREETEXT et FREETEXTTABLE cherchez par défaut les termes flexionnels de tous les mots spécifiés. CONTAINS et CONTAINSTABLE soutenir un argument optionnel INFLECTIONAL .

Rechercher les synonymes d’un mot spécifique

Un dictionnaire des synonymes définit des synonymes spécifiés par l’utilisateur pour les termes. Pour plus d’informations sur les fichiers de thésaurus, voir Configurer et gérer les fichiers de thésaurus pour Full-Text recherche.

Par exemple, si une entrée , {car, automobile, truck, van}est ajoutée à un thésaurus, vous pouvez chercher la forme de thésaurus du mot car. Toutes les lignes du tableau interrogées qui incluent les mots automobile, truck, van, ou car apparaissent dans l’ensemble des résultats car chacun de ces mots appartient à l’ensemble d’expansion des synonymes contenant le mot car.

FREETEXT et FREETEXTTABLE utiliser le thésaurus par défaut. CONTAINS et CONTAINSTABLE soutenir un argument optionnel THESAURUS .

Cherchez un mot près d’un autre mot

Un terme de proximité indique des mots ou expressions qui sont proches les uns des autres. Vous pouvez également spécifier le nombre maximal de termes de non-recherche qui séparent le premier et le dernier terme de recherche. De plus, vous pouvez rechercher des mots ou des expressions dans n'importe quel ordre, ou dans l'ordre dans lequel vous les spécifiez.

Par exemple, vous voulez trouver les lignes où le mot ice est près du mot hockey ou où la phrase ice skating est proche de la phrase ice hockey.

Pour plus d’informations sur les recherches de proximité, voir Recherche de mots proches d’un autre Word avec NEAR.

Recherche de mots ou expressions utilisant des valeurs pondérées (terme pondéré)

Vous pouvez les CONTAINSTABLE utiliser pour chercher des mots ou des expressions et spécifier une valeur de pondération. La pondération d'un terme, qui est une mesure numérique comprise entre 0.0 et 1.0, indique l'importance de chaque mot et expression au sein d'un ensemble de mots et d'expressions. L'échelle de pondération oscille entre un minimum de 0.0 et un maximum de 1.0.

L’exemple suivant montre une requête qui recherche toutes les adresses de clients, à l’aide de pondérations, dans lesquelles tout texte commençant par la chaîne Bay contient soit Street, soit View. Les résultats attribuent un rang plus élevé aux lignes qui contiennent le plus de mots spécifiés.

USE AdventureWorks2025;
GO

SELECT AddressLine1,
       KEY_TBL.RANK
FROM Person.Address AS Address
     INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("Bay*",
         Street WEIGHT(0.9),
         View WEIGHT(0.1)
         ) ') AS KEY_TBL
     ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Un terme pondéré peut être utilisé en conjonction avec tout terme simple, tout terme de préfixe, tout terme de génération ou tout terme de proximité.

Plus d’informations sur les recherches de termes pondérées

Dans une recherche de termes pondérés, une valeur pondérée indique le degré d’importance de chaque mot et de chaque expression au sein d’un ensemble de mots ou d’expressions. Une valeur de pondération de 0,0 est la plus faible, et une valeur de pondération de 1,0 est la plus élevée.

Par exemple, dans une requête de recherche de plusieurs termes, vous pouvez affecter à chaque mot de recherche une valeur de pondération indiquant son importance par rapport aux autres mots figurant dans la condition de recherche. Les résultats de ce type de requête renvoient les lignes les plus pertinentes en premier, en fonction du poids relatif affecté aux mots de recherche. Les ensembles de résultats contiennent des documents ou des lignes contenant l’un des termes spécifiés (ou le contenu entre eux) ; Cependant, certains résultats sont considérés comme plus pertinents que d’autres en raison de la variation des valeurs pondérées associées aux différents termes recherchés.

Les recherches de terme pondérées sont supportées par CONTAINSTABLE.

Utiliser AND, OR et NOT (opérateurs booléens)

Le prédicat CONTAINS et la fonction CONTAINSTABLE utilisent les mêmes conditions de recherche. Les deux supportent la combinaison de plusieurs termes de recherche en utilisant des opérateurs booléens (AND, OR, et NOT) pour effectuer des opérations logiques. Vous pouvez utiliser AND, par exemple, pour trouver des lignes qui contiennent à la fois latte et New York-style bagel. Vous pouvez utiliser AND NOT, par exemple, pour trouver les lignes qui contiennent bagel mais ne contiennent cream cheesepas .

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

Pour des informations sur la combinaison CONTAINS avec d’autres prédicats utilisant les opérateurs ANDlogiques , OR, et NOT, voir condition de recherche.

Exemple

L’exemple suivant utilise le CONTAINS prédicat pour rechercher des descriptions dans lesquelles l’ID de description n’est pas égal à 5 et où la description contient à la fois le mot Aluminum et le mot spindle. La condition de recherche utilise l’opérateur AND booléen. Cet exemple utilise la ProductDescription table de la AdventureWorks2025 base de données.

USE AdventureWorks2025;
GO

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

Casse, mots vides, langue et dictionnaire des synonymes

Quand vous écrivez des requêtes de texte intégral, vous pouvez aussi spécifier les options suivantes :

  • Respect de la casse. Les requêtes de recherche en texte intégral ne respectent pas la casse. Néanmoins, en ce qui concerne le Japonais, il existe plusieurs orthographes phonétiques pour lesquelles le concept de normalisation orthographique est apparenté au respect de la casse (par exemple kana = non respect). Ce type de normalisation orthographique n’est pas pris en charge.

  • Mots vides. 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 d’arrêt sont des mots comme a, and, is, ou the, qui peuvent apparaître fréquemment mais qui n’aident généralement pas lors de la recherche d’un texte particulier. 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 Configurer et gérer les mots vides et listes de mots vides pour la recherche en texte intégral.

  • Langue, avec l’option LANGUAGE . De nombreux termes de requête dépendent fortement du comportement du segmenteur de mots. Pour vous assurer que vous utilisez le séparateur de mots (et le raciniseur) ainsi que le fichier de thésaurus appropriés, vous devez spécifier l’option LANGUAGE. Pour plus d’informations, voir Choisir une langue lors de la création d’un index en texte intégral.

  • Dictionnaire des synonymes. FREETEXT et FREETEXTTABLE les requêtes utilisent le thésaurus par défaut. CONTAINS et CONTAINSTABLE soutenir un argument optionnel THESAURUS . Pour plus d’informations, consultez Configurer et gérer les fichiers de dictionnaire des synonymes pour la recherche en texte intégral.

Vérifier les résultats de la tokenisation

Après avoir appliqué une combinaison d’analyseur lexical, de dictionnaire des synonymes et de liste de mots vides dans une requête, vous pouvez voir comment la recherche en texte intégral analyse les résultats avec la vue de gestion dynamique sys.dm_fts_parser. Pour plus d’informations, voir sys.dm_fts_parser.