CREATE FULLTEXT INDEX (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

Crea un indice full-text per una tabella o una vista indicizzata di un database in SQL Server. È 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.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

CREATE FULLTEXT INDEX ON table_name
   [ ( { column_name
             [ TYPE COLUMN type_column_name ]
             [ LANGUAGE language_term ]
             [ STATISTICAL_SEMANTICS ]
        } [ , ...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 }
 | SEARCH PROPERTY LIST [ = ] property_list_name
 }

Argomenti

table_name

Nome della tabella o della vista indicizzata che contiene 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 è possibile indicizzare solo 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 di tabella, type_column_name, utilizzata 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). La colonna del tipo deve essere di tipo char, nchar, varcharo nvarchar.

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

Nota

Durante l'indicizzazione il motore di ricerca full-text usa l'abbreviazione nella colonna di tipo di ogni riga di tabella per identificare il filtro di ricerca full-text da usare 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 altre informazioni, vedere Configurazione e gestione di filtri per la ricerca.

LANGUAGE language_term

Lingua dei dati archiviati in column_name.

language_term è facoltativo e può essere specificato come valore stringa, intero o esadecimale corrispondente all'identificatore delle impostazioni locali (LCID) di una lingua. Se non viene specificato alcun valore, viene usata la lingua predefinita dell'istanza di SQL Server.

Se si specifica language_term , la lingua rappresentata viene usata per indicizzare i dati archiviati in colonne char, nchar, varchar, nvarchar, text e ntext . Questo linguaggio è il linguaggio predefinito usato in fase di query se language_term non viene specificato come parte di un predicato full-text sulla colonna.

Se specificato come stringa, language_term corrisponde al valore della colonna alias nella tabella di sys.syslanguages sistema. La stringa deve essere racchiusa tra virgolette singole, come in 'language_term'. Se l'argomento language_term viene specificato come valore intero, corrisponde all'LCID effettivo che identifica la lingua. Se specificato come valore esadecimale, language_term viene 0x seguito dal valore esadecimale dell'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), verrà convertito in Unicode da SQL Server.

Per la lingua specificata in language_term è necessario abilitare risorse quali word breaker e stemmer. Se tali risorse non supportano la lingua specificata, SQL Server restituisce un errore.

Utilizzare la sp_configure stored procedure per accedere alle informazioni sulla lingua full-text predefinita dell'istanza di Microsoft SQL Server. Per altre informazioni, vedere sp_configure (Transact-SQL).

Per le colonne non BLOB e non XML contenenti dati di testo in più lingue o per i casi in cui la lingua del testo archiviato nella colonna è sconosciuta, potrebbe essere opportuno usare la risorsa lingua neutra (0x0). Tuttavia, prima di tutto è necessario comprendere le possibili conseguenze dell'uso della risorsa di lingua neutra (0x0). Per informazioni sulle possibili soluzioni e sulle conseguenze dell'uso della risorsa di lingua neutra (0x0), vedere Scegliere una lingua durante la creazione di un indice full-text.

Per i documenti archiviati in colonne di tipo XML o BLOB, la codifica del linguaggio all'interno del documento viene utilizzata in fase di indicizzazione. Nelle colonne XML, ad esempio, l'attributo xml:lang nei documenti XML identifica il linguaggio. 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.

STATISTICAL_SEMANTICS

Si applica a: SQL Server 2012 (11.x) e versioni successive

Consente di creare la frase chiave aggiuntiva e gli indici di somiglianza dei documenti che fanno parte dell'indicizzazione semantica statistica. Per altre informazioni, vedere Ricerca semantica (SQL Server).

KEY INDEX index_name

Nome dell'indice di chiave univoco in table_name. KEY INDEX deve essere una colonna chiave singola univoca che non ammette i 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. La clausola è facoltativa. Se non è specificato, viene usato un catalogo predefinito. Se non esiste un catalogo predefinito, SQL Server restituisce un errore.

FILEGROUP filegroup_name

Crea l'indice full-text specificato nel filegroup specificato. Il filegroup deve essere già esistente. Se la clausola FILEGROUP non è specificata, l'indice full-text viene inserito nello stesso filegroup della tabella o della vista di base per una tabella non partizionata o nel filegroup primario per una tabella partizionata.

CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [ , NO POPULATION ] }

