CREATE FULLTEXT INDEX (Transact-SQL)

Crea un indice full-text per una tabella o una vista indicizzata di un database. È consentito un solo indice full-text per tabella o vista indicizzata e ogni indice full-text viene applicato a una singola tabella o vista indicizzata.

Un indice full-text può contenere fino a 1024 colonne.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

CREATE FULLTEXT INDEX ON table_name
   [ ( { column_name 
             [ TYPE COLUMN type_column_name ]
             [ LANGUAGE language_term ] 
        } [ ,...n] 
      ) ]
    KEY INDEX index_name 
    [ ON <catalog_filegroup_option> ]
    [ WITH [ ( ] <with_option> [ ,...n] [ ) ] ]
[;]

<catalog_filegroup_option>::=
 {
    fulltext_catalog_name 
 | ( fulltext_catalog_name, FILEGROUP filegroup_name )
 | ( FILEGROUP filegroup_name, fulltext_catalog_name )
 | ( FILEGROUP filegroup_name )
 }

<with_option>::=
 {
   CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [, NO POPULATION ] } 
 | STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
 }

Argomenti

  • table_name
    Nome della tabella o della vista indicizzata contenente la colonna o le colonne incluse nell'indice full-text.

  • column_name
    Nome della colonna inclusa nell'indice full-text. Per la ricerca full-text possono essere indicizzate solo le colonne di tipo char, varchar, nchar, nvarchar, text, ntext, image, xml e varbinary(max). Per specificare più colonne, ripetere la clausola column_name come indicato di seguito:

    CREATE FULLTEXT INDEX ON table_name (column_name1 […], column_name2 […]) …

  • TYPE COLUMN type_column_name
    Specifica il nome di una colonna della tabella, type_column_name, utilizzato per contenere il tipo di documento per un documento varbinary(max) o image. Questa colonna, nota come colonna di tipo, contiene un'estensione di file fornita dall'utente (doc, pdf, xls e così via). Il tipo di questa colonna deve essere char, nchar, varchar o nvarchar.

    Specificare TYPE COLUMN type_column_name solo se column_name specifica una colonna varbinary(max) o image in cui i dati vengono archiviati come dati binari. In caso contrario SQL Server restituisce un errore.

    Nota

    Durante l'indicizzazione il motore di ricerca full-text utilizza l'abbreviazione nella colonna di tipo di ogni riga di tabella per identificare il filtro di ricerca full-text da utilizzare per il documento in column_name. Il filtro carica il documento come flusso binario, rimuove le informazioni sulla formattazione e invia il testo dal documento al componente word breaker. Per ulteriori informazioni, vedere Filtri di ricerca full-text.

  • LANGUAGE language_term
    Lingua dei dati archiviati in column_name.

    language_term è facoltativo ed è possibile specificare un valore stringa, intero o esadecimale corrispondente all'identificatore delle impostazioni locali (LCID) di una lingua. Se non viene specificato alcun valore, viene utilizzata la lingua predefinita dell'istanza di SQL Server.

    Se si specifica language_term, la lingua rappresentata viene utilizzata per indicizzare i dati archiviati nelle colonne di tipo char, nchar, varchar, nvarchar, text e ntext. Questa lingua corrisponde alla lingua predefinita utilizzata in fase di query se non viene specificato language_term in un predicato full-text per la colonna.

    Se l'argomento language_term viene specificato come stringa, corrisponde al valore della colonna alias nella tabella di sistema syslanguages. La stringa deve essere racchiusa tra virgolette singole, come in 'language_term'. Se l'argomento language_term viene specificato come valore integer, corrisponde all'LCID effettivo che identifica la lingua. Se si specifica un valore esadecimale, language_term è 0x seguito dal valore esadecimale di LCID. Il valore esadecimale deve essere composto al massimo da otto cifre, zero iniziali inclusi.

    Se il valore è in formato DBCS (Double-Byte Character Set), SQL Server lo convertirà in Unicode.

    È necessario abilitare per la lingua specificata in language_term le risorse quali il word breaker e lo stemmer. Se tali risorse non supportano la lingua specificata, SQL Server restituirà un errore.

    Utilizzare la stored procedure sp_configure per ottenere informazioni sulla lingua predefinita full-text dell'istanza di Microsoft SQL Server. Per ulteriori informazioni, vedere sp_configure (Transact-SQL) e Opzione default full-text language.

    Per le colonne di tipo non BLOB e non XML che contengono dati di testo in più lingue oppure nei casi in cui la lingua del testo archiviato nella colonna è sconosciuta, potrebbe essere appropriato utilizzare la risorsa per la lingua neutra (0x0). È tuttavia necessario considerare prima le possibili conseguenze derivanti dall'utilizzo di tale risorsa. Per informazioni sulle possibili soluzioni e conseguenze dell'utilizzo della risorsa per la lingua neutra (0x0), vedere Procedure consigliate per la scelta di una lingua durante la creazione di un indice full-text.

    Per i documenti archiviati in colonne di tipo XML o BLOB, in fase di indicizzazione viene utilizzata la codifica della lingua del documento. Nelle colonne XML, ad esempio, la lingua è identificata dall'attributo xml:lang nei documenti XML. In fase di query, il valore precedentemente specificato in language_term diventa la lingua predefinita per le query full-text, a meno che non si specifichi language_term all'interno di una query full-text.

  • KEY INDEX index_name
    Nome dell'indice di chiave univoca in table_name. KEY INDEX deve essere una colonna chiave singola univoca che non ammette valori Null. Selezionare l'indice di chiave univoca più piccolo possibile per la chiave univoca full-text. Per prestazioni ottimali, si consiglia di utilizzare un tipo di dati integer per la chiave full-text.

  • fulltext_catalog_name
    Catalogo full-text utilizzato per l'indice full-text. Il catalogo deve esistere nel database corrente. Questa clausola è facoltativa. Se non viene specificata, viene utilizzato un catalogo predefinito. Se non esiste alcun catalogo predefinito, SQL Server restituisce un errore.

  • FILEGROUP filegroup_name
    Crea l'indice full-text specificato nel filegroup specificato. È necessario che il filegroup esista già. Se la clausola FILEGROUP non viene specificata, l'indice full-text viene posizionato nello stesso filegroup della tabella o della vista di base nel caso di una tabella non partizionata o nel filegroup primario nel caso di una tabella partizionata.

  • CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [ , NO POPULATION ] }
    Specifica se le modifiche (aggiornamenti, eliminazioni o inserimenti) apportate alle colonne della tabella coperte dall'indice full-text verranno propagate da SQL Server all'indice full-text. Le modifiche apportate ai dati tramite WRITETEXT e UPDATETEXT non vengono riportate nell'indice full-text e pertanto non vengono registrate dalla funzione di rilevamento delle modifiche.

    • MANUAL
      Specifica che le modifiche rilevate devono essere propagate manualmente chiamando l'istruzione Transact-SQL ALTER FULLTEXT INDEX … START UPDATE POPULATION (popolamento manuale). Per chiamare questa istruzione Transact-SQL periodicamente, è possibile utilizzare SQL Server Agent.

    • AUTO
      Specifica che le modifiche rilevate verranno propagate automaticamente quando vengono modificati i dati nella tabella di base (popolamento automatico). Sebbene le modifiche vengano propagate automaticamente, tali modifiche potrebbero non risultare immediatamente nell'indice full-text. AUTO è l'impostazione predefinita.

    • OFF [ , NO POPULATION]
      Specifica che SQL Server non mantiene un elenco delle modifiche apportate ai dati indicizzati. Se non si specifica NO POPULATION, SQL Server popola l'indice completamente dopo che è stato creato.

      L'opzione NO POPULATION può essere utilizzata solo se l'impostazione di CHANGE_TRACKING è OFF. Se si specifica NO POPULATION, SQL Server non popola un indice dopo che è stato creato. L'indice viene popolato solo dopo avere eseguito il comando ALTER FULLTEXT INDEX con la clausola START FULL POPULATION o START INCREMENTAL POPULATION.

  • STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
    Associa un elenco di parole non significative full-text all'indice. L'indice non viene popolato con alcun token che faccia parte dell'elenco di parole non significative specificato. Se non si specifica STOPLIST, SQL Server associa l'elenco di parole non significative full-text di sistema all'indice.

    • OFF
      Specifica che all'indice full-text non deve essere associato alcun elenco di parole non significative.

    • SYSTEM
      Specifica che per l'indice full-text deve essere utilizzato l'elemento STOPLIST full-text di sistema predefinito.

    • stoplist_name
      Specifica il nome dell'elenco di parole non significative da associare all'indice full-text.

Osservazioni

Per ulteriori informazioni sugli indici full-text, vedere Configurazione di indici e cataloghi full-text per un database.

Nelle colonne xml è possibile creare un indice full-text per indicizzare il contenuto degli elementi XML ignorando il markup XML. Ai valori di attributo viene applicata l'indicizzazione full-text a meno che non siano valori numerici. I tag elemento sono utilizzati come limiti del token. Sono supportati documenti e frammenti XML o HTML ben formati contenenti più lingue. Per ulteriori informazioni, vedere Indice full-text su una colonna XML.

Si consiglia di utilizzare un tipo di dati integer per la colonna chiave indice per consentire l'ottimizzazione durante l'esecuzione della query.

Interazioni del rilevamento delle modifiche con NO POPULATION

Il popolamento dell'indice full-text dipende dal fatto che il rilevamento delle modifiche sia o meno abilitato e che si specifichi o meno WITH NO POPULATION nell'istruzione ALTER FULLTEXT INDEX. Nella tabella seguente è riepilogato il risultato di tali interazioni.

Rilevamento delle modifiche

WITH NO POPULATION

Risultato

Non abilitato

Non specificato

Viene eseguito il popolamento completo dell'indice.

Non abilitato

Specificato

L'indice non viene popolato fino a quando non viene eseguita un'istruzione ALTER FULLTEXT INDEX...START POPULATION.

