Condividi tramite


Creazione e gestione di indici full-text

Le informazioni contenute negli indici full-text vengono utilizzate dal motore di ricerca full-text per compilare query full-text che consentono di cercare rapidamente parole o combinazioni di parole specifiche in una tabella. In un indice full-text vengono archiviate informazioni su parole significative e sulla relativa posizione all'interno di una o più colonne di una tabella di database. Un indice full-text è un tipo speciale di indice funzionale basato su token compilato e gestito dal motore di Full-Text per SQL Server. Il processo di compilazione di un indice full-text è diverso da quello di altri tipi di indici. Anziché creare un albero B basato su un valore archiviato in una riga specifica, il motore di ricerca full-text compila una struttura con indice invertito, compresso e in pila dai singoli token dal testo indicizzato. Le dimensioni di un indice full-text sono limitate solo dalle risorse di memoria disponibili del computer in cui è in esecuzione l'istanza di SQL Server.

A partire da SQL Server 2008, gli indici full-text sono integrati con il motore di database, anziché risiedere nel file system come nelle versioni precedenti di SQL Server. Per un nuovo database, il catalogo full-text è ora un oggetto virtuale che non appartiene ad alcun filegroup. Si tratta semplicemente di un concetto logico che fa riferimento a un gruppo di indici full-text. Si noti tuttavia che durante l'aggiornamento di un database SQL Server 2005, qualsiasi catalogo full-text contenente file di dati, viene creato un nuovo filegroup. Per altre informazioni, vedere Aggiornare Full-Text Ricerca.

Nota

In SQL Server 2008 e versioni successive, il motore di Full-Text risiede nel processo di SQL Server anziché in un servizio separato. L'integrazione del motore di ricerca full-text nel Motore di database consente di ottimizzare la gestibilità della ricerca full-text, l'esecuzione delle query miste e le prestazioni generali.

È consentito un solo indice full-text per tabella. Per creare un indice full-text su una tabella, quest'ultima deve contenere una colonna singola, univoca e non Null. È possibile compilare un indice full-text su colonne di tipo char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary e varbinary(max) che possono essere indicizzate per la ricerca full-text. Creazione di un indice full-text in una colonna il cui tipo di dati è varbinary, , varbinary(max)imageo xml richiede di specificare una colonna di tipo. Una colonna del tipo è una colonna di tabella in cui è possibile archiviare l'estensione file (doc, pdf, xls e così via) del documento in ogni riga.

Il processo di creazione e gestione di un indice full-text è definito popolamento (noto anche come ricerca per indicizzazione). Sono disponibili tre tipi di popolamento dell'indice full-text: popolamento completo, popolamento basato sul rilevamento delle modifiche e popolamento incrementale basato su timestamp. Per altre informazioni sugli indici full-text, vedere Popolamento degli indici full-text.

Attività comuni

Per creare un indice full-text

Per modificare un indice full-text

Per eliminare un indice full-text

Contenuto dell'articolo

Struttura di un indice full-text

Comprendere a fondo la struttura di un indice full-text è fondamentale per comprendere il funzionamento del motore di ricerca full-text. Questo argomento usa l'estratto seguente della tabella Document in Adventure Works come tabella di esempio. In questo estratto sono visualizzate solo due colonne, la colonna DocumentID e la colonna Title , e tre righe della tabella.

In questo esempio si suppone che nella colonna Title sia stato creato un indice full-text.

DocumentID Titolo
1 Crank Arm and Tire Maintenance
2 Front Reflector Bracket and Reflector Assembly 3
3 Front Reflector Bracket Installation

Nella tabella seguente, Fragment 1, viene illustrato il contenuto dell'indice full-text creato nella colonna Title della tabella Document . Gli indici full-text contengono più informazioni rispetto a quelle riportate in questa tabella. La tabella è una rappresentazione logica di un indice full-text e ha solo scopo illustrativo. Per ottimizzare l'utilizzo del disco, le righe vengono archiviate in un formato compresso.

Si noti che i dati sono stati invertiti dai documenti originali. Questa inversione è dovuta al fatto che per le parole chiave viene eseguito il mapping agli ID documento. Per questo motivo, un indice full-text viene spesso definito come un indice invertito.

Si noti inoltre che la parola chiave "and" è stata rimossa dall'indice full-text, trattandosi di una parola non significativa, e che la rimozione di tali parole da un indice full-text può contribuire a risparmiare spazio su disco, migliorando di conseguenza le prestazioni delle query. Per altre informazioni sulle parole non significative e sugli elenchi di parole non significative, vedere Configurare e gestire parole non significative ed elenchi di parole non significative per la ricerca full-text.

