Ricerca full-textFull-Text Search

In SQL ServerSQL Server e Database SQL di AzureAzure SQL Database la ricerca full-text consente a utenti e applicazioni di eseguire query full-text su dati di tipo carattere in tabelle di SQL ServerSQL Server .Full-Text Search in SQL ServerSQL Server and Database SQL di AzureAzure SQL Database lets users and applications run full-text queries against character-based data in SQL ServerSQL Server tables.

Attività di baseBasic tasks

Questo argomento offre una panoramica della ricerca full-text e descrive i componenti e l'architettura di questa funzionalità.This topic provides an overview of Full-Text Search and describes its components and its architecture. Per iniziare subito, ecco le attività di base.If you prefer to get started right away, here are the basic tasks.

Nota

Full-Text Search is an optional component of the SQL ServerSQL Server .Full-Text Search is an optional component of the SQL ServerSQL Server Database Engine. Se non è stata selezionata l'opzione Ricerca full-text durante l'installazione di SQL Server, eseguire di nuovo il programma di installazione di SQL Server per aggiungerla.If you didn't select Full-Text Search when you installed SQL Server, run SQL Server Setup again to add it.

PanoramicaOverview

Un indice full-text include una o più colonne basate su caratteri in una tabella.A full-text index includes one or more character-based columns in a table. Queste colonne possono avere uno dei tipi di dati seguenti: char, varchar, nchar, nvarchar, text, ntext, image, xml o varbinary(max) e FILESTREAM.These columns can have any of the following data types: char, varchar, nchar, nvarchar, text, ntext, image, xml, or varbinary(max) and FILESTREAM. Ogni indice full-text consente di indicizzare una o più colonne della tabella e ciascuna colonna può essere utilizzata con una lingua specifica.Each full-text index indexes one or more columns from the table, and each column can use a specific language.

Attraverso le query full-text è possibile eseguire ricerche linguistiche sui dati di testo contenuti negli indici full-text, usando parole e frasi in base alle regole di una determinata lingua, come ad esempio l'inglese o il giapponese.Full-text queries perform linguistic searches against text data in full-text indexes by operating on words and phrases based on the rules of a particular language such as English or Japanese. Le query full-text possono contenere semplici parole e frasi oppure più forme di una parola o frase.Full-text queries can include simple words and phrases or multiple forms of a word or phrase. Una query full-text restituisce qualsiasi documento contenente almeno una corrispondenza, nota anche come riscontro.A full-text query returns any documents that contain at least one match (also known as a hit). Si ottiene una corrispondenza quando un documento di destinazione contiene tutti i termini specificati nella query full-text e soddisfa qualsiasi altra condizione di ricerca, come ad esempio la distanza entro i termini corrispondenti.A match occurs when a target document contains all the terms specified in the full-text query, and meets any other search conditions, such as the distance between the matching terms.

Query di ricerca full-text Full-Text Search queries

Dopo l'aggiunta delle colonne a un indice full-text, gli utenti e le applicazioni possono eseguire query full-text sul testo contenuto all'interno delle colonne.After columns have been added to a full-text index, users and applications can run full-text queries on the text in the columns. Queste query possono consentire la ricerca degli elementi seguenti:These queries can search for any of the following:

  • Una o più parole o frasi specifiche (termine semplice)One or more specific words or phrases (simple term)

  • Parola o frase in cui le parole iniziano con il testo specificato (termine di prefisso)A word or a phrase where the words begin with specified text (prefix term)

  • Forme flessive di una parola specifica (termine di generazione)Inflectional forms of a specific word (generation term)

  • Una parola o frase vicina a un'altra parola o frase (termine di prossimità)A word or phrase close to another word or phrase (proximity term)

  • Sinonimi di una parola specifica (thesaurus)Synonymous forms of a specific word (thesaurus)

  • Parole o frasi che usano valori ponderati (termine ponderato)Words or phrases using weighted values (weighted term)

    Per le query di ricerca full-text non viene fatta distinzione tra maiuscole e minuscole.Full-text queries are not case-sensitive. Ad esempio, dalla ricerca di "Alluminio" o "alluminio" vengono restituiti gli stessi risultati.For example, searching for "Aluminum" or "aluminum" returns the same results.

    Nelle query full-text viene utilizzato un set ridotto di predicati (CONTAINS e FREETEXT) e funzioni (CONTAINSTABLE e FREETEXTTABLE) Transact-SQLTransact-SQL .Full-text queries use a small set of Transact-SQLTransact-SQL predicates (CONTAINS and FREETEXT) and functions (CONTAINSTABLE and FREETEXTTABLE). Tuttavia, gli obiettivi di ricerca di un determinato scenario aziendale influiscono sulla struttura delle query full-text.However, the search goals of a given business scenario influence the structure of the full-text queries. Esempio:For example:

  • Commercio elettronico: ricerca di un prodotto in un sito Webe-business—searching for a product on a website:

    SELECT product_id   
    FROM products   
    WHERE CONTAINS(product_description, ”Snap Happy 100EZ” OR FORMSOF(THESAURUS,’Snap Happy’) OR ‘100EZ’)   
    AND product_cost < 200 ;  
    
  • Assunzione di personale: ricerca di candidati con esperienza in SQL ServerSQL ServerRecruitment scenario—searching for job candidates that have experience working with SQL ServerSQL Server:

    SELECT candidate_name,SSN   
    FROM candidates   
    WHERE CONTAINS(candidate_resume,”SQL Server”) AND candidate_division =DBA;  
    

    Per altre informazioni, vedere Esecuzione della query con ricerca Full-Text.For more information, see Query with Full-Text Search.

