Condividi tramite


Confronto tra funzioni full-text e predicati full-text

Le funzioni CONTAINSTABLE e FREETEXTTABLE consentono di definire query full-text che restituiscono una classificazione della pertinenza per ogni riga. Queste funzioni sono molto simili ai predicati full-text CONTAINS e FREETEXT, ma vengono utilizzate in modo diverso.

Sebbene per le query full-text vengano utilizzati sia predicati che funzioni full-text e la sintassi utilizzata per specificare le condizioni di ricerca full-text sia identica in entrambi i casi, sono presenti significative differenze nel modo in cui vengono utilizzati. Di seguito sono elencati alcuni punti importanti di similitudine e differenza.

  • I predicati CONTAINS e FREETEXT restituiscono un valore TRUE o FALSE e vengono specificati nelle clausole WHERE o HAVING di un'istruzione SELECT.
  • Le funzioni CONTAINSTABLE e FREETEXTTABLE restituiscono una tabella che include zero, una o più righe e devono pertanto essere sempre specificate nella clausola FROM.
  • I predicati CONTAINS e FREETEXT possono essere utilizzati solo per specificare i criteri di selezione utilizzati da Microsoft SQL Server per determinare l'appartenenza del set di risultati.
  • Le funzioni CONTAINSTABLE e FREETEXTTABLE vengono utilizzate anche per specificare criteri di selezione. La tabella restituita include una colonna KEY che contiene valori chiave full-text. Ogni tabella registrata per la ricerca full-text include una colonna di cui è garantita l'univocità dei valori. I valori restituiti nella colonna KEY di CONTAINSTABLE o FREETEXTTABLE corrispondono ai valori univoci della tabella registrata per la ricerca full-text inclusi nelle righe che soddisfano i criteri di selezione specificati nella condizione di ricerca full-text.

La tabella prodotta dalle funzioni CONTAINSTABLE e FREETEXTTABLE include inoltre una colonna denominata RANK, che contiene valori compresi tra 0 e 1000. Un valore inferiore indica una minore pertinenza. Questi valori vengono utilizzati per assegnare la pertinenza alle righe restituite in base al grado di corrispondenza con i criteri di selezione specificati.

[!NOTA] Il valore di pertinenza indica solo un ordine di pertinenza relativo delle righe nel set di risultati. Il valore effettivo è ininfluente e non ci si deve aspettare che sia lo stesso ogni volta che viene eseguita la query. Per ulteriori informazioni sulla classificazione della pertinenza, vedere Informazioni sul calcolo della pertinenza.

Le query CONTAINS e FREETEXT non restituiscono alcun valore di pertinenza.

Quando si eseguono query che utilizzano le funzioni CONTAINSTABLE e FREETEXTTABLE, le righe risultanti restituite devono essere unite in join in modo esplicito alle righe della tabella SQL Server originale.

Nell'esempio seguente vengono restituiti la descrizione e il nome di tutte le categorie di alimenti in 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.

[!NOTA] Per eseguire alcuni degli esempi di questo argomento, è necessario installare il database Northwind. Per informazioni sulle procedure di installazione del database Northwind, vedere Download dei database di esempio Northwind e 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

Confronto tra CONTAINSTABLE e CONTAINS

La funzione CONTAINSTABLE e il predicato CONTAINS utilizzano condizioni di ricerca simili.

Nella funzione CONTAINSTABLE è tuttavia necessario specificare la tabella in cui eseguire la ricerca full-text, la colonna (o tutte le colonne) della tabella e la condizione di ricerca. Esiste un parametro facoltativo che consente all'utente di richiedere che venga restituito solo il numero maggiore di corrispondenze specificato. Per ulteriori informazioni, vedere la sezione relativa alla limitazione dei set di risultati di seguito in questo argomento.

La funzione CONTAINSTABLE restituisce una tabella che include una colonna denominata RANK, contenente un valore per ogni riga che indica il grado di corrispondenza di una riga con i criteri di selezione specificati. A un valore di pertinenza più elevato corrisponde una maggiore rilevanza della riga per una determinata query full-text.

Confronto tra FREETEXTTABLE e FREETEXT

La query seguente estende una query FREETEXTTABLE in modo che vengano restituite per prime le righe con pertinenza maggiore e che la pertinenza 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 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

Identificazione del nome della colonna chiave univoca

Quando vengono scritte query che utilizzano le funzioni valutate a livello dei set di righe, è necessario conoscere il nome della colonna chiave univoca. A ogni tabella abilitata per la funzionalità full-text è associata la proprietà TableFulltextKeyColumn che specifica l'ID della colonna selezionata per l'imposizione di righe univoche per la tabella. In questo esempio viene illustrato come ottenere il nome della colonna chiave a livello di programmazione.

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

Limitazione dei set di risultati per la restituzione dei risultati più rilevanti

In molte query full-text il numero di elementi che soddisfano la condizione di ricerca è molto elevato. Per evitare che una query restituisca un numero eccessivo di corrispondenze, è possibile utilizzare l'argomento facoltativo top_n_by_rank di CONTAINSTABLE e FREETEXTTABLE per specificare il numero di corrispondenze che si desidera vengano restituite in base alla pertinenza.

[!NOTA] Quando si utilizza l'argomento top_n_by_rank, viene restituito un sottoinsieme delle righe che soddisfano la query full-text. Se si combina top_n_by_rank con altri predicati, la query può restituire un numero minore di righe rispetto a quelle effettivamente corrispondenti a tutti i predicati.

In base a queste informazioni, Microsoft SQL Server ordina le corrispondenze in base alla pertinenza e restituisce solo il numero di corrispondenze specificato. Questa opzione può comportare un miglioramento significativo delle prestazioni. Una query che normalmente restituisce 100.000 righe di una tabella contenente un milione di righe, ad esempio, viene elaborata più rapidamente se vengono richieste solo le prime 100 righe.

Se si desidera che uno degli esempi precedenti in cui viene utilizzata la funzione CONTAINSTABLE restituisca solo le prime tre corrispondenze, la query dovrà essere come indicato di seguito:

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

Set di risultati:

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     

In questo esempio vengono restituiti il nome e la descrizione delle prime 10 categorie di alimenti in cui la colonna Description include le parole "sweet and savory" vicino alla parola "sauces" o alla parola "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

Vedere anche

Altre risorse

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

Guida in linea e informazioni

Assistenza su SQL Server 2005