Frammento 1

Parola chiave ColId DocId Occorrenza
Crank 1 1 1
Arm 1 1 2
Tire 1 1 4
Manutenzione 1 1 5
Front 1 2 1
Front 1 3 1
Reflector 1 2 2
Reflector 1 2 5
Reflector 1 3 2
Bracket 1 2 3
Bracket 1 3 3
Assembly 1 2 6
3 1 2 7
Installazione 1 3 4

La colonna Parola chiave contiene la rappresentazione di un singolo token estratto al momento dell'indicizzazione. I word breaker stabiliscono il modo in cui un token viene determinato.

La colonna ColId contiene un valore che corrisponde a una particolare colonna con indicizzazione full-text.

La DocId colonna contiene valori per un intero a otto byte che esegue il mapping a un determinato valore di chiave full-text in una tabella indicizzata full-text. Questo mapping è necessario se la chiave full-text non è un tipo di dati integer. In questi casi, i mapping tra i valori della chiave full-text e DocId i valori vengono mantenuti in una tabella separata denominata tabella DocId Mapping. Per eseguire una query per questi mapping usare la stored procedure di sistema sp_fulltext_keymappings . Per soddisfare una condizione di ricerca, è necessario creare un join tra i valori DocId della tabella precedente e la tabella DocId Mapping per recuperare le righe dalla tabella di base su cui viene eseguita la query. Se il valore della chiave full-text della tabella di base è di tipo integer, il valore viene utilizzato direttamente come DocId e non è necessario alcun mapping. Pertanto, l'utilizzo di valori chiave full-text di tipo integer può contribuire all'ottimizzazione delle query full-text.

La colonna Occurrence contiene un valore di tipo integer. Per ogni valore DocId è presente un elenco di valori di occorrenza corrispondenti agli offset relativi di una particolare parola chiave all'interno di DocId. I valori di occorrenza sono utili per determinare le corrispondenze di frase o prossimità, ad esempio frasi con valori di occorrenza numericamente adiacenti. Sono inoltre utili per calcolare i punteggi di pertinenza, ad esempio il numero di occorrenze di una parola chiave in un DocId può essere utilizzato per l'assegnazione del punteggio.

Contenuto dell'articolo

Frammenti di indice full-text

L'indice full-text logico viene in genere suddiviso tra più tabelle interne. Ogni tabella interna viene definita un frammento di indice full-text. Alcuni di questi frammenti potrebbero contenere dati più recenti di altri. Ad esempio, se un utente aggiorna la riga seguente il cui DocId è 3 e per la tabella è impostato il rilevamento automatico delle modifiche, viene creato un nuovo frammento.

DocumentID Titolo
3 Rear Reflector

Nell'esempio seguente, Fragment 2, il frammento contiene dati più recenti su DocId 3, rispetto a Fragment 1. Pertanto, quando viene eseguita una query per "Rear Reflector" i dati di Fragment 2 vengono utilizzati per DocId 3. Ogni frammento viene contrassegnato con un timestamp di creazione su cui è possibile eseguire query tramite la vista del catalogo sys.fulltext_index_fragments .

Frammento 2

Parola chiave ColId DocId Occ
Rear 1 3 1
Reflector 1 3 2

Come si può vedere da Fragment 2, le query full-text devono essere eseguite internamente su ogni frammento e le voci più obsolete devono essere eliminate. Un numero eccessivo di frammenti di indice full-text nell'indice full-text può causare un calo sensibile delle prestazioni di esecuzione delle query. Per ridurre il numero di frammenti, riorganizzare il catalogo full-text usando l'opzione REORGANIZE dell'istruzione Transact-SQL ALTER FULLTEXT CATALOG. Questa istruzione consente di eseguire un' unione nell'indice master, ovvero un'unione dei frammenti in un singolo frammento più grande e la rimozione di tutte le voci obsolete dall'indice full-text.

Dopo essere stato riorganizzato, l'indice di esempio dovrebbe contenere le righe seguenti:

Parola chiave ColId DocId Occ
Crank 1 1 1
Arm 1 1 2
Tire 1 1 4
Manutenzione 1 1 5
Front 1 2 1
Rear 1 3 1
Reflector 1 2 2
Reflector 1 2 5
Reflector 1 3 2
Bracket 1 2 3
Assembly 1 2 6
3 1 2 7

Contenuto dell'articolo