FREETEXT (Transact-SQL)

Prédicat utilisé dans la clause WHERE Transact-SQL d'une instruction Transact-SQL SELECT pour effectuer une recherche en texte intégral SQL Server sur les colonnes indexées de texte intégral qui contiennent des types de données basés sur des caractères. Ce prédicat recherche des valeurs qui correspondent à la signification, et non pas seulement au libellé exact des mots dans la condition de recherche. Lorsque FREETEXT est utilisé, le moteur de requête de texte intégral effectue les actions suivantes en interne sur la chaîne freetext_string, affecte une pondération à chaque terme, puis recherche les correspondances :

  • Il scinde la chaîne en mots en se basant sur les limites de mot (coupure de mots).

  • Il génère des formes fléchies des mots (extraction de la racine).

  • Il identifie une liste d'extensions ou de substituts en fonction des correspondances fournies par le dictionnaire des synonymes.

[!REMARQUE]

Pour plus d'informations sur les formes de recherches en texte intégral prises en charge par SQL Server, consultez Exécuter une requête avec une recherche en texte intégral.

Icône Lien de rubrique Conventions de la syntaxe Transact-SQL

Syntaxe

FREETEXT ( { column_name | (column_list) | * } 
          , 'freetext_string' [ , LANGUAGE language_term ] )

Arguments

  • column_name
    Nom d'une ou de plusieurs colonnes de texte intégral indexées de la table spécifiée dans la clause FROM. Les colonnes peuvent être de type char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary ou varbinary(max).

  • column_list
    Indique que plusieurs colonnes, délimitées par des virgules, peuvent être spécifiées. column_list doit être mise entre parenthèses. Une seule et même langue doit être utilisée dans toutes les colonnes de column_list, sauf si language_term est spécifié.

  • *
    Précise que toutes les colonnes enregistrées pour la recherche en texte intégral doivent être utilisées pour rechercher la chaîne freetext_string donnée. Si la clause FROM comporte plusieurs tables, * doit être qualifié par le nom de la table. Si language_term n'est pas précisé, la langue de toutes les colonnes de la table doit être la même.

  • freetext_string
    Texte à rechercher dans column_name. Tout texte, y compris des mots, expressions et phrases peuvent être entrés. Des correspondances sont générées si l'un des termes ou les formes de quelque terme que ce soit sont trouvés dans l'index de recherche en texte intégral.

    À la différence de la condition de recherche CONTAINS et CONTAINSTABLE où AND est un mot clé, le mot « and » est considéré comme un mot parasite, où mot vide dans freetext_string et il est ignoré.

    L'utilisation de WEIGHT, de FORMSOF, de caractères génériques, de NEAR et d'autres syntaxes n'est pas autorisée. freetext_string est découpée en mots dont les racines sont extraites et traitées par le dictionnaire des synonymes.

    freetext_string est de type nvarchar. Une conversion implicite se produit lorsqu'un autre type de données character est utilisé comme entrée. Dans l'exemple suivant, la variable @SearchWord, à laquelle est attribuée la valeur varchar(30), provoque une conversion implicite dans le prédicat FREETEXT.

    USE AdventureWorks2012;
    GO
    DECLARE @SearchWord varchar(30)
    SET @SearchWord ='performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE FREETEXT(Description, @SearchWord);
    

    Étant donné que la détection des paramètres ne fonctionne pas lors de la conversion, utilisez nvarchar afin d'obtenir de meilleures performances. Dans l'exemple, déclarez @SearchWord en tant que nvarchar(30).

    USE AdventureWorks2012;
    GO
    DECLARE @SearchWord nvarchar(30)
    SET @SearchWord = N'performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE FREETEXT(Description, @SearchWord);
    

    Vous pouvez également utiliser l'indicateur de requête OPTIMIZE FOR lorsqu'un plan non optimal est généré.

  • LANGUAGE language_term
    Langue dont les ressources seront utilisées pour l'analyse lexicale, la recherche de radical, l'utilisation du dictionnaire de synonymes et la suppression de mots vides dans la requête. Ce paramètre est facultatif et peut être spécifié sous la forme d'une chaîne, d'un entier ou d'une valeur hexadécimale correspondant à l'identificateur de paramètres régionaux (LCID) d'une langue. Si vous spécifiez language_term, la langue qu'il représente est appliquée à tous les éléments de la condition de recherche. Si aucune valeur n'est définie, la langue de texte intégral de la colonne est utilisée.

    Si des documents de langues différentes sont stockés ensemble en tant qu'objets blob dans une colonne unique, l'identificateur de paramètres régionaux (LCID) d'un document donné détermine la langue utilisée pour l'indexation de son contenu. Lors de l'interrogation d'une telle colonne, la spécification de LANGUAGE language_term permet d'augmenter la probabilité d'une correspondance correcte.

    Lorsqu'il est spécifié comme chaîne, l'argument language_term correspond à la valeur de la colonne alias dans la vue de compatibilité sys.syslanguages (Transact-SQL). La chaîne doit être placée entre guillemets simples, comme dans la chaîne 'language_term'. Lorsqu'il est spécifié comme entier, l'argument language_term est alors le LCID actif identifiant la langue. Quand il est spécifié comme valeur hexadécimale, l'argument language_term est 0x suivi de la valeur hexadécimale du LCID. La valeur hexadécimale ne doit pas dépasser huit caractères, y compris les zéros non significatifs.

    Si la valeur est au format de jeu de caractères codés sur deux octets (DBCS), Microsoft SQL Server la convertit en Unicode.

    Si la langue spécifiée n'est pas valide ou s'il n'existe aucune ressource installée correspondant à cette langue, Microsoft SQL Server retourne une erreur. Pour utiliser des ressources linguistiques neutres, indiquez 0x0 pour language_term.

