Una ricerca full-text consente di eseguire una query testuale nelle tabelle abilitate. A differenza del predicato LIKE, che agisce sulle singole stringhe la ricerca full-text viene eseguita su parole e/o frasi.
Il primo passo da eseguire è l'installazione perchè SQL Server 2000, da default, non installa il servizio
di full text, ovvero nell'installazione standard non viene inserito, bisogna scegliere, in fase di installazione,
l'opzione Custom per poi accedere alla finestra mostrata dall'immagine in basso.
Una volta installato SQL Server si avrà come servizio Windows aggiuntivo MSSEARCH (Microsoft Search)
che deve essere attivo per l'indicizzazione del testo copntenuto neli campi della tabelle inserite nei cataloghi.
Gli esempi che faccio sono tratti dalla guida di SQL Server, sono qui riassunti in modo da avere tutto il percorso in un unico punto. Utilizzo i database che SQL Server installa automaticamente: NorthWind e Pubs
La prima cosa da fare è abilitare il database alla ricerca full text, quindi una volta aperto il Query Analizer, ci si poziona sul database in questione (in questo caso NorthWind) e si lancia la query
EXEC sp_fulltext_database 'enable'il parametro se impostato a 'disable' elimina tutti i cataloghi presenti per quel database.
Una volta abilitato il database si deve creare il catalogo tramite l'istruzione
EXEC sp_fulltext_catalog 'Catalogo1', 'create'E' stato creato un catalogo il cui nome è Catalogo1, non ci sono restrizioni sulla scelta del nome.
A questo punto bisogna aggiungere una tabella al catalogo, e per fare questo c'è bisogno che la tabella abbia: un indice univoco ed almeno un campo di tipo testo. Il comando per aggiungere la tabella al catalogo è:
EXEC sp_fulltext_table 'Categories', 'create', 'Catalogo1', 'PK_Categories'Il primo parametro indica la tabella fisica da inserire nel catalogo, il secondo è ovvio, il terzo indicia il nome del catalogo ed il quarto indica l'indice univoco su cui si basa la restituzione dei record. In assenza di indice univoco la tabella non può essere inserita in un catalogo full-text.
EXEC sp_fulltext_column 'Categories','Description','add'viene aggiuta la colonna Description al catalogo, collegata alla tabella Categories. E' possibile aggiungere anche più di una colonna.
Il più è fatto adesso bisogna attivare il la tabella del catalogo e schedulare il popolamento oppure fare in modo da lanciare l'aggiornamento in background e monitorare le variazioni dei campi all'interno del database in modo da modificare anche l'indice full-text.
EXEC sp_fulltext_table 'Categories','activate'Questo comando attiva il catalogo c'è poi il comando per lanciare il popolamento dell'indice.
EXEC sp_fulltext_catalog 'Catalogo1', 'start_full'Il secondo parametro puo essere impostato a start_full fa partire una reindicizzazione completa del catalogo, mentre impostato a start_incremental fa partire una indicizzazione incrementale che però può avere luogo solo se nella tabella esiste un campo di tipo timestamp che in SQL Server è un indicatore dell'ultima modifica effettuata sul record. In assenza di tale campo il popolamento incrementale non sapendo da dove partire fa l'equivalente lavoro del completo ripopolamento dell'indice.
Per evitare di lanciare i comandi di popolamento e quindi di tenere disallineati tra un comando e l'altro il database vero e proprio ed il catalogo è possibile lanciare un processo che tiene traccia delle variazioni dei campi coinvolti nel catalogo e aggiornandolo in tempo reale.
EXEC sp_fulltext_table Categories, 'Start_change_tracking' EXEC sp_fulltext_table Categories, 'Start_background_updateindex'la prima istruzione fa partire una incremental population (full inmancanza di campo timestamp), quindi tiene traccia di tutte le variazioni fatte sui campi da indicizzare. la seconda istruzione esegue l'aggiornamento del catalogo in backgroud in base alle variazioni memorizzate dal primo processo.
Tutto è pronto manca solo l'istruzione per ricercare, eccola
select * from categories where contains (*,'sauces')la clausola contains può essere anche combinata con altra clausole standard del tipo nomecampo=valore, e può essere inserita all'interno di query anche molto complesse. Ha due parametri il primo indica le colonne su cui effettuare la ricerca, nell'esempio riportato sopra poteva esserci anche Description, oppure l'asterisco indica un ricarca su tutte le colonne. Il secondo parametro è il termine di ricerca che può contenere parole o frasi e che a sua volta può contenere operatori booleani o caratteri jolly. Infatti è possibile avere query del tipo
select * from categories where contains (*,'"sauces" AND "bean curd"')Ricerca testo conentente sauces e la frase bean curd
select * from categories where contains (*,'"sauce*" AND "bean*"')Ricerca testo conentente parole che iniziano con sauce oppure parole che iniziano con bean. Molte altre varianti molto interessanti possone essere approfondite sull' help on line direttamente sul sito della Microsoft
FreeText viene invece utilizzato per ricercare per valori corrispondenti al significato e non all'esatta corrispondenza del testo nelle condizioni di ricerca. Quindi è una ricerca intelligente sul significato dell parole, a discrezione del motore chiaramente e del linguaggio col quale è stato installato SQL Server. La sintassi è simile a quella del predicato CONTAINS a differenza del quale è più semplice in quanto nel secondo parametro va inserito una frase di testo libero. Sarà il motore stesso a decidere come suddividere ilt esto e confrontarlo con quello presente nelle tabelle
Restituiscono una tabella e quindi vanno inserite dopo la clausola FROM oppure la clausola JOIN, anche qui rimando al testo integrale sul sito della Microsoft.
Al fine di non permettere molto gravose, SQL Server per defult rimuove alcuni termini dall'indicizzazione,
quali preposizioni, congiunzioni, numeri, ecc...
E' possibile trovare l'elenco di tutte le parole rumorose nella directory
C:\Programmi\File comuni\System\MSSearch\Data\ConfigChiaramente se il sistema è in italiano (altrimenti c:\program files\common files\ ecc...). All'interno di questa directory è possibile trovare i file noise.ita e gli altri file per altre lingue (noise.eng, noise.fra, ...).