FREETEXT (Transact-SQL)

Predicato utilizzato in una clausola WHERE per eseguire la ricerca nelle colonne contenenti tipi di dati basati su caratteri valori corrispondenti al significato e non solo all'esatta formulazione delle parole nella condizione di ricerca. Se si utilizza FREETEXT, il motore delle query full-text esegue internamente le azioni in freetext_string di seguito elencate, assegna un peso a ogni termine, quindi cerca le corrispondenze.

  • Separazione della stringa in singole parole in base ai delimitatori di parola (word breaking).

  • Generazione di forme flessive delle parole (stemming).

  • Identificazione di una lista di espansioni o sostituzioni dei termini in base alle corrispondenze nel thesaurus.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • column_name
    Nome di una o più colonne indicizzate full-text della tabella specificata nella clausola FROM. La colonna può essere di tipo char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary o varbinary(max).

  • column_list
    Indica che è possibile specificare più colonne, separate da virgola. column_list deve essere racchiuso tra parentesi. Se non si specifica language_term, la lingua di tutte le colonne in column_list deve essere la stessa.

  • *
    Specifica che la ricerca della stringa specificata in freetext_string deve essere eseguita in tutte le colonne registrate per la ricerca full-text. Se nella clausola FROM sono specificate più tabelle, è necessario qualificare il simbolo * con il nome della tabella. A meno che non venga specificato language_term, la lingua di tutte le colonne della tabella deve essere uguale.

  • freetext_string
    Testo da cercare nella colonna specificata in column_name. È possibile specificare qualsiasi testo, comprese parole e frasi. Vengono generate corrispondenze se nell'indice full-text viene trovato un termine o vengono trovate le forme di un termine.

    A differenza di quanto avviene nella condizione di ricerca CONTAINS e CONTAINSTABLE in cui AND è una parola chiave, se utilizzata in freetext_string la parola 'and' viene considerata una parola non significativa e verrà ignorata.

    Non è consentito utilizzare WEIGHT, FORMSOF, caratteri jolly, NEAR e altra sintassi. La stringa specificata in freetext_string viene sottoposta alla sillabazione, all'analisi morfologica e al thesaurus. Se freetext_string è delimitata da virgolette doppie, viene cercata una frase corrispondente. Il testo non viene sottoposto alla sillabazione e al thesaurus.

    freetext_string è di tipo nvarchar. Viene eseguita una conversione implicita quando si utilizza come input un tipo di dati character diverso. Nell'esempio seguente la variabile @SearchWord, definita come varchar(30), causa una conversione implicita nel predicato FREETEXT.

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

    Poiché non è possibile utilizzare lo sniffing dei parametri nella conversione, utilizzare nvarchar per migliorare le prestazioni. Nell'esempio dichiarare @SearchWord come nvarchar(30).

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

    È inoltre possibile utilizzare l'hint per la query OPTIMIZE FOR nei casi in cui venga generato un piano non ottimale.

  • LANGUAGE language_term
    Lingua le cui risorse verranno utilizzate per il wordbreaking, lo stemming, il thesaurus e la rimozione di parole non significative come parte della query. Questo parametro è facoltativo e può essere specificato come valore stringa, intero o esadecimale corrispondente all'identificatore delle impostazioni locali (LCID) di una lingua. Se si specifica language_term, la lingua rappresentata dall'argomento verrà applicata a tutti gli elementi della condizione di ricerca. Se non si specifica alcun valore, verrà utilizzata la lingua full-text della colonna.

    Se documenti di lingue diverse vengono archiviati insieme come oggetti BLOB in una singola colonna, l'identificatore delle impostazioni locali (LCID) di un documento specifico determina la lingua da utilizzare per indicizzarne il contenuto. Se quando si esegue una query su una colonna di questo tipo si specifica LANGUAGElanguage_term, la probabilità di ottenere una corrispondenza pertinente sarà maggiore.

    Se specificato come stringa, language_term corrisponde al valore della colonna alias nella vista di compatibilità sys.syslanguages (Transact-SQL). La stringa deve essere racchiusa tra virgolette singole, come in 'language_term'. Se l'argomento language_term viene specificato come valore integer, corrisponde all'effettivo LCID che identifica la lingua. Se specificato come valore esadecimale, language_term è 0x seguito dal valore esadecimale dell'LCID. Il valore esadecimale non deve superare le otto cifre, inclusi gli zero iniziali.

    Se il valore è in formato DBCS (Double-Byte Character Set), verrà convertito in Unicode da MicrosoftSQL Server.

    Se la lingua specificata non è valida oppure non vi sono risorse installate corrispondenti a tale lingua, MicrosoftSQL Server restituisce un errore. Per utilizzare le risorse della lingua neutra, specificare 0x0 per language_term.

Osservazioni

I predicati e le funzioni full-text possono essere utilizzati in una singola tabella, specificata in modo implicito nel predicato FROM. Per cercare in più tabelle, utilizzare una tabella unita in join nella clausola FROM, che consente di eseguire una ricerca in un set di risultati prodotto da due o più tabelle.

Le query full-text che utilizzano il predicato FREETEXT sono meno precise delle query che utilizzano il predicato CONTAINS. Il motore di ricerca full-text di SQL Server identifica le parole e le frasi importanti. Alle parole chiave riservate e ai caratteri jolly che hanno generalmente significato nel parametro <contains_search_condition> del predicato CONTAINS non viene associato alcun significato speciale.

Il predicato FREETEXT non viene riconosciuto come parola chiave se il livello di compatibilità è inferiore a 70. Per ulteriori informazioni, vedere sp_dbcmptlevel (Transact-SQL).

I predicati full-text non sono consentiti nella clausola OUTPUT quando il livello di compatibilità del database è impostato su 100.

Esempi

A. Utilizzo di FREETEXT per la ricerca di parole contenenti valori di carattere specificati

Nell'esempio seguente viene eseguita la ricerca di tutti i documenti contenenti le parole associate a "vital", "safety" e "components".

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

B. Utilizzo di FREETEXT con variabili

Nell'esempio seguente viene utilizzata una variabile anziché un termine di ricerca specifico.

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