Introduzione alla ricerca full-text

Per impostazione predefinita, nei database SQL Server è attivata la funzionalità full-text. Per utilizzare un indice full-text in una tabella, è tuttavia necessario impostare la funzionalità di indicizzazione full-text nelle colonne delle tabelle a cui si desidera accedere mediante il motore di ricerca full-text.

L'operazione comporta i passaggi principali seguenti:

  1. Creazione di un catalogo full-text per archiviare indici full-text.

    Ogni indice full-text deve appartenere a un catalogo full-text. È possibile creare un catalogo di testo separato per ogni indice full-text oppure associare più indici full-text a un determinato catalogo.

    [!NOTA]

    A partire da SQL Server 2008 un catalogo full-text è un oggetto virtuale che non appartiene ad alcun filegroup. Un catalogo full-text è un concetto logico che fa riferimento a un gruppo di indici full-text.

  2. Creazione di un indice full-text nella tabella o vista indicizzata.

    Un indice full-text è un tipo speciale di indice funzionale basato su token creato e gestito dal motore di ricerca full-text. Per creare una ricerca full-text su una tabella o una vista, è necessario disporre di un indice univoco a colonna singola che non ammette valori Null. Questo indice univoco viene utilizzato dal motore di ricerca full-text per eseguire il mapping di ogni riga della tabella a una chiave univoca comprimibile. Un indice full-text può includere colonne char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinarye varbinary(max). Per ulteriori informazioni, vedere Cenni preliminari sull'indicizzazione full-text.

Prima di imparare a creare indici full-text, è importante valutare le differenze rispetto ai normali indici SQL Server. Nella tabella seguente vengono elencate tali differenze.

Indici full-text

Indici SQL Server normali

È consentito un solo indice full-text per tabella.

Sono consentiti più indici normali per tabella.

L'aggiunta di dati a indici full-text, definita popolamento, può essere richiesta in modo specifico, tramite pianificazione oppure può avvenire in modo automatico con l'aggiunta di nuovi dati.

Vengono automaticamente aggiornati quando si inseriscono, aggiornano o eliminano dati.

Sono raggruppati all'interno dello stesso database in uno o più cataloghi full-text.

Non sono raggruppati.

Considerazioni relative alla creazione di un indice full-text

In questa sezione vengono trattati i seguenti argomenti:

  • Scelta della lingua delle colonne

  • Scelta di un filegroup per un indice full-text

  • Assegnazione dell'indice full-text a un catalogo full-text

  • Associazione di un elenco di parole non significative all'indice full-text

  • Aggiornamento di un indice full-text

Scelta della lingua delle colonne

Per informazioni sugli aspetti da considerare nella scelta della lingua delle colonne, vedere Procedure consigliate per la scelta di una lingua durante la creazione di un indice full-text.

Scelta di un filegroup per un indice full-text

Il processo di creazione di un indice full-text richiede l'esecuzione di molte operazioni di I/O (in senso lato, consiste nella lettura di dati da SQL Servere nella propagazione dei dati filtrati all'indice full-text). La procedura consigliata consiste nell'individuare l'indice full-text nel filegroup del database ideale per ottimizzare le prestazioni di I/O oppure gli indici full-text in un filegroup diverso in un altro volume.

Per semplificare la gestione, è consigliabile archiviare i dati delle tabelle ed eventuali cataloghi full-text associati nello stesso filegroup. Per motivi legati alle prestazioni, potrebbe essere necessario mantenere i dati delle tabelle e l'indice full-text in filegroup diversi archiviati in volumi diversi allo scopo di ottimizzare il parallelismo di I/O.

Assegnazione dell'indice full-text a un catalogo full-text

È importante pianificare l'inserimento di indici full-text per le tabelle in cataloghi full-text.

È consigliabile associare nello stesso catalogo full-text le tabelle con caratteristiche di aggiornamento equivalenti, ad esempio un numero ridotto o elevato di modifiche oppure modifiche frequenti apportate a una determinata ora del giorno. Pianificando il popolamento del catalogo full-text, gli indici full-text mantengono la sincronizzazione con le tabelle senza influire negativamente sull'utilizzo delle risorse del server database durante i periodi di elevata attività del database.

