Cenni preliminari su funzioni e predicati full-text

Le query full-text utilizzano i predicati (CONTAINS e FREETEXT) e le funzioni (CONTAINSTABLE e FREETEXTTABLE) full-text. Tali predicati e funzioni supportano la sintassi Transact-SQL avanzata che a sua volta supporta vari formati di termini di query. Per scrivere query full-text, è necessario sapere come e quando utilizzare questi predicati e queste funzioni. In questo argomento vengono riepilogati i predicati e le funzioni e vengono illustrate le similitudini tra il predicato CONTAINS e la funzione CONTAINSTABLE.

Cenni preliminari sui predicati full-text CONTAINS e FREETEXT

CONTAINS e FREETEXT vengono specificati nella clausola WHERE o HAVING di un'istruzione SELECT. Possono essere combinati con qualsiasi altro predicato Transact-SQL, ad esempio LIKE e BETWEEN.

I predicati CONTAINS e FREETEXT restituiscono un valore TRUE o FALSE. Possono essere utilizzati solo per specificare i criteri di selezione per determinare se una determinata riga corrisponde alla query full-text. Le righe corrispondenti vengono restituite nel set di risultati.

Quando si utilizza CONTAINS o FREETEXT, è possibile specificare una sola colonna, un elenco di colonne o tutte le colonne della tabella in cui eseguire la ricerca. Facoltativamente, è possibile specificare la lingua le cui risorse verranno utilizzate dalla query full-text specificata per il word breaking e lo stemming, le ricerche nel thesaurus e la rimozione di parole non significative.

CONTAINS e FREETEXT sono utili per tipi diversi di corrispondenze, come illustrato di seguito:

  • Utilizzare CONTAINS (o CONTAINSTABLE) per corrispondenze precise o fuzzy (meno precise) a singole parole e frasi, la prossimità di parole entro una certa distanza una dall'altra o corrispondenze ponderate. Quando si utilizza CONTAINS, è necessario specificare almeno una condizione di ricerca che specifichi il testo che si desidera cercare e le condizioni che determinano le corrispondenze.

    È possibile utilizzare l'operazione logica tra condizioni di ricerca. Per ulteriori informazioni, vedere Utilizzo di operatori booleani AND, OR, AND NOT (in CONTAINS e CONTAINSTABLE), più avanti in questo argomento.

  • Utilizzare FREETEXT (o FREETEXTTABLE) per trovare la corrispondenza tra il significato, ma non l'esatta formulazione, di parole e frasi specificate (stringa free-text). Vengono generate corrispondenze se nell'indice full-text di una colonna specificata viene trovato un qualsiasi termine o formato di un qualsiasi termine.

Per eseguire query in server collegati, è possibile utilizzare nomi in quattro parti in CONTAINS o FREETEXT. Per ulteriori informazioni, vedere Esecuzione di query su server collegati (ricerca full-text).

Per informazioni sulla sintassi e sugli argomenti di questi predicati, vedere CONTAINS (Transact-SQL) e FREETEXT (Transact-SQL).

[!NOTA]

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

Esempi

A. Utilizzo di CONTAINS con <simple_term>

Nell'esempio seguente vengono trovati tutti i prodotti il cui prezzo è $80.99 e che includono la parola "Mountain".

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

B. 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

Cenni preliminari sulle funzioni full-text CONTAINSTABLE e FREETEXTTABLE

È possibile fare riferimento alle funzioni CONTAINSTABLE e FREETEXTTABLE come un normale nome di tabella nella clausola FROM di un'istruzione SELECT. Restituiscono una tabella di zero, una o più righe corrispondenti alla query full-text. La tabella restituita contiene solo righe della tabella di base che corrispondono ai criteri di selezione specificati nella condizione della ricerca full-text della funzione.

Le query che utilizzano una di queste funzioni restituiscono un valore di classificazione per pertinenza (RANK) e una chiave full-text (KEY) per ogni riga, come illustrato di seguito:

  • Colonna KEY

    La colonna KEY restituisce valori univoci delle righe restituite. Può essere utilizzata per specificare i criteri di selezione.

  • Colonna RANK

    La colonna RANK restituisce un valore di pertinenza per ogni riga che indica il livello di corrispondenza tra la riga e i criteri di selezione. Maggiore è il valore di pertinenza del testo o del documento in una riga, maggiore sarà la pertinenza della riga per una determinata query full-text. Si noti che è possibile classificare in modo identico righe diverse. È possibile limitare il numero di corrispondenze da restituire specificando il parametro top_n_by_rank facoltativo. Per ulteriori informazioni, vedere Limitazione dei set di risultati classificati per pertinenza (ricerca full-text) e Classificazione per pertinenza dei risultati delle query di ricerca (ricerca full-text).

Quando si utilizza una di queste funzioni, è necessario specificare la tabella di base in cui eseguire la ricerca full-text. Come con i predicati, è possibile specificare una singola colonna, un elenco di colonne o tutte le colonne della tabella in cui eseguire la ricerca e, facoltativamente, la lingua le cui risorse verranno utilizzate dalla query full-text specificata.

CONTAINSTABLE è utile per gli stessi tipi di corrispondenze di CONTAINS, mentre FREETEXTTABLE è utile per gli stessi tipi di corrispondenze di FREETEXT. Per ulteriori informazioni, vedere Cenni preliminari sui predicati full-text CONTAINS e FREETEXT, più indietro in questo argomento. Quando si eseguono query che utilizzano le funzioni CONTAINSTABLE e FREETEXTTABLE, è necessario unire in join in modo esplicito le righe restituite alle righe della tabella di base SQL Server.

Per informazioni sulla sintassi e sugli argomenti di queste funzioni, vedere CONTAINSTABLE (Transact-SQL) e FREETEXTTABLE (Transact-SQL).

Esempi

A. Utilizzo di CONTAINSTABLE

Nell'esempio seguente vengono restituiti la descrizione e il nome di tutte le categorie di alimenti per cui la colonna Description include le parole "sweet and savory" vicino alla parola "sauces" o alla parola "candies". Tutte le righe che includono il nome della categoria "Seafood" vengono ignorate. Vengono restituite solo le righe con un valore di pertinenza maggiore di 2.

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. Utilizzo di FREETEXTTABLE

Nell'esempio seguente viene estesa una query FREETEXTTABLE in modo che vengano restituite per prime le righe con valore di pertinenza maggiore e la classificazione di ogni riga venga aggiunta all'elenco di selezione. Per specificare la query, è necessario sapere che CategoryID è la colonna chiave univoca per la tabella 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

Di seguito viene riportata un'estensione della stessa query che restituisce solo le righe con valore di pertinenza maggiore o uguale a 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

Utilizzo degli operatori booleani AND, OR, AND NOT (in CONTAINS e CONTAINSTABLE)

Il predicato CONTAINS e la funzione CONTAINSTABLE utilizzano le stesse condizioni di ricerca. Entrambi supportano la combinazione di più termini di ricerca tramite gli operatori booleani AND, OR, AND NOT per eseguire operazioni logiche. È ad esempio possibile utilizzare AND per trovare righe che contengono sia "latte" sia New York-style bagel". È possibile utilizzare AND NOT, ad esempio, per trovare le righe che contengono "bagel", ma non "cream cheese".

[!NOTA]

Al contrario, FREETEXT e FREETEXTTABLE considerano i termini booleani come parole da cercare.

Per informazioni sulla combinazione di CONTAINS con altri predicati che utilizzano gli operatori logici AND, OR, AND NOT, vedere Condizione di ricerca (Transact-SQL).

Esempio

Nell'esempio seguente viene utilizzata la tabella ProductDescription del database AdventureWorks. Nella query viene utilizzato il predicato CONTAINS per cercare le descrizioni il cui ID sia diverso da 5 e che contengano le parole "Aluminium" e "splindle". Nella condizione di ricerca viene utilizzato l'operatore booleano AND.

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

Ulteriori considerazioni

Ogni tabella full-text dispone di una colonna utilizzata per applicare righe univoche per la tabella (la colonna chiave univoca). Quando si scrive il tipo CONTAINSTABLE o FREETEXTTABLE di query full-text, è necessario conoscere il nome della colonna chiave univoca. Per ulteriori informazioni, vedere Procedura: Richiesta di informazioni sulla colonna chiave full-text (Transact-SQL).

Molti termini di query dipendono in larga misura dal comportamento del word breaker. Per assicurarsi di utilizzare il word breaker (e lo stemmer) e il thesaurus corretti, è consigliabile specificare l'argomento LANGUAGE. Per ulteriori informazioni, vedere Procedure consigliate per la scelta di una lingua durante la creazione di un indice full-text.

Quando si definisce una query full-text, il motore di ricerca full-text ignora le parole non significative dai criteri di ricerca. Per parole non significative si intendono parole quali "circa", "con", "devo" e "cui" che possono ricorrere di frequente, ma che non hanno alcuna utilità nella ricerca di testo specifico. Le parole non significative vengono riunite in un elenco. Ogni indice full-text è associato a un elenco di parole non significative specifico per determinare quali di queste parole omettere dalla query o dall'indice durante l'indicizzazione. Per ulteriori informazioni, vedere Parole non significative ed elenchi di parole non significative.

La corrispondenza nel thesaurus viene generata per query Transact-SQL CONTAINS e CONTAINSTABLE che specificano la clausola FORMSOF THESAURUS e per le query FREETEXT e FREETEXTABLE per impostazione predefinita.