HomeBlogRicerca FullText su SQL Server 2008, un esempio pratico

Ricerca FullText su SQL Server 2008, un esempio pratico


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


20100117 002

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:

20100117 003

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.

{codecitation style="brush:sql;"} select * from dbo.ProductDescription {/codecitation}

La query ci restituisce 762 righe, tutti i prodotti della tabella.

20100117 004

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

{codecitation style="brush: sql;"} DECLARE @SearchWord varchar(30) SET @SearchWord ='"steel" AND "aluminum"' SELECT ProductDescriptionID, Description FROM ProductDescription WHERE CONTAINS(Description, @SearchWord); {/codecitation}

20100117 005

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)

{codecitation style="brush: sql;"} DECLARE @SearchWord varchar(30) SET @SearchWord ='steel aluminum' SELECT * FROM ProductDescription WHERE FREETEXT(Description, @SearchWord); {/codecitation}

20100117 006

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.

{codecitation style="brush: sql;"} DECLARE @SearchWord varchar(30) SET @SearchWord = 'steel' SELECT * FROM ProductDescription D join FREETEXTTABLE(ProductDescription, Description, @SearchWord) as T on D.ProductDescriptionID = T.[key] order by T.rank desc {/codecitation}

20100117 007

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