Ricerca FullText su SQL Server 2008, un esempio pratico
- 17 Gennaio 2010
.
In questo articolo vedremo come possiamo utilizzare la ricerca FullText di SQL Server 2008. Utilizzeremo il nostro database Laboratory (creazione del database Laboratory)
Iniziamo con qualche definizione.
Che cos'è la ricerca Fulltext ?
Le query full-text consentono di eseguire ricerche linguistiche rispetto ai dati di testo negli indici full-text utilizzando parole e frasi in base alle regole di una determinata lingua, ad esempio l'inglese o il giapponese.
Le query full-text possono contenere semplici parole e frasi oppure forme diverse di una parola o frase.
Configurazione
Prima che le query full-text possano essere eseguite in una determinata tabella, l'amministratore del database deve creare un indice full-text nella tabella.
Per creare un indice Full-Text su un tabella, essa deve contenere una singola colonna con i vincoli UNIQUE e NOT NULL.
L'indice full-text include una o più colonne basate su caratteri nella tabella. Tali colonne possono presentare i tipi di dati seguenti: char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary o varbinary(max).
Procediamo quindi con:
- Creazione di una Tabella
Per analizzare il comportamento delle ricerche fullText ho deciso di importare nel database laboratory la tabella ProductionDescription del database AdventureWorks. In questo modo potremo modificare la struttura senza alterare il database di esempi di Microsoft.
- Creazione del Catalogo e dell'indice FullText

Clicchiamo con il pulsante destro sulla nuova tabella appena creata e procediamo con (1) la definizione dell'indice.
Scegliamo quindi:
- Indici univoco: PK_product_description
- Selezioniamo la colonna 'Description'
- Impostiamo la lingua 'italian' per il word breake
- Impostaiamo a Automatico il rilevamento delle modifiche
- Creiamo il nuovo catalogo con il nome catalog_lab e confermiamo tutte le impostazioni creando l'indice.
A questo punto potremo vedere i nuovi oggetti come nella figura seguente:
Abbiamo finito con la configurazione, possiamo passare agli esempi concreti di ricerca fulltext.
Esempi di interrogazione Fulltext
La prima query che eseguiamo è una select senza nessun filtro.
La query ci restituisce 762 righe, tutti i prodotti della tabella.

Esecuzione di query Fulltext
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.
Qualche esempio
CONTAINS:
Il predicato CONTAINS consente di ricercare:
- Una parola, una frase o un prefisso
- Una parola "vicina" ad un'altra (la cosiddetta ricerca per prossimità)
- Una parola generata da un'altra per flessione (ad esempio, le parole giochi e giocare derivano dalla radice comune gioco)
- Un sinonimo di una parola
FREETEXT:
Il predicato FREETEXT, invece, è utilizzato per ricercare parole e frasi corrispondenti al significato e non all'esatta formulazione del testo nelle condizioni della query. Il suo funzionamento è il seguente:
- Separa la stringa cercata in token in base ai delimitatori di parola
- Genera le forme flesse di ogni parola
- Identifica una lista di espansioni o sostituzioni dei termini in base alle corrispondenze nel thesaurus (qualora sia presente)

FREETEXTTABLE:
Gli operatori CONTAINSTABLE e FREETEXTTABLE sono le controparti di CONTAINS e FREETEXT: mentre questi ultimi sono utilizzati nelle clausole WHERE, CONTAINTSTABLE e FREETEXTTABLE restituiscono risultati tabellari, quindi possono comparire in ogni punto di una query dove è prevista una tabella (tipicamente, la clausola FROM di un'interrogazione).
Le query basate su CONTAINSTABLE restituiscono l‘indice di pertinenza del risultato (RANK) e la UNIQUE KEY dei record che soddisfano i criteri specificati. Tale funzione utilizza le stesse condizioni di ricerca del predicato CONTAINS, come illustrato in precedenza.

Consigli
Per quanto riguarda la posizione dell'indice su file system, nel caso in cui sia possibile è consigliabile riservare uno o più dischi esclusivamente per il catalogo: le operazioni di gestione dell'indice, infatti, sono molto costose dal punto di vista delle operazioni in input/output, dal momento che è necessario leggere le informazioni dal database di SQL Server e utilizzarle per costruire il file su disco; per tale motivo, utilizzando un disco separato, si riduce la possibilità che il sottosistema di I/O diventi un collo di bottiglia per le prestazioni.
Link Utili
technet.microsoft.com - FullText
database.html.it - il-fulltext-search-di-sql-server
community.ugiss.org - Articolo