Quando si assegna una tabella a un catalogo full-text, considerare le linee guida seguenti:

  • Selezionare sempre il più piccolo indice univoco disponibile per la chiave univoca full-text. Un indice basato su valori integer a quattro byte è l'impostazione ottimale. Ciò consente di ridurre notevolmente le risorse richieste dal servizio Microsoft Search nel file system. Se la chiave primaria è di grandi dimensioni (oltre 100 byte), considerare la possibilità di scegliere un altro indice univoco nella tabella (o di creare un altro indice univoco) come chiave univoca full-text. In caso contrario, se le dimensioni della chiave univoca raggiungono il massimo consentito (900 byte), non sarà possibile eseguire il popolamento full-text.

  • Se viene indicizzata una tabella che include milioni di righe, assegnarla al proprio catalogo full-text.

  • Considerare la quantità di modifiche apportate alle tabelle durante l'indicizzazione full-text, nonché il numero totale di righe. Se il numero totale di righe modificate sommato al numero di righe della tabella presenti durante l'ultimo popolamento full-text corrisponde a milioni di righe, assegnare la tabella al proprio catalogo full-text.

Associazione di un elenco di parole non significative all'indice full-text

In SQL Server 2008 sono stati introdotti gli elenchi di parole non significative. Un elenco di parole non significative, noto anche solo con il termine parole non significative, viene associato a ogni indice full-text e le parole in esso contenute vengono applicate alle query full-text di quell'indice. Per impostazione predefinita, a un nuovo indice full-text viene associato l'elenco di parole non significative di sistema. È tuttavia possibile creare e utilizzare un elenco di parole non significative personalizzato. Per ulteriori informazioni, vedere Parole non significative ed elenchi di parole non significative.

Ad esempio, l'istruzione CREATE FULLTEXT STOPLISTTransact-SQL seguente consente di creare un nuovo elenco di parole non significative full-text denominato myStoplist3, effettuando la copia dall'elenco di parole non significative di sistema:

CREATE FULLTEXT STOPLIST myStoplist FROM SYSTEM STOPLIST;
GO

L'istruzione ALTER FULLTEXT STOPLISTTransact-SQL seguente consente di modificare un elenco di parole non significative denominato myStoplist, aggiungendo 'en' per lo spagnolo e poi per il francese:

ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'Spanish';
ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'French';
GO

Aggiornamento di un indice full-text

Come i normali indici SQL Server, gli indici full-text possono essere aggiornati automaticamente alla modifica dei dati delle tabelle associate. Questo è il comportamento predefinito. In alternativa, è possibile aggiornare gli indici full-text manualmente o a intervalli pianificati specificati. Poiché il popolamento di un indice full-text può richiedere tempi lunghi e l'utilizzo di molte risorse, l'aggiornamento dell'indice full-text viene in genere eseguito in background come processo asincrono in seguito alle modifiche apportate alla tabella di base. L'aggiornamento immediato di un indice full-text dopo ogni modifica apportata alla tabella di base può richiedere l'utilizzo di molte risorse. Pertanto, se la frequenza con cui si eseguono aggiornamenti, inserimenti ed eliminazioni è molto elevata, è possibile notare un calo delle prestazioni a livello di esecuzione delle query. In questo caso, considerare la pianificazione di aggiornamenti con rilevamento manuale delle modifiche per gestire gradualmente le numerose modifiche, anziché dividere le risorse con le query.

Per monitorare lo stato del popolamento, utilizzare la funzione FULLTEXTCATALOGPROPERTY o OBJECTPROPERTYEX. Per ottenere lo stato del popolamento del catalogo, eseguire l'istruzione seguente:

SELECT FULLTEXTCATALOGPROPERTY('AdvWksDocFTCat', 'Populatestatus');

In genere, se è in corso un popolamento completo, il risultato restituito è 1.