Remarques d'ordre général

Les prédicats et les fonctions de texte intégral s'appliquent à une table unique, ce qui est implicite dans le prédicat FROM. Pour effectuer des recherches sur plusieurs tables, utilisez une table jointe dans votre clause FROM afin de baser votre recherche sur un jeu de résultats qui est le produit de deux tables ou plus.

Les requêtes de texte intégral qui utilisent FREETEXT sont moins précises que celles qui utilisent CONTAINS. Le moteur de recherche en texte intégral de SQL Server identifie les expressions et les mots importants. Aucune signification particulière n'est donnée aux mots clés réservés ni aux caractères génériques qui ont généralement un sens lorsqu'ils sont précisés dans le paramètre <contains_search_condition> du prédicat CONTAINS.

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.

[!REMARQUE]

La fonction FREETEXTTABLE est utile pour les mêmes types de correspondance que le prédicat FREETEXT. Vous pouvez référencer cette fonction comme un nom de table classique dans la clause FROM d'une instruction SELECT. Pour plus d'informations, consultez FREETEXTTABLE (Transact-SQL).

Interrogation de serveurs distants

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

Comparaison entre LIKE et la recherche en texte intégral

Contrairement à la recherche en texte intégral, le prédicat Transact-SQL LIKE fonctionne uniquement sur les modèles de caractères. En outre, vous ne pouvez pas utiliser le prédicat LIKE pour interroger des données binaires mises en forme. De plus, une requête LIKE portant sur un important volume de données de texte non structurées est beaucoup plus lente qu'une requête de texte intégral équivalente exécutée sur les mêmes données. Une requête LIKE portant sur des millions de lignes de données de texte peut prendre plusieurs minutes pour retourner un résultat alors qu'une requête de texte intégral retourne en quelques secondes à peine le même résultat, en fonction du nombre de lignes retournées.

Exemples

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

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

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

B.Utilisation de FREETEXT avec des variables

L'exemple ci-dessous utilise une variable à la place d'un terme de recherche spécifique.

USE AdventureWorks2012;
GO
DECLARE @SearchWord nvarchar(30);
SET @SearchWord = N'high-performance';
SELECT Description 
FROM Production.ProductDescription 
WHERE FREETEXT(Description, @SearchWord);
GO

Voir aussi

Tâches

Créer des requêtes de recherche en texte intégral (Visual Database Tools)

Référence

CREATE FULLTEXT CATALOG (Transact-SQL)

CREATE FULLTEXT INDEX (Transact-SQL)

CONTAINS (Transact-SQL)

CONTAINSTABLE (Transact-SQL)

Types de données (Transact-SQL)

FREETEXTTABLE (Transact-SQL)

WHERE (Transact-SQL)

Concepts

Commencer à utiliser la recherche en texte intégral

Créer et gérer des catalogues de texte intégral

Créer et gérer des index de recherche en texte intégral

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