Query di ricerca full-text a confronto con il predicato LIKE Compare Full-Text Search queries to the LIKE predicate

Contrariamente alla ricerca full-text, il predicato LIKE Transact-SQLTransact-SQL funziona unicamente con i modelli di caratteri.In contrast to full-text search, the LIKE Transact-SQLTransact-SQL predicate works on character patterns only. Non è inoltre possibile utilizzare il predicato LIKE per eseguire query su dati binari formattati.Also, you cannot use the LIKE predicate to query formatted binary data. Inoltre, l'esecuzione di una query LIKE su una grande quantità di dati di testo non strutturati è molto più lenta dell'esecuzione di una query full-text equivalente sugli stessi dati.Furthermore, a LIKE query against a large amount of unstructured text data is much slower than an equivalent full-text query against the same data. Una query LIKE eseguita su milioni di righe di dati di testo può richiedere diversi minuti, mentre per una query full-text sugli stessi dati possono essere necessari al massimo pochi secondi, a seconda del numero di righe restituite.A LIKE query against millions of rows of text data can take minutes to return; whereas a full-text query can take only seconds or less against the same data, depending on the number of rows that are returned.

Architettura della ricerca full-text Full-Text Search architecture

L'architettura della ricerca full-text è costituita dai processi seguenti:Full-text search architecture consists of the following processes:

  • Processo di SQL ServerSQL Server (sqlservr.exe).The SQL ServerSQL Server process (sqlservr.exe).

  • Processo host del daemon di filtri (fdhost.exe).The filter daemon host process (fdhost.exe).

    Ai fini della sicurezza, i filtri vengono caricati da processi separati definiti host del daemon di filtri.For security reasons, filters are loaded by separate processes called the filter daemon hosts. I processi fdhost.exe vengono creati da un servizio dell'utilità di avvio di FDHOST (MSSQLFDLauncher) e vengono eseguiti con le credenziali di sicurezza dell'account del servizio dell'utilità di avvio di FDHOST.The fdhost.exe processes are created by an FDHOST launcher service (MSSQLFDLauncher), and they run under the security credentials of the FDHOST launcher service account. Il funzionamento delle query e dell'indicizzazione full-text dipende quindi dall'esecuzione del servizio dell'utilità di avvio di FDHOST.Therefore, the FDHOST launcher service must be running for full-text indexing and full-text querying to work. Per informazioni sulla configurazione dell'account del servizio per questo servizio, vedere Impostazione dell'account del servizio dell'Utilità di avvio del daemon di filtri full-text.For information about setting the service account for this service, see Set the Service Account for the Full-text Filter Daemon Launcher.

    In questi due processi sono inclusi i componenti dell'architettura della ricerca full-text,These two processes contain the components of the full-text search architecture. riepilogati con le relative relazioni nell'illustrazione seguente.These components and their relationships are summarized in the following illustration. I componenti vengono descritti dopo l'illustrazione.The components are described after the illustration.

    architettura della ricerca full-textfull-text search architecture

Processo di SQL Server SQL Server process