Esempio: impostazione della ricerca full-text in AdventureWorks (Transact-SQL)

L'esempio in due parti seguente consiste nella creazione di un catalogo full-text denominato AdvWksDocFTCat nel database AdventureWorks e quindi nella creazione di un indice full-text nella tabella Document in AdventureWorks. Questa istruzione determina la creazione del catalogo full-text nella directory predefinita specificata durante l'installazione. La cartella denominata AdvWksDocFTCat si trova nella directory predefinita.

  1. Per creare un catalogo full-text denominato AdvWksDocFTCat, nell'esempio viene utilizzata un'istruzione CREATE FULLTEXT CATALOG:

    USE AdventureWorks;
    GO
    CREATE FULLTEXT CATALOG AdvWksDocFTCat;
    
  2. Prima di creare un indice full-text nella tabella Document, assicurarsi che la tabella disponga di un indice univoco a singola colonna che non ammette valori Null. L'istruzione CREATE INDEX seguente consente di creare un indice univoco, ui_ukDoc, nella colonna DocumentID della tabella Document:

    CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);
    
  3. Quando si dispone di una chiave univoca, è possibile creare un indice full-text nella tabella Document utilizzando l'istruzione CREATE FULLTEXT INDEX seguente.

    CREATE FULLTEXT INDEX ON Production.Document
    (
        Document                         --Full-text index column name 
            TYPE COLUMN FileExtension    --Name of column that contains file type information
            Language 2057                 --2057 is the LCID for British English
    )
    KEY INDEX ui_ukDoc ON AdvWksDocFTCat --Unique index
    WITH CHANGE_TRACKING AUTO            --Population type;
    GO
    

    L'elemento TYPE COLUMN definito in questo esempio specifica la colonna del tipo nella tabella che contiene il tipo di documento in ciascuna riga della colonna 'Document' (che è di tipo binario). Nella colonna del tipo è archiviata l'estensione file fornita dall'utente, ovvero "doc", "xls" e così via, del documento in una determinata riga. Il motore di ricerca full-text utilizza l'estensione file in una determinata riga per richiamare il filtro corretto da utilizzare per l'analisi dei dati di quella riga. Al termine dell'analisi dei dati binari della riga eseguita tramite il filtro, il word breaker specificato analizzerà il contenuto. In questo esempio viene utilizzato il word breaker per l'Inglese britannico. Si noti che il processo di filtro viene eseguito unicamente durante l'indicizzazione o quando un utente inserisce o aggiorna una colonna della tabella di base con il rilevamento delle modifiche automatico abilitato per l'indice full-text. Per ulteriori informazioni, vedere Filtri di ricerca full-text.

Per visualizzare informazioni su un indice full-text

Catalogo o vista a gestione dinamica

Descrizione

sys.fulltext_index_catalog_usages (Transact-SQL)

Restituisce una riga per ogni catalogo full-text in riferimento all'indice full-text.

sys.fulltext_index_columns (Transact SQL)

Contiene una riga per ogni colonna che fa parte di un indice full-text.

sys.fulltext_index_fragments (Transact-SQL)

Un indice full-text utilizza tabelle interne denominate frammenti di indice full-text per archiviare i dati dell'indice invertito. Questa vista può essere utilizzata per eseguire una query sui metadati in relazione a questi frammenti. Nella vista è contenuta una riga per ogni frammento di indice full-text presente in ogni tabella contenente un indice full-text.

sys.fulltext_indexes (Transact-SQL)

Contiene una riga per indice full-text di un oggetto in formato di tabella.

sys.dm_fts_index_keywords (Transact-SQL)

Restituisce informazioni sul contenuto di un indice full-text per la tabella specificata.

sys.dm_fts_index_keywords_by_document (Transact-SQL)

Restituisce informazioni sul contenuto a livello di documento di un indice full-text per la tabella specificata. Una parola chiave specificata può apparire in numerosi documenti.

sys.dm_fts_index_population (Transact-SQL)

Restituisce informazioni sui popolamenti di indici full-text in corso.