Full-Text Search

Home | SQL Server

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.

L'installazione

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.
SQL Server 2000 non inserisce il componente full text nell'installazione standard
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.

La creazione di un catalogo e l'indicizzazione

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

Abilitazione del database

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.

Creazione del catalogo

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.

Aggiunta di una tabella

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.

Aggiunta delle colonne da indicizzare

Adesso necessario indicare quali colonne di tipo testo far indicizzare tramite l'istruzione
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.

Attivazione e Popolazione

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.

Ricerca full-text, la clausola CONTAINS

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

La clausola FREETEXT

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

CONTAINSTABLE e FREETEXTTABLE

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.

Parole Rumorose

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\Config
Chiaramente 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, ...).
Il file di tipo testo e contiene l'elenco di tutti i termini non indicizzati, basta rimuovere i termini che si desidera indicizzare e far ripartire il popolamento full.

Home