Nel processo di SQL ServerSQL Server vengono utilizzati i componenti seguenti per la ricerca full-text:The SQL ServerSQL Server process uses the following components for full-text search:

  • Tabelle utente.User tables. In queste tabelle sono contenuti i dati da inserire nell'indice full-text.These tables contain the data to be full-text indexed.

  • Gatherer full-text.Full-text gatherer. Il gatherer full-text funziona con i thread della ricerca per indicizzazione full-textThe full-text gatherer works with the full-text crawl threads. e consente di pianificare e gestire il popolamento degli indici full-text, nonché di monitorare i cataloghi full-text.It is responsible for scheduling and driving the population of full-text indexes, and also for monitoring full-text catalogs.

  • File del thesaurus.Thesaurus files. In questi file sono contenuti i sinonimi dei termini da cercare.These files contain synonyms of search terms. Per altre informazioni, vedere Configurare e gestire i file del thesaurus per la ricerca full-text.For more information, see Configure and Manage Thesaurus Files for Full-Text Search.

  • Oggetti dell'elenco di parole non significative.Stoplist objects. Negli oggetti dell'elenco di parole non significative sono inclusi un insieme di parole comuni che non risultano utili per la ricerca.Stoplist objects contain a list of common words that are not useful for the search. Per altre informazioni, vedere Configurare e gestire parole non significative ed elenchi di parole non significative per la ricerca full-text.For more information, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

  • SQL ServerSQL Server Query Processor. SQL ServerSQL Server query processor. Query Processor consente di compilare ed eseguire query SQL.The query processor compiles and executes SQL queries. Se in una query SQL è inclusa una query di ricerca full-text, la query viene inviata al motore di ricerca full-text sia durante la compilazione sia durante l'esecuzione.If a SQL query includes a full-text search query, the query is sent to the Full-Text Engine, both during compilation and during execution. Il risultato della query viene messo a confronto con l'indice full-text.The query result is matched against the full-text index.

  • Motore di ricerca full-text.Full-Text Engine. Il motore di ricerca full-text in SQL ServerSQL Server è attualmente completamente integrato con Query Processor.The Full-Text Engine in SQL ServerSQL Server is fully integrated with the query processor. Il motore di ricerca full-text compila ed esegue query full-text.The Full-Text Engine compiles and executes full-text queries. Come parte dell'esecuzione di query, il motore di ricerca full-text può ricevere input dal thesaurus e dall'elenco di parole non significative.As part of query execution, the Full-Text Engine might receive input from the thesaurus and stoplist.

    Nota

    In SQL Server 2008SQL Server 2008 e versioni successive, il motore di ricerca full-text si trova nel processo di SQL ServerSQL Server anziché in un servizio distinto.In SQL Server 2008SQL Server 2008 and later versions, the Full-Text Engine resides in the SQL ServerSQL Server process, rather than in a separate service. 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.Integrating the Full-Text Engine into the Database Engine improved full-text manageability, optimization of mixed query, and overall performance.

  • Writer di indici (indicizzatore).Index writer (indexer). Il writer di indici consente di compilare la struttura utilizzata per archiviare i token indicizzati.The index writer builds the structure that is used to store the indexed tokens.

  • Strumento di gestione del daemon di filtri.Filter daemon manager. Lo strumento di gestione del daemon di filtri consente di monitorare lo stato dell'host del daemon di filtri per il motore di ricerca full-text.The filter daemon manager is responsible for monitoring the status of the Full-Text Engine filter daemon host.

Filter Daemon Host process Filter Daemon Host process

L'host del daemon di filtri è un processo avviato dal motore di ricerca full-textThe filter daemon host is a process that is started by the Full-Text Engine. e consente l'esecuzione dei componenti della ricerca full-text seguenti, responsabili dell'accesso, del filtraggio e del word breaking di dati dalle tabelle, nonché del word breaking e dello stemming dell'input della query.It runs the following full-text search components, which are responsible for accessing, filtering, and word breaking data from tables, as well as for word breaking and stemming the query input.

