Popolamento degli indici full-textPopulate Full-Text Indexes

La creazione e la gestione di un indice full-text comporta il popolamento dell'indice con un processo denominato popolamento , noto anche con il termine ricerca per indicizzazione.Creating and maintaining a full-text index involves populating the index by using a process called a population (also known as a crawl).

Types of population Types of population

Un indice full-text supporta i tipi di popolamento seguenti:A full-text index supports the following types of population:

  • Popolamento completoFull population
  • Popolamento automatico o manuale basato sul rilevamento delle modificheAutomatic or manual population based on change tracking
  • Popolamento incrementale basato su timestampIncremental population based on a timestamp

Popolamento completoFull population

Durante un popolamento completo, vengono compilate voci di indice per tutte le righe di una tabella o di una vista indicizzata.During a full population, index entries are built for all the rows of a table or indexed view. Durante un popolamento completo di un indice full-text, vengono compilate voci di indice per tutte le righe di una tabella di base o di una vista indicizzata.A full population of a full-text index, builds index entries for all the rows of the base table or indexed view.

Per impostazione predefinita, in SQL ServerSQL Server un nuovo indice full-text viene popolato completamente non appena viene creato.By default, SQL ServerSQL Server populates a new full-text index fully as soon as it is created.

  • D'altra parte un popolamento completo può richiedere una quantità significativa di risorse.On the one hand, a full population can consume a significant amount of resources. Di conseguenza, quando si crea un indice full-text durante periodi di intensa attività è spesso consigliabile rimandare il popolamento completo a un periodo di attività meno intensa, in particolare se la tabella di base di un indice full-text è di grandi dimensioni.Therefore, when creating a full-text index during peak periods, it is often a best practice to delay the full population until an off-peak time, particularly if the base table of an full-text index is large.
  • Tuttavia, il catalogo full-text a cui appartiene l'indice non può essere usato finché non vengono popolati tutti i relativi indici full-text.On the other hand, the full-text catalog to which the index belongs is not usable until all of its full-text indexes are populated.

Per creare un indice full-text senza popolarlo immediatamente, specificare la clausola CHANGE_TRACKING OFF, NO POPULATION nell'istruzione CREATE FULLTEXT INDEX.To create a full-text index without populating it immediately, specify the CHANGE_TRACKING OFF, NO POPULATION clause in the CREATE FULLTEXT INDEX statement. Se si specifica CHANGE_TRACKING MANUAL, il motore di ricerca full-text non popola il nuovo indice full-text finché non viene eseguita l'istruzione ALTER FULLTEXT INDEX usando la clausola START FULL POPULATION o START INCREMENTAL POPULATION.If you specify CHANGE_TRACKING MANUAL, the Full-Text Engine doesn't populate the new full-text index until you execute an ALTER FULLTEXT INDEX statement using the START FULL POPULATION or START INCREMENTAL POPULATION clause.

Esempio: creare un indice full-text senza eseguire un popolamento completoExample - Create a full-text index without running a full population

Nell'esempio seguente viene creato un indice full-text nella tabella Production.Document del database di esempio AdventureWorks .The following example creates a full-text index on the Production.Document table of the AdventureWorks sample database. Questo esempio usa WITH CHANGE_TRACKING OFF, NO POPULATION per ritardare il popolamento completo iniziale.This example uses WITH CHANGE_TRACKING OFF, NO POPULATION to delay the initial full population.

CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);  
CREATE FULLTEXT CATALOG AW_Production_FTCat;  
CREATE FULLTEXT INDEX ON Production.Document  
(  
    Document                         --Full-text index column name   
        TYPE COLUMN FileExtension    --Name of column that contains file type information  
        Language 1033                 --1033 is LCID for the English language  
)  
    KEY INDEX ui_ukDoc  
    ON AW_Production_FTCat  
    WITH CHANGE_TRACKING OFF, NO POPULATION;  
GO  

Esempio: eseguire un popolamento completo in una tabellaExample - Run a full population on a table