Abilitato

Specificato

Viene generato un errore e l'indice non viene modificato.

Abilitato

Non specificato

Viene eseguito un popolamento completo dell'indice.

Per ulteriori informazioni sul popolamento degli indici full-text, vedere Popolamento dell'indice full-text.

Autorizzazioni

L'utente deve disporre dell'autorizzazione REFERENCES nel catalogo full-text e dell'autorizzazione ALTER nella tabella o nella vista indicizzata oppure deve essere membro del ruolo predefinito del server sysadmin o del ruolo predefinito del database db_owner o db_ddladmin.

Se SET STOPLIST è specificato, l'utente deve disporre dell'autorizzazione REFERENCES nell'elenco di parole non significative specificato. Questa autorizzazione può essere concessa dal proprietario di STOPLIST.

Nota

Agli utenti viene concessa l'autorizzazione REFERENCE per l'elenco di parole non significative predefinito fornito con SQL Server.

Esempi

A. Creazione di un indice univoco, un catalogo full-text e un indice full-text

Nell'esempio seguente viene creato un indice univoco sulla colonna JobCandidateID della tabella HumanResources.JobCandidate del database di esempio AdventureWorks2008R2. Viene quindi creato un catalogo full-text predefinito, ft e infine viene creato un indice full-text sulla colonna Resume utilizzando il catalogo ft e l'elenco di parole non significative del sistema.

USE AdventureWorks2008R2;
GO
CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID);
CREATE FULLTEXT CATALOG ft AS DEFAULT;
CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume) 
   KEY INDEX ui_ukJobCand 
   WITH STOPLIST = SYSTEM;
GO

B. Creazione di un indice full-text su diverse colonne della tabella

Nell'esempio seguente viene creato un indice full-text sulle colonne ReviewerName, EmailAddress e Comments della tabella Production.ProductReview del database di esempio AdventureWorks2008R2. Per ogni colonna, nell'esempio viene specificato l'identificatore LCID dell'inglese, 1033, che identifica la lingua dei dati nelle colonne. Questo indice full-text utilizza il catalogo full-text predefinito e un indice della chiave univoca esistente, PK_ProductReview_ProductReviewID. Come consigliato, questa chiave di indice è in una colonna integer, ProductReviewID.

USE AdventureWorks2008R2;
GO
CREATE FULLTEXT INDEX ON Production.ProductReview
( 
  ReviewerName
     Language 1033,
  EmailAddress
     Language 1033,
  Comments 
     Language 1033     
 ) 
KEY INDEX PK_ProductReview_ProductReviewID ; 
GO

C. Creazione di un indice full-text senza popolarlo

Nell'esempio seguente viene creato un catalogo full-text, documents_catalog, nel database di esempio AdventureWorks2008R2. Nell'esempio viene quindi creato un indice full-text che utilizza questo nuovo catalogo. L'indice full-text è sulle colonne Title, DocumentSummary e Document della tabella Production.Document. Nell'esempio viene specificato l'identificatore LCID dell'inglese, 1033, che identifica la lingua dei dati delle colonne. Questo indice full-text utilizza il catalogo full-text predefinito e un indice della chiave univoca esistente, PK_Document_DocumentID. Come consigliato, questa chiave di indice è in una colonna integer, DocumentID.

Nell'esempio viene inoltre specificata la parola non significativa SYSTEM.

Nell'esempio viene specificato che il rilevamento delle modifiche è disabilitato e non viene eseguito il popolamento. In un secondo momento, durante le ore di minore attività, nell'esempio viene utilizzata un'istruzione ALTER FULLTEXT INDEX per avviare il popolamento completo del nuovo indice e abilitare il rilevamento delle modifiche automatico.

USE AdventureWorks2008R2;
GO
CREATE FULLTEXT CATALOG documents_catalog;
GO
CREATE FULLTEXT INDEX ON Production.Document
  ( 
  Title
      Language 1033, 
  DocumentSummary
      Language 1033, 
  Document 
      TYPE COLUMN FileExtension
      Language 1033 
  )
  KEY INDEX PK_Document_DocumentID
      ON documents_catalog
      WITH STOPLIST = SYSTEM , CHANGE_TRACKING OFF, NO POPULATION;
   GO

In un secondo momento, in un orario di minore attività, l'indice viene popolato:

ALTER FULLTEXT INDEX ON Production.Document SET CHANGE_TRACKING AUTO;
GO