I componenti dell'host del daemon di filtri sono i seguenti:The components of the filter daemon host are as follows:

  • Protocol handler.Protocol handler. Questo componente consente di effettuare il pull dei dati dalla memoria per un'ulteriore elaborazione e di accedere ai dati da una tabella utente in un database specificato.This component pulls the data from memory for further processing and accesses data from a user table in a specified database. È inoltre responsabile della raccolta dei dati dalle colonne oggetto dell'indicizzazione full-text e del loro passaggio all'host del daemon di filtri tramite il quale verrà applicato il filtro e il word breaker in base alle specifiche esigenze.One of its responsibilities is to gather data from the columns being full-text indexed and pass it to the filter daemon host, which will apply filtering and word breaker as required.

  • Filtri.Filters. Per alcuni tipi di dati è richiesta l'applicazione di un filtro prima che i dati di un documento possano essere sottoposti all'indicizzazione full-text, inclusi i dati nelle colonne varbinary, varbinary(max), imageo xml .Some data types require filtering before the data in a document can be full-text indexed, including data in varbinary, varbinary(max), image, or xml columns. Il filtro utilizzato per un documento dipende dal relativo tipo.The filter used for a given document depends on its document type. Vengono infatti utilizzati filtri diversi per documenti di Microsoft Word (doc), documenti di Microsoft Excel (xls) e documenti XML (xml).For example, different filters are used for Microsoft Word (.doc) documents, Microsoft Excel (.xls) documents, and XML (.xml) documents. Il filtro estrae blocchi di testo dal documento, rimuovendo la formattazione incorporata e mantenendo il testo e, potenzialmente, le informazioni sulla posizione del testo.Then the filter extracts chunks of text from the document, removing embedded formatting and retaining the text and, potentially, information about the position of the text. Il risultato è un flusso di informazioni testuali.The result is a stream of textual information. Per altre informazioni, vedere Configurazione e gestione di filtri per la ricerca.For more information, see Configure and Manage Filters for Search.

  • Word breaker e stemmer.Word breakers and stemmers. Un word breaker è un componente specifico della lingua che consente di trovare i delimitatori di parola in base alle regole lessicali di una determinata lingua (word breaking).A word breaker is a language-specific component that finds word boundaries based on the lexical rules of a given language (word breaking). Ogni word breaker è associato a uno stemmer specifico della lingua che coniuga i verbi ed esegue le espansioni flessionali.Each word breaker is associated with a language-specific stemmer component that conjugates verbs and performs inflectional expansions. In fase di indicizzazione, l'host del daemon di filtri utilizza un word breaker e uno stemmer per eseguire l'analisi linguistica sui dati testuali di una colonna di tabella specificata.At indexing time, the filter daemon host uses a word breaker and stemmer to perform linguistic analysis on the textual data from a given table column. Il word breaker e lo stemmer utilizzati per l'indicizzazione della colonna sono determinati dalla lingua associata a una colonna di tabella nell'indice full-text.The language that is associated with a table column in the full-text index determines which word breaker and stemmer are used for indexing the column. Per altre informazioni, vedere Configurare e gestire word breaker e stemmer per la ricerca.For more information, see Configure and Manage Word Breakers and Stemmers for Search.

Elaborazione della ricerca full-text Full-Text Search processing

La ricerca full-text è supportata dal motore di ricerca full-textFull-text search is powered by the Full-Text Engine. che svolge due ruoli, vale a dire il supporto per l'indicizzazione e quello per l'esecuzione di query.The Full-Text Engine has two roles: indexing support and querying support.

Processo di indicizzazione full-text Full-Text indexing process

Quando viene iniziato un popolamento full-text, noto anche come ricerca per indicizzazione, tramite il motore di ricerca full-text viene eseguito il push di batch di grandi dimensioni di dati in memoria e viene inviata una notifica all'host del daemon di filtri.When a full-text population (also known as a crawl) is initiated, the Full-Text Engine pushes large batches of data into memory and notifies the filter daemon host. L'host filtra ed esegue il word breaking dei dati ed esegue inoltre la conversione dei dati convertiti in elenchi di parole invertiti.The host filters and word breaks the data and converts the converted data into inverted word lists. La ricerca full-text effettua quindi il pull dei dati convertiti dagli elenchi di parole, elabora i dati per rimuovere le parole non significative e salva in modo permanente gli elenchi di parole per un batch in uno o più indici invertiti.The full-text search then pulls the converted data from the word lists, processes the data to remove stopwords, and persists the word lists for a batch into one or more inverted indexes.

Durante l'indicizzazione dei dati archiviati in una colonna varbinary(max) o image , il filtro, che implementa l'interfaccia IFilter , estrae testo in base al formato file specificato per tali dati, ad esempio MicrosoftMicrosoft Word.When indexing data stored in a varbinary(max) or image column, the filter, which implements the IFilter interface, extracts text based on the specified file format for that data (for example, MicrosoftMicrosoft Word). Per i componenti filtro talvolta i dati di tipo varbinary(max)o image devono essere scritti nella cartella filterdata e non deve esserne eseguito il push in memoria.In some cases, the filter components require the varbinary(max), or image data to be written out to the filterdata folder, instead of being pushed into memory.

Nell'ambito dell'elaborazione, i dati di testo raccolti vengono sottoposti a un word breaker per separare il testo in singoli token o parole chiave.As part of processing, the gathered text data is passed through a word breaker to separate the text into individual tokens, or keywords. La lingua usata per la tokenizzazione viene specificata a livello di colonna o può essere identificata all'interno dei dati varbinary(max), imageo xml dal componente filtro.The language used for tokenization is specified at the column level, or can be identified within varbinary(max), image, or xml data by the filter component.

È possibile eseguire un'ulteriore elaborazione per rimuovere le parole non significative e normalizzare i token prima di archiviarli nell'indice full-text o in un frammento di indice.Additional processing may be performed to remove stopwords, and to normalize tokens before they are stored in the full-text index or an index fragment.