Nell'esempio seguente viene eseguito un popolamento completo nella tabella Production.Document del database di esempio AdventureWorks .The following example runs a full population on the Production.Document table of the AdventureWorks sample database.

ALTER FULLTEXT INDEX ON Production.Document  
   START FULL POPULATION;  

Popolamento basato sul rilevamento delle modifichePopulation based on change tracking

Facoltativamente, è possibile utilizzare il rilevamento delle modifiche per gestire un indice full-text dopo il popolamento completo iniziale.Optionally, you can use change tracking to maintain a full-text index after its initial full population. Al rilevamento delle modifiche è associato un overhead perché in SQL ServerSQL Server è presente una tabella nella quale vengono rilevate le modifiche apportate alla tabella di base dopo l'ultimo popolamento.There is a small overhead associated with change tracking because SQL ServerSQL Server maintains a table in which it tracks changes to the base table since the last population. Quando si usa il rilevamento delle modifiche, in SQL ServerSQL Server viene mantenuto un record delle righe della tabella di base o della vista indicizzata modificate tramite aggiornamenti, eliminazioni o inserimenti.When you use change tracking, SQL ServerSQL Server maintains a record of the rows in the base table or indexed view that have been modified by updates, deletes, or inserts. Le modifiche apportate ai dati tramite WRITETEXT e UPDATETEXT non vengono riflesse nell'indice full-text e pertanto non vengono registrate dalla funzione di rilevamento delle modifiche.Data changes made through WRITETEXT and UPDATETEXT are not reflected in the full-text index, and are not picked up with change tracking.

Nota

Per le tabelle che contengono una colonna timestamp , è possibile usare il popolamento incrementale anziché il rilevamento delle modifiche.For tables containing a timestamp column, you can use incremental population instead of change tracking.

Quando il rilevamento delle modifiche viene abilitato durante la creazione dell'indice, SQL ServerSQL Server esegue il popolamento completo del nuovo indice full-text subito dopo la creazione.When you enable change tracking during index creation, SQL ServerSQL Server fully populates the new full-text index immediately after it is created. Le modifiche vengono quindi rilevate e propagate all'indice full-text.Thereafter, changes are tracked and propagated to the full-text index.

Abilita rilevamento modificheEnable change tracking

