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 ricerca full-text per SQL Server. Il processo di compilazione di un indice full-text è diverso da quello di altri tipi di indici. Anziché costruire una struttura ad albero B basata su un valore archiviato in una determinata riga, il motore di ricerca full-text compila una struttura con indici invertito, in pila e compresso basata su singoli token dal testo indicizzato. La dimensione di un indice full-text è limitata solo dalle risorse di memoria disponibili del computer in cui viene eseguita l'istanza di SQL Server.

A partire da SQL Server 2008, gli indici full-text sono integrati nel 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, ma è soltanto un concetto logico che fa riferimento a un gruppo di indici full-text. Si noti tuttavia che durante l'aggiornamento di un database di SQL Server 2005, ovvero qualsiasi catalogo full-text contenente file di dati, viene creato un nuovo filegroup. Per ulteriori informazioni, vedere Aggiornamento della ricerca full-text in SQL Server 2005.

[!NOTA]

In SQL Server 2008 e versioni successive, il motore di ricerca full-text si trova nel processo di SQL Server anziché in un servizio distinto. 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). La creazione di un indice full-text in colonne con tipo di dati varbinary, varbinary(max)o image o xml richiede la specifica di una colonna del 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 ulteriori informazioni, vedere Popolamento degli indici full-text.

Contenuto dell'argomento

  • Attività comuni

  • Struttura di un indice full-text

  • Frammenti di indice full-text

Attività comuni

Per creare un indice full-text

Per modificare un indice full-text

Per eliminare un indice full-text

[TORNA ALL'INIZIO]

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. In questo argomento viene utilizzato l'estratto seguente della tabella Document in Adventure Works come tabella di esempio. L'estratto mostra solo due colonne, la colonna DocumentID e la colonna Title, insieme a tre righe della tabella.

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

DocumentID

Title

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 ulteriori informazioni sulle parole non significative, vedere Configurare e gestire parole non significative ed elenchi di parole non significative per la ricerca full-text.

Fragment 1

Parola chiave

ColId

DocId

Occorrenza

Crank

1

1

1

Arm

1

1

2

Tire

1

1

4

Maintenance

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

Installation

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 colonna DocId contiene valori per un integer a otto byte con mapping a un determinato valore chiave full-text in una tabella con indicizzazione full-text. Questo mapping è necessario se la chiave full-text non è un tipo di dati integer. In questi casi, i mapping tra i valori chiave full-text e i valori DocId vengono mantenuti in una tabella separata denominata DocId Mapping. Per eseguire una query per questi mapping utilizzare la stored procedure di sistema sp_fulltext_keymappings. Per soddisfare una condizione di ricerca, è necessario unire in join i valori DocId della tabella precedente e della 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.

[TORNA ALL'INIZIO]

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. Se ad esempio 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

Title

3

Rear Reflector

Nell'esempio seguente, Fragment 2, il frammento contiene dati più recenti su DocId rispetto a Fragment 1. Quando pertanto 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.

Fragment 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 tramite l'opzione REORGANIZE dell'istruzione ALTER FULLTEXT CATALOG Transact-SQL. 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

Maintenance

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

[TORNA ALL'INIZIO]