Al termine di un popolamento, viene attivato un processo di unione conclusivo che associa i frammenti di indice in un singolo indice full-text master.When a population has completed, a final merge process is triggered that merges the index fragments together into one master full-text index. Ciò consente prestazioni di query superiori poiché è necessario eseguire query solo sull'indice master anziché su alcuni frammenti di indice ed è possibile utilizzare statistiche di punteggio migliori per la classificazione della pertinenza.This results in improved query performance since only the master index needs to be queried rather than a number of index fragments, and better scoring statistics may be used for relevance ranking.

Processo di esecuzione di query full-text Full-Text querying process

Query Processor consente di passare le parti full-text di una query al motore di ricerca full-text affinché vengano elaborate.The query processor passes the full-text portions of a query to the Full-Text Engine for processing. Il motore di ricerca full-text esegue il word breaking e, facoltativamente, le espansioni del thesaurus, lo stemming e l'elaborazione delle parole non significative.The Full-Text Engine performs word breaking and, optionally, thesaurus expansions, stemming, and stopword (noise-word) processing. Le parti full-text della query vengono rappresentate come operatori SQL, principalmente come funzioni di flusso con valori di tabella.Then the full-text portions of the query are represented in the form of SQL operators, primarily as streaming table-valued functions (STVFs). Durante l'esecuzione della query, queste funzioni accedono all'indice invertito per recuperare i risultati corretti.During query execution, these STVFs access the inverted index to retrieve the correct results. I risultati vengono restituiti al client immediatamente oppure dopo essere stati ulteriormente elaborati.The results are either returned to the client at this point, or they are further processed before being returned to the client.

Architettura degli indici full-textFull-text index architecture

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.The information in full-text indexes is used by the Full-Text Engine to compile full-text queries that can quickly search a table for particular words or combinations of words. 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.A full-text index stores information about significant words and their location within one or more columns of a database table. Un indice full-text è un tipo speciale di indice funzionale basato su token compilato e gestito dal motore di ricerca full-text per SQL ServerSQL Server.A full-text index is a special type of token-based functional index that is built and maintained by the Full-Text Engine for SQL ServerSQL Server. Il processo di compilazione di un indice full-text è diverso da quello di altri tipi di indici.The process of building a full-text index differs from building other types of indexes. Anziché creare un albero B basato su un valore archiviato in una riga specifica, il motore di ricerca full-text compila una struttura con indice invertito, compresso e in pila dai singoli token dal testo indicizzato.Instead of constructing a B-tree structure based on a value stored in a particular row, the Full-Text Engine builds an inverted, stacked, compressed index structure based on individual tokens from the text being indexed. Le dimensioni di un indice full-text sono limitate solo dalle risorse di memoria disponibili del computer in cui viene eseguita l'istanza di SQL ServerSQL Server .The size of a full-text index is limited only by the available memory resources of the computer on which the instance of SQL ServerSQL Server is running.

A partire da SQL Server 2008SQL Server 2008gli indici full-text sono integrati nel Motore di database anziché risiedere nel file system come nelle versioni precedenti di SQL ServerSQL Server.Beginning in SQL Server 2008SQL Server 2008, the full-text indexes are integrated with the Database Engine, instead of residing in the file system as in previous versions of SQL ServerSQL Server. Per un nuovo database, il catalogo full-text è ora un oggetto virtuale che non appartiene ad alcun filegroup. Si tratta semplicemente di un concetto logico che fa riferimento a un gruppo di indici full-text.For a new database, the full-text catalog is now a virtual object that does not belong to any filegroup; it is merely a logical concept that refers to a group of the full-text indexes. Si noti tuttavia che durante l'aggiornamento di un database di SQL Server 2005SQL Server 2005 , ovvero qualsiasi catalogo full-text contenente file di dati, viene creato un nuovo filegroup. Per altre informazioni, vedere Aggiornamento della ricerca full-text.Note, however, that during upgrade of a SQL Server 2005SQL Server 2005 database, any full-text catalog that contains data files, a new filegroup is created; for more information, see Upgrade Full-Text Search.

È consentito un solo indice full-text per tabella.Only one full-text index is allowed per table. Per creare un indice full-text su una tabella, quest'ultima deve contenere una colonna singola, univoca e non Null.For a full-text index to be created on a table, the table must have a single, unique nonnull column. È possibile compilare un indice full-text su colonne di tipo char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinarye varbinary(max) .You can build a full-text index on columns of type char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary, and varbinary(max) can be indexed for full-text search. La creazione di un indice full-text in colonne con tipo di dati varbinary, varbinary(max), imageo xml richiede la specifica di una colonna del tipo.Creating a full-text index on a column whose data type is varbinary, varbinary(max), image, or xml requires that you specify a type column. 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.A type column is a table column in which you store the file extension (.doc, .pdf, .xls, and so forth) of the document in each row.