Esistono due tipi di rilevamento delle modifiche:There are two types of change tracking:

  • Automatico (opzione CHANGE_TRACKING AUTO).Automatic (CHANGE_TRACKING AUTO option). Il rilevamento delle modifiche automatico è il comportamento predefinito.Automatic change tracking is the default behavior.
  • Manuale (opzione CHANGE_TRACKING MANUAL).Manual (CHANGE_TRACKING MANUAL option).

    La modalità di popolamento dell'indice full-text dipende dal tipo di rilevamento delle modifiche:The type of change tracking determines how the full-text index is populated, as follows:

  • Popolamento automaticoAutomatic population

    Per impostazione predefinita o se si specifica CHANGE_TRACKING AUTO, il motore di ricerca full-text usa il popolamento automatico per l'indice full-text.By default, or if you specify CHANGE_TRACKING AUTO, the Full-Text Engine uses automatic population on the full-text index. Al termine del popolamento completo iniziale, le modifiche vengono rilevate man mano che i dati vengono modificati nella tabella di base e le modifiche rilevate vengono propagate automaticamente.After the initial full population completes, changes are tracked as data is modified in the base table, and the tracked changes are propagated automatically. L'indice full-text viene aggiornato in background, pertanto le modifiche propagate potrebbero non venire riflesse immediatamente nell'indice.The full-text index is updated in the background, however, so propagated changes might not be reflected immediately in the index.

    Per avviare il rilevamento delle modifiche con il popolamento automaticoTo start tracking changes with automatic population

    Esempio: modificare un indice full-text per l'uso del rilevamento delle modifiche automaticoExample - Alter a full-text index to use automatic change tracking
    Nell'esempio seguente viene creato un indice full-text della tabella HumanResources.JobCandidate del database di esempio AdventureWorks per l'utilizzo del rilevamento delle modifiche con il popolamento automatico.The following example changes the full-text index of the HumanResources.JobCandidate table of the AdventureWorks sample database to use change tracking with automatic population.

    USE AdventureWorks;  
    GO  
    ALTER FULLTEXT INDEX ON HumanResources.JobCandidate SET CHANGE_TRACKING AUTO;  
    GO   
    
  • Popolamento manualeManual population

    Se si specifica CHANGE_TRACKING MANUAL, il motore di ricerca full-text utilizza il popolamento manuale per l'indice full-text.If you specify CHANGE_TRACKING MANUAL, the Full-Text Engine uses manual population on the full-text index. Al termine del popolamento completo iniziale, le modifiche vengono rilevate man mano che i dati vengono modificati nella tabella di base.After the initial full population completes, changes are tracked as data is modified in the base table. Non vengono invece propagate nell'indice full-text finché non viene eseguita un'istruzione ALTER FULLTEXT INDEX …However, they are not propagated to the full-text index until you execute an ALTER FULLTEXT INDEX … START UPDATE POPULATION .START UPDATE POPULATION statement. Per chiamare questa istruzione SQL ServerSQL Server periodicamente, è possibile utilizzare Transact-SQLTransact-SQL Agent.You can use SQL ServerSQL Server Agent to call this Transact-SQLTransact-SQL statement periodically.

    Per avviare il rilevamento delle modifiche con il popolamento manualeTo start tracking changes with manual population

    Esempio: creare un indice full-text con il rilevamento delle modifiche manualeExample - Create a full-text index with manual change tracking
    Nell'esempio seguente viene creato un indice full-text che utilizzerà il rilevamento delle modifiche con popolamento manuale nella tabella HumanResources.JobCandidate del database di esempio AdventureWorks .The following example creates a full-text index that will use change tracking with manual population on the HumanResources.JobCandidate table of the AdventureWorks sample database.

    USE AdventureWorks;  
    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 CHANGE_TRACKING=MANUAL;  
    GO  
    

    Esempio: eseguire un popolamento manualeExample - Run a manual population
    Nell'esempio seguente viene eseguito un popolamento manuale nell'indice full-text con rilevamento delle modifiche della tabella HumanResources.JobCandidate del database di esempio AdventureWorks .The following example runs a manual population on the change-tracked full-text index of the HumanResources.JobCandidate table of the AdventureWorks sample database.

    USE AdventureWorks;  
    GO  
    ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION;  
    GO  
    

Disabilitare il rilevamento delle modificheDisable change tracking

Popolamento incrementale basato su timestampIncremental population based on a timestamp

Un popolamento incrementale è un meccanismo alternativo per il popolamento manuale di un indice full-text.An incremental population is an alternative mechanism for manually populating a full-text index. Se in una tabella vengono eseguiti molti inserimenti, l'utilizzo del popolamento incrementale può rivelarsi più efficiente dell'utilizzo del popolamento manuale.If a table experiences a high volume of inserts, using incremental population can be more efficient that using manual population.

È possibile eseguire un popolamento incrementale per un indice full-text per il quale CHANGE_TRACKING è impostato su MANUAL o OFF.You can run an incremental population for a full-text index that has CHANGE_TRACKING set to MANUAL or OFF.

Per eseguire il popolamento incrementale, è necessario che la tabella indicizzata contenga una colonna del tipo di dati timestamp .The requirement for incremental population is that the indexed table must have a column of the timestamp data type. Se non è disponibile una colonna timestamp , il popolamento incrementale non può essere eseguito.If a timestamp column does not exist, incremental population cannot be performed.

SQL ServerSQL Server usa la colonna timestamp per identificare le righe che sono state modificate dopo l'ultimo popolamento. uses the timestamp column to identify rows that have changed since the last population. Il popolamento incrementale aggiorna l'indice full-text per le righe aggiunte, eliminate o modificate dopo l'ultimo popolamento o durante la sua esecuzione.The incremental population then updates the full-text index for rows added, deleted, or modified after the last population, or while the last population was in progress. Al termine di un popolamento, il motore di ricerca full-text registra un nuovo valore timestamp ,At the end of a population, the Full-Text Engine records a new timestamp value. che corrisponde al valore timestamp maggiore rilevato da SQL Gatherer.This value is the largest timestamp value that SQL Gatherer has found. Questo valore verrà usato all'avvio del successivo popolamento incrementale.This value will be used when the next incremental population starts.

In alcuni casi una richiesta di popolamento incrementale comporta un popolamento completo.In some cases, the request for an incremental population results in a full population.

  • Se viene richiesto un popolamento incrementale per una tabella senza una colonna timestamp , verrà eseguito un popolamento completo.A request for incremental population on a table without a timestamp column results in a full population operation.
  • Se il primo popolamento di un indice full-text è incrementale, vengono indicizzate tutte le righe e il risultato è equivalente a un popolamento completo.If the first population on a full-text index is an incremental population, it indexes all rows, making it equivalent to a full population.
  • Se alcuni metadati che interessano l'indice full-text della tabella sono stati modificati dopo l'ultimo popolamento, le richieste di popolamento vengono implementate come popolamenti completi.If any metadata that affects the full-text index for the table has changed since the last population, incremental population requests are implemented as full populations. Sono incluse le modifiche ai metadati causate dall'alterazione di qualsiasi definizione di colonna, indice o indice full-text.This includes metadata changes caused by altering any column, index, or full-text index definitions.

Eseguire un popolamento incrementaleRun an incremental population

Per eseguire un popolamento incrementale, eseguire un'istruzione ALTER FULLTEXT INDEX usando la clausola START INCREMENTAL POPULATION.To run an incremental population, execute an ALTER FULLTEXT INDEX statement using the START INCREMENTAL POPULATION clause.

Creare o modificare una pianificazione per un popolamento incrementale Create or change a schedule for incremental population

  1. In Management Studio espandere il server in Esplora oggetti.In Management Studio, in Object Explorer, expand the server.

  2. Espandere Databasee quindi il database contenente l'indice full-text.Expand Databases, and then expand the database that contains the full-text index.

  3. Espandere Tabelle.Expand Tables.

    Fare clic con il pulsante destro del mouse sulla tabella in cui viene definito l'indice full-text, scegliere Indice full-texte quindi Proprietà dal menu di scelta rapida Indice full-text.Right-click the table on which the full-text index is defined, select Full-Text index, and on the Full-Text index context menu, click Properties. Verrà visualizzata la finestra di dialogo Proprietà indice full-text .This opens the Full-text index Properties dialog box.

    Importante

    Se la tabella o la vista di base non contiene una colonna di dati di tipo timestamp, non è possibile eseguire un popolamento incrementale.If the base table or view does not contain a column of the timestamp data type, incremental population is not possible.

  4. Nel riquadro Seleziona una pagina selezionare Pianificazioni.In the Select a page pane, select Schedules.

    Utilizzare questa pagina per creare o gestire le pianificazioni per un processo di SQL Server Agent che consente di avviare un popolamento incrementale della tabella di base o della vista indicizzata dell'indice full-text.Use this page to create or manage schedules for a SQL Server Agent job that starts an incremental table population on the base table or indexed view of the full-text index.

    Sono disponibili le opzioni seguenti:The options are as follows:

    • Per creare una nuova pianificazione, fare clic su Nuova.To create a new schedule, click New.

      Verrà visualizzata la finestra di dialogo Nuova pianificazione tabella indicizzazione full-text , in cui è possibile creare una pianificazione.This opens the New Full-Text Indexing Table Schedule dialog box, where you can create a schedule. Per salvare la pianificazione, fare clic su OK.To save the schedule, click OK.

      Importante

      Dopo la chiusura della finestra di dialogo Proprietà indice full-text, alla nuova pianificazione viene associato un processo di SQL Server Agent, Start Incremental Table Population ondatabase_name. table_name (Avvio popolamento incrementale tabella in nome_database.nome_tabella).A SQL Server Agent job (Start Incremental Table Population on database_name.table_name) is associated with a new schedule after you exit the Full-Text Index Properties dialog box. Se vengono create più pianificazioni per lo stesso indice full-text, tutte usano lo stesso processo.If you create multiple schedules for the same full-text index, they all use the same job.

    • Per modificare una pianificazione esistente, selezionare la pianificazione esistente e quindi fare clic su Modifica.To change an existing schedule, select the existing schedule and click Edit.

      Verrà visualizzata la finestra di dialogo Nuova pianificazione tabella indicizzazione full-text , in cui è possibile modificare la pianificazione.This opens the New Full-Text Indexing Table Schedule dialog box, where you can modify the schedule.

      Nota

      Per informazioni sulla modifica di un processo di SQL Server Agent, vedere Modificare un processo.For information about modifying a SQL Server Agent job, see Modify a Job.

    • Per rimuovere una pianificazione esistente, selezionare la pianificazione esistente e quindi fare clic su Elimina.To remove an existing schedule, select the existing schedule and click Delete.

  5. Fare clic su OK.Click OK.

Risolvere i problemi relativi agli errori in un popolamento full-text (ricerca per indicizzazione) Troubleshoot errors in a full-text population (crawl)

Quando si verifica un errore durante una ricerca per indicizzazione, la funzionalità di registrazione corrispondente per la ricerca full-text crea e gestisce un log di tipo ricerca per indicizzazione in formato testo normale.When an error occurs during a crawl, the Full-Text Search crawl logging facility creates and maintains a crawl log, which is a plain text file. Ogni log di tipo ricerca per indicizzazione corrisponde a un catalogo full-text specifico.Each crawl log corresponds to a particular full-text catalog. Per impostazione predefinita, i log di ricerca per indicizzazione per un'istanza specifica, ad esempio l'istanza predefinita, si trovano nella cartella %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG.By default, crawl logs for a given instance (in this example, the default instance) are located in %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG folder.

Il file del log di tipo ricerca per indicizzazione segue lo schema di denominazione seguente:The crawl log file follows the following naming scheme:

SQLFT<DatabaseID><FullTextCatalogID>.LOG[<n>]

Di seguito sono riportate le parti variabili del nome del file del log di ricerca per indicizzazione.The variable parts of the crawl log file name are the following.

  • <IDDatabase>: ID di un database.<DatabaseID> - The ID of a database. <dbid> è un numero a cinque cifre con zeri iniziali. <dbid> is a five digit number with leading zeros.
  • <IDCatalogoFullText>: ID del catalogo full-text.<FullTextCatalogID> - Full-text catalog ID. <catid> è un numero a cinque cifre con zeri iniziali. <catid> is a five digit number with leading zeros.
  • <n>: numero intero che indica l'esistenza di uno o più log di tipo ricerca per indicizzazione per lo stesso catalogo full-text.<n> - Is an integer that indicates one or more crawl logs of the same full-text catalog exist.

    Ad esempio, SQLFT0000500008.2 è il file del log di ricerca per indicizzazione per un database con ID database = 5 e ID catalogo full-text = 8.For example, SQLFT0000500008.2 is the crawl log file for a database with database ID = 5, and full-text catalog ID = 8. Il 2 alla fine del nome file indica che sono disponibili due file del log di tipo ricerca per indicizzazione per questa coppia di database/catalogo.The 2 at the end of the file name indicates that there are two crawl log files for this database/catalog pair.

Vedere ancheSee Also

sys.dm_fts_index_population (Transact-SQL) sys.dm_fts_index_population (Transact-SQL)
Introduzione alla ricerca full-text Get Started with Full-Text Search
Creazione e gestione di indici full-text Create and Manage Full-Text Indexes
CREATE FULLTEXT INDEX (Transact-SQL) CREATE FULLTEXT INDEX (Transact-SQL)
ALTER FULLTEXT INDEX (Transact-SQL)ALTER FULLTEXT INDEX (Transact-SQL)