Specifica se le modifiche (aggiornamenti, eliminazioni o inserimenti) apportate alle colonne delle tabelle coperte dall'indice full-text verranno propagate da SQL Server all'indice full-text. Le modifiche dei dati tramite WRITETEXT e UPDATETEXT non vengono riflesse nell'indice full-text e non vengono rilevate con il 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 periodicamente questa istruzione Transact-SQL, è possibile usare SQL Server Agent.

  • AUTO

    Specifica che le modifiche rilevate vengono propagate automaticamente man mano che i dati vengono modificati 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 di modifiche ai dati indicizzati. Quando NO POPULATION non è specificato, SQL Server popola completamente l'indice dopo la creazione.

L'opzione NO POPULATION può essere utilizzata solo se l'impostazione di CHANGE_TRACKING è OFF. Quando si specifica NO POPULATION, SQL Server non popola un indice dopo la creazione. 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 token che fanno parte dell'elenco di parole non significative specificato. Se STOPLIST non è specificato, SQL Server associa l'elenco di parole non significative full-text di sistema all'indice.

  • OFF

    Specifica che nessun elenco di parole non significative è associato all'indice full-text.

  • 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.

SEARCH PROPERTY LIST [ = ] property_list_name

Si applica a: SQL Server 2012 (11.x) e versioni successive

Associa un elenco di proprietà di ricerca all'indice.

  • OFF

    Specifica che nessun elenco di proprietà è associato all'indice full-text.

  • property_list_name

    Specifica il nome dell'elenco delle proprietà di ricerca da associare all'indice full-text.

Osservazioni:

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 degli elementi vengono utilizzati come limiti dei token. Sono supportati documenti e frammenti XML o HTML ben formati e contenenti più lingue. Per altre informazioni, vedere Utilizzo della ricerca full-text con colonne XML.

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

CREATE FULLTEXT INDEX non può essere inserito all'interno di una transazione utente. Questa istruzione deve essere eseguita nella propria transazione implicita.

Per altre informazioni sugli indici full-text, vedere Creare e gestire indici full-text.

Interazioni del rilevamento delle modifiche e del parametro 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 tale interazione.

Registrazione modifiche WITH NO POPULATION Risultato
Non abilitato Non specificato Viene eseguito un 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.
Attivata Specificato Viene generato un errore e l'indice non viene modificato.
Attivata Non specificato Viene eseguito un popolamento completo dell'indice.

Per altre informazioni sul popolamento degli indici full-text, vedere Popolare gli indici full-text.

Autorizzazioni

L'utente deve avere l'autorizzazione REFERENCES per il catalogo full-text e dell'autorizzazione ALTER per la tabella o la vista indicizzata oppure deve essere membro del ruolo predefinito del server sysadmin o del ruolo predefinito del database db_owner o db_ddladmin.

Se si specifica SET STOPLIST, l'utente deve avere l'autorizzazione REFERENCES per l'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

R. Creare un indice univoco, un catalogo full-text e un indice full-text

Nell'esempio seguente viene creato un indice univoco nella JobCandidateID colonna della HumanResources.JobCandidate tabella del database di esempio AdventureWorks2022. 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.

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. Creare un indice full-text in diverse colonne di tabella

Nell'esempio seguente viene creato un catalogo full-text, production_catalog, nel database di esempio AdventureWorks. Nell'esempio viene quindi creato un indice full-text che utilizza questo nuovo catalogo. L'indice full-text si trova nelle ReviewerNamecolonne , EmailAddresse Comments di Production.ProductReview. 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 un indice della chiave univoca esistente, PK_ProductReview_ProductReviewID. Come consigliato, questa chiave di indice è in una colonna di valori interi, ProductReviewID.

CREATE FULLTEXT CATALOG production_catalog;
GO

CREATE FULLTEXT INDEX ON Production.ProductReview (
    ReviewerName LANGUAGE 1033,
    EmailAddress LANGUAGE 1033,
    Comments LANGUAGE 1033
) KEY INDEX PK_ProductReview_ProductReviewID ON production_catalog;
GO

C. Creare un indice full-text con un elenco di proprietà di ricerca senza popolarlo

Nell'esempio seguente viene creato un 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 di valori interi, DocumentID.

Nell'esempio viene inoltre specificato l'elenco di parole non significative SYSTEM. Specifica anche un elenco di proprietà di ricerca, DocumentPropertyList. Per un esempio in cui viene creato questo elenco di proprietà, vedere CREATE SEARCH PROPERTY LIST (Transact-SQL).

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.

CREATE FULLTEXT INDEX ON Production.Document (
    Title LANGUAGE 1033,
    DocumentSummary LANGUAGE 1033,
    Document TYPE COLUMN FileExtension LANGUAGE 1033
) KEY INDEX PK_Document_DocumentID
WITH STOPLIST = SYSTEM,
    SEARCH PROPERTY LIST = DocumentPropertyList,
    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

Vedi anche