Struttura di un indice full-text Full-text index structure

Comprendere a fondo la struttura di un indice full-text è fondamentale per comprendere il funzionamento del motore di ricerca full-text.A good understanding of the structure of a full-text index will help you understand how the Full-Text Engine works. In questo argomento viene usato come esempio l'estratto seguente della tabella Document in Adventure WorksAdventure Works .This topic uses the following excerpt of the Document table in Adventure WorksAdventure Works as an example table. In questo estratto sono visualizzate solo due colonne, la colonna DocumentID e la colonna Title , e tre righe della tabella.This excerpt shows only two columns, the DocumentID column and the Title column, and three rows from the table.

In questo esempio si suppone che nella colonna Title sia stato creato un indice full-text.For this example, we will assume that a full-text index has been created on the Title column.

DocumentIDDocumentID TitleTitle
11 Crank Arm and Tire MaintenanceCrank Arm and Tire Maintenance
22 Front Reflector Bracket and Reflector Assembly 3Front Reflector Bracket and Reflector Assembly 3
33 Front Reflector Bracket InstallationFront Reflector Bracket Installation

Nella tabella seguente, Fragment 1, viene illustrato il contenuto dell'indice full-text creato nella colonna Title della tabella Document .For example, the following table, which shows Fragment 1, depicts the contents of the full-text index created on the Title column of the Document table. Gli indici full-text contengono più informazioni rispetto a quelle riportate in questa tabella.Full-text indexes contain more information than is presented in this table. La tabella è una rappresentazione logica di un indice full-text e ha solo scopo illustrativo.The table is a logical representation of a full-text index and is provided for demonstration purposes only. Per ottimizzare l'utilizzo del disco, le righe vengono archiviate in un formato compresso.The rows are stored in a compressed format to optimize disk usage.

Si noti che i dati sono stati invertiti dai documenti originali.Notice that the data has been inverted from the original documents. Questa inversione è dovuta al fatto che per le parole chiave viene eseguito il mapping agli ID documento.Inversion occurs because the keywords are mapped to the document IDs. Per questo motivo, un indice full-text viene spesso definito come un indice invertito.For this reason, a full-text index is often referred to as an inverted index.

Si noti inoltre che la parola chiave "and" è stata rimossa dall'indice full-text,Also notice that the keyword "and" has been removed from the full-text index. 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.This is done because "and" is a stopword, and removing stopwords from a full-text index can lead to substantial savings in disk space thereby improving query performance. Per altre informazioni sulle parole non significative e sugli elenchi di parole non significative, vedere Configurare e gestire parole non significative ed elenchi di parole non significative per la ricerca full-text.For more information about stopwords, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

Frammento 1Fragment 1

Parola chiaveKeyword ColIdColId DocIdDocId OccorrenzaOccurrence
CrankCrank 11 11 11
ArmArm 11 11 22
TireTire 11 11 44
MaintenanceMaintenance 11 11 55
FrontFront 11 22 11
FrontFront 11 33 11
ReflectorReflector 11 22 22
ReflectorReflector 11 22 55
ReflectorReflector 11 33 22
BracketBracket 11 22 33
BracketBracket 11 33 33
AssemblyAssembly 11 22 66
33 11 22 77
InstallazioneInstallation 11 33 44

La colonna Parola chiave contiene la rappresentazione di un singolo token estratto al momento dell'indicizzazione.The Keyword column contains a representation of a single token extracted at indexing time. I word breaker stabiliscono il modo in cui un token viene determinato.Word breakers determine what makes up a token.

La colonna ColId contiene un valore che corrisponde a una particolare colonna con indicizzazione full-text.The ColId column contains a value that corresponds to a particular column that is full-text indexed.

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.The DocId column contains values for an eight-byte integer that maps to a particular full-text key value in a full-text indexed table. Questo mapping è necessario se la chiave full-text non è un tipo di dati integer.This mapping is necessary when the full-text key is not an integer data type. In questi casi i mapping tra i valori chiave full-text e i valori DocId vengono mantenuti in una tabella separata denominata DocId Mapping.In such cases, mappings between full-text key values and DocId values are maintained in a separate table called the DocId Mapping table. Per eseguire una query per questi mapping usare la stored procedure di sistema sp_fulltext_keymappings .To query for these mappings use the sp_fulltext_keymappings system stored procedure. Per soddisfare una condizione di ricerca, è necessario creare un join tra i valori DocId della tabella precedente e la tabella DocId Mapping per recuperare le righe dalla tabella di base su cui viene eseguita la query.To satisfy a search condition, DocId values from the above table need to be joined with the DocId Mapping table to retrieve rows from the base table being queried. 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.If the full-text key value of the base table is an integer type, the value directly serves as the DocId and no mapping is necessary. Pertanto, l'utilizzo di valori chiave full-text di tipo integer può contribuire all'ottimizzazione delle query full-text.Therefore, using integer full-text key values can help optimize full-text queries.

La colonna Occurrence contiene un valore di tipo integer.The Occurrence column contains an integer value. Per ogni valore DocId è presente un elenco di valori di occorrenza corrispondenti agli offset relativi di una particolare parola chiave all'interno di DocId.For each DocId value, there is a list of occurrence values that correspond to the relative word offsets of the particular keyword within that DocId. I valori di occorrenza sono utili per determinare le corrispondenze di frase o prossimità, ad esempio frasi con valori di occorrenza numericamente adiacenti.Occurrence values are useful in determining phrase or proximity matches, for example, phrases have numerically adjacent occurrence values. 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.They are also useful in computing relevance scores; for example, the number of occurrences of a keyword in a DocId may be used in scoring.

Frammenti di indice full-text Full-text index fragments

L'indice full-text logico viene in genere suddiviso tra più tabelle interne.The logical full-text index is usually split across multiple internal tables. Ogni tabella interna viene definita un frammento di indice full-text.Each internal table is called a full-text index fragment. Alcuni di questi frammenti potrebbero contenere dati più recenti di altri.Some of these fragments might contain newer data than others. Ad esempio, se 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.For example, if a user updates the following row whose DocId is 3 and the table is auto change-tracked, a new fragment is created.

DocumentIDDocumentID TitleTitle
33 Rear ReflectorRear Reflector

Nell'esempio seguente, Fragment 2, il frammento contiene dati più recenti su DocId 3, rispetto a Fragment 1.In the following example, which shows Fragment 2, the fragment contains newer data about DocId 3 compared to Fragment 1. Pertanto, quando viene eseguita una query per "Rear Reflector" i dati di Fragment 2 vengono utilizzati per DocId 3.Therefore, when the user queries for "Rear Reflector" the data from Fragment 2 is used for 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 .Each fragment is marked with a creation timestamp that can be queried by using the sys.fulltext_index_fragments catalog view.

Frammento 2Fragment 2

Parola chiaveKeyword ColIdColId DocIdDocId OccOcc
RearRear 11 33 11
ReflectorReflector 11 33 22

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.As can be seen from Fragment 2, full-text queries need to query each fragment internally and discard older entries. Un numero eccessivo di frammenti di indice full-text nell'indice full-text può causare un calo sensibile delle prestazioni di esecuzione delle query.Therefore, too many full-text index fragments in the full-text index can lead to substantial degradation in query performance. Per ridurre il numero di frammenti, riorganizzare il catalogo full-text tramite l'opzione REORGANIZE dell'istruzione ALTER FULLTEXT CATALOG Transact-SQLTransact-SQL .To reduce the number of fragments, reorganize the fulltext catalog by using the REORGANIZE option of the ALTER FULLTEXT CATALOG Transact-SQLTransact-SQL statement. 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.This statement performs a master merge, which merges the fragments into a single larger fragment and removes all obsolete entries from the full-text index.

Dopo essere stato riorganizzato, l'indice di esempio dovrebbe contenere le righe seguenti:After being reorganized, the example index would contain the following rows:

Parola chiaveKeyword ColIdColId DocIdDocId OccOcc
CrankCrank 11 11 11
ArmArm 11 11 22
TireTire 11 11 44
MaintenanceMaintenance 11 11 55
FrontFront 11 22 11
RearRear 11 33 11
ReflectorReflector 11 22 22
ReflectorReflector 11 22 55
ReflectorReflector 11 33 22
BracketBracket 11 22 33
AssemblyAssembly 11 22 66
33 11 22 77

Differenze tra indici full-text e indici SQL Server normali:Differences between full-text indexes and regular SQL Server indexes:.

Indici full-textFull-text indexes Indici di SQL Server normaliRegular SQL Server indexes
È consentito un solo indice full-text per tabella.Only one full-text index allowed per table. Sono consentiti più indici normali per tabella.Several regular indexes allowed per table.
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.The addition of data to full-text indexes, called a population, can be requested through either a schedule or a specific request, or can occur automatically with the addition of new data. Vengono automaticamente aggiornati quando si inseriscono, aggiornano o eliminano dati.Updated automatically when the data upon which they are based is inserted, updated, or deleted.
Sono raggruppati all'interno dello stesso database in uno o più cataloghi full-text.Grouped within the same database into one or more full-text catalogs. Non sono raggruppati.Not grouped.

Componenti linguistici e supporto per la lingua nella ricerca full-text Full-Text search linguistic components and language support

La ricerca full-text supporta quasi 50 lingue, tra cui inglese, spagnolo, cinese, giapponese, arabo, bengali e hindi.Full-text search supports almost 50 diverse languages, such as English, Spanish, Chinese, Japanese, Arabic, Bengali, and Hindi. Per un elenco completo delle lingue full-text supportate, vedere sys.fulltext_languages (Transact-SQL).For a complete list of the supported full-text languages, see sys.fulltext_languages (Transact-SQL). A ognuna delle colonne contenute nell'indice full-text è associato un identificatore delle impostazioni locali (LCID) di Microsoft Windows che corrisponde a una lingua supportata dalla ricerca full-text.Each of the columns contained in the full-text index is associated with a Microsoft Windows locale identifier (LCID) that equates to a language that is supported by full-text search. L'identificatore LCID 1033, ad esempio, corrisponde all'inglese americano, mentre l'identificatore LCID 2057 corrisponde all'inglese britannico.For example, LCID 1033 equates to U.S English, and LCID 2057 equates to British English. Per ogni lingua full-text supportata, in SQL ServerSQL Server vengono forniti componenti linguistici che supportano l'indicizzazione e l'esecuzione di query su dati full-text archiviati in quella lingua.For each supported full-text language, SQL ServerSQL Server provides linguistic components that support indexing and querying full-text data that is stored in that language.

Tra i componenti specifici della lingua sono inclusi gli elementi seguenti:Language-specific components include the following:

  • Word breaker e stemmer.Word breakers and stemmers. Un word breaker consente di trovare i delimitatori di parola in base alle regole lessicali di una determinata lingua (word breaking).A word breaker finds word boundaries based on the lexical rules of a given language (word breaking). A ogni word breaker è associato uno stemmer tramite cui vengono coniugati i verbi per la stessa lingua.Each word breaker is associated with a stemmer that conjugates verbs for the same language. Per altre informazioni, vedere Configurare e gestire word breaker e stemmer per la ricerca.For more information, see Configure and Manage Word Breakers and Stemmers for Search.

  • Elenchi di parole non significative.Stoplists. Viene inoltre fornito un elenco di parole non significative di sistema.A system stoplist is provided that contains a basic set stopwords (also known as noise words). Per parola non significativa si intende una parola inutile ai fini della ricerca e quindi ignorata dalle query full-text.A stopword is a word that does not help the search and is ignored by full-text queries. Ad esempio, nelle impostazioni locali della lingua italiana parole quali "circa", "con", "devo" e "cui" sono considerate non significative.For example, for the English locale words such as "a", "and", "is", and "the" are considered stopwords. In genere, è necessario configurare uno o più file del thesaurus ed elenchi di parole non significative.Typically, you will need to configure one or more thesaurus files and stoplists. Per altre informazioni, vedere Configurare e gestire parole non significative ed elenchi di parole non significative per la ricerca full-text.For more information, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

  • File del thesaurus.Thesaurus files. SQL ServerSQL Server installa anche un file del thesaurus per ogni lingua full-text e un file del thesaurus globale. also installs a thesaurus file for each full-text language, as well as a global thesaurus file. I file del thesaurus installati sono praticamente vuoti, ma è possibile modificarli per definire sinonimi per una lingua o uno scenario aziendale specifico.The installed thesaurus files are essentially empty, but you can edit them to define synonyms for a specific language or business scenario. Sviluppando un thesaurus basato sui dati full-text in uso, è possibile ampliare in modo efficace l'ambito delle query full-text su tali dati.By developing a thesaurus tailored to your full-text data, you can effectively broaden the scope of full-text queries on that data. Per altre informazioni, vedere Configurare e gestire i file del thesaurus per la ricerca full-text.For more information, see Configure and Manage Thesaurus Files for Full-Text Search.

  • Filtri (iFilters).Filters (iFilters). Per l'indicizzazione di un documento in una colonna del tipo di dati varbinary(max), imageo xml è richiesta l'applicazione di un filtro per eseguire altre operazioni di elaborazione.Indexing a document in a varbinary(max), image, or xml data type column requires a filter to perform extra processing. Il filtro deve essere specifico del tipo di documento (doc, pdf, xls, xml e così via).The filter must be specific to the document type (.doc, .pdf, .xls, .xml, and so forth). Per altre informazioni, vedere Configurazione e gestione di filtri per la ricerca.For more information, see Configure and Manage Filters for Search.

    I word breaker, gli stemmer e i filtri vengono eseguiti nel processo host del daemon di filtri (fdhost.exe).Word breakers (and stemmers) and filters run in the filter daemon host process (fdhost.exe).

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2008)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse