Scelta di una lingua durante la creazione di un indice full-textChoose a Language When Creating a Full-Text Index

Quando si crea un indice full-text, è necessario specificare una lingua a livello di colonna per la colonna indicizzata.When creating a full-text index, you need to specify a column-level language for the indexed column. Il word breaker e gli stemmer della lingua specificata verranno usati dalle query full-text sulla colonna.The word breaker and stemmers of the specified language will be used by full-text queries on the column. Quando si crea un indice full-text, è necessario considerare alcuni aspetti relativi alla scelta della lingua delle colonne.There are a couple of things to consider when choosing the column language when creating a full-text index. Tali considerazioni riguardano il modo in cui il testo viene suddiviso in token e quindi indicizzato dal motore di ricerca full-text.These considerations relate to how your text is tokenized and then indexed by Full-Text Engine.

Nota

Per specificare una lingua a livello di colonna per una colonna di un indice full-text, usare la clausola language_term LANGUAGE quando si specifica la colonna.To specify a column-level language for a column of full-text index, use the LANGUAGE language_term clause when specifying the column. Per altre informazioni, vedere CREATE FULLTEXT INDEX (Transact-SQL) e ALTER FULLTEXT INDEX (Transact-SQL).For more information, see CREATE FULLTEXT INDEX (Transact-SQL) and ALTER FULLTEXT INDEX (Transact-SQL).

Supporto della lingua nella ricerca full-textLanguage Support in Full-Text Search

In questa sezione viene fornita un'introduzione ai word breaker e agli stemmer e viene illustrato l'utilizzo dell'LCID della lingua a livello di colonna da parte della ricerca full-text.This section provides an introduction to word breakers and stemmers, and discusses how full-text search uses the LCID of the column-level language.

Introduzione ai word breaker e agli stemmerIntroduction to Word Breakers and Stemmers

SQL Server 2008SQL Server 2008 e versioni successive è inclusa una nuova famiglia completa di word breaker e stemmer, notevolmente migliorati rispetto a quelli disponibili in precedenza in SQL ServerSQL Server. and later versions include a complete new family of word breakers and stemmers that are significantly better than those previously available in SQL ServerSQL Server.

Nota

Microsoft Natural Language Group (MS NLG) ha implementato e supporta questi nuovi componenti linguistici.The Microsoft Natural Language Group (MS NLG) implemented and supports these new linguistic components.

I nuovi word breaker offrono i vantaggi seguenti:The new word breakers provide the following benefits:

  • AffidabilitàRobustness

    I test effettuati hanno dimostrato che i nuovi word breaker sono affidabili anche negli ambienti di elaborazione query più complessi.Testing has shown that the new word breakers are robust in high-pressure query environments.

  • SicurezzaSecurity

    I nuovi word breaker sono abilitati per impostazione predefinita in SQL Server grazie ai miglioramenti della sicurezza nei componenti linguistici.The new word breakers are enabled by default in SQL Server thanks to security improvements in linguistic components. È vivamente consigliabile che i componenti esterni quali word breaker e filtri vengano firmati per migliorare la sicurezza e l'affidabilità di SQL Server.We highly recommend that external components such as word breakers and filters be signed to improve the overall security and robustness of SQL Server. È possibile configurare la funzionalità full-text per verificare che questi componenti siano firmati come descritto di seguito:You can configure full-text to verify that these components are signed as follows:

    EXEC sp_fulltext_service 'verify_signature';  
    
  • QualitàQuality

    I word breaker sono di nuova progettazione e i test effettuati hanno dimostrato una qualità semantica migliore rispetto a quella dei word breaker precedenti.Word breakers have been redesigned, and testing has shown that the new word breakers provide better semantic quality than previous word breakers. Ne risulta una maggiore accuratezza delle chiamate.This increases the recall accuracy.

  • I word breaker, disponibili per numerose lingue, sono inclusi direttamente in SQL Server e abilitati per impostazione predefinita.Coverage for a vast list of languages, word breakers are included in SQL Server out of the box and enabled by default .

    Per un elenco delle lingue per le quali SQL Server include un word breaker e stemmer, vedere sys.fulltext_languages (Transact-SQL).For a list of the languages for which SQL Server includes a word breaker and stemmers, see sys.fulltext_languages (Transact-SQL).

Utilizzo del nome della lingua a livello di colonna da parte della ricerca full-textHow Full-Text Search Uses the Name of the Column-Level Language

Quando si crea un indice full-text, è necessario specificare un nome di lingua valido per ogni colonna.When creating a full-text index, you need to specify a valid language name for each column. Se un nome di lingua è valido, ma non restituito dalla vista del catalogo sys.fulltext_languages (Transact-SQL) , la ricerca full-text opta per il nome di lingua disponibile più simile nella stessa famiglia, se disponibile.If a language name is valid but not returned by the sys.fulltext_languages (Transact-SQL) catalog view, full-text search falls back to the closest available language name of the same language family, if any. Se non è disponibile una lingua simile, viene specificato il word breaker neutro.Otherwise, full-text search falls back to the Neutral word breaker. Questo comportamento potrebbe influire negativamente sull'accuratezza delle chiamate.This fall-back behavior might affect the recall accuracy. Per creare un indice full-text, è pertanto consigliabile specificare un nome di lingua valido e disponibile per ogni colonna.Therefore we strongly recommend that you specify a valid and available language name for each column when creating a full-text index.

Nota

L'identificatore LCID viene usato per tutti i tipi di dati considerati idonei per l'indicizzazione full-text, ad esempio char o nchar.The LCID is used against all data types eligible for full-text indexing (such as char or nchar). Se l'ordinamento di una colonna di tipo char, varcharo text è impostato su una lingua diversa da quella identificata dall'LCID, quest'ultimo verrà usato comunque durante l'indicizzazione full-text e le query di quelle colonne.If you have the sort order of a char, varchar, or text type column set to a language setting different from the language identified by the LCID, the LCID is used anyway during full-text indexing and querying of those columns.

Word breakingWord Breaking

Il word breaker ha la funzione di suddividere in token il testo da indicizzare in base ai delimitatori delle parole specifici della lingua.A word breaker tokenizes the text being indexed on word boundaries, which are language specific. Il comportamento del word breaker varierà pertanto a seconda della lingua scelta.Therefore, word-breaking behavior differs among different languages. Se si utilizza una lingua, x, per indicizzare più lingue, {x, y e z}, è possibile che si verifichino risultati imprevisti.If you use one language, x, to index a number of languages {x, y, and ,z}, some of the behavior might cause unexpected results. È ad esempio possibile che un elemento di interruzione delle parole quale il trattino (-) o la virgola (,) venga eliminato in una lingua, ma non in un'altra.For example, a dash (-) or a comma (,) might be a word-break element that will be thrown away in one language but not in another. In alcuni casi, si potrebbe inoltre ottenere un comportamento imprevisto per lo stemming, in quanto è possibile che a una determinata parola venga applicato uno stemmer diverso nelle diverse lingue.Also rarely unexpected stemming behavior might occur because a given word might stem differently in different language. Nella lingua inglese, ad esempio, i delimitatori delle parole sono dati in genere da spazi o da elementi di punteggiatura.For example, in the English language, word boundaries are typically white space or some form of punctuation. In altre lingue come il tedesco, invece, le parole o i caratteri vengono spesso uniti insieme.In other languages, such as German, words or characters may be combined together. La lingua a livello di colonna scelta dovrebbe pertanto rappresentare la lingua che si desidera venga archiviata nelle righe di quella colonna.Therefore, the column-level language that you choose should represent the language that you expect will be stored in rows of that column.

Lingue occidentaliWestern Languages

Nel caso delle lingue occidentali, se non si è certi delle lingue che verranno archiviate in una colonna o si prevede che verranno archiviate più lingue, provare a utilizzare il word breaker per la lingua più complessa che potrebbe essere archiviata nella colonna.For the Western family of languages, if you are unsure which languages will be stored in a column or you expect more than one to be stored, a general workaround is to use the word breaker for the most complex language that might be stored in the column. È ad esempio possibile archiviare in una sola colonna contenuto nelle lingue inglese, spagnola e tedesca.For instance, you might expect to store English, Spanish and German content in a single column. Queste tre lingue occidentali sono basate su regole di suddivisione delle parole molto simili e delle tre il tedesco risulta essere la lingua più complessa.These three Western languages possess very similar word-breaking patterns, with the German patterns being the most complex. In questo caso, la soluzione ottimale potrebbe consistere nell'utilizzare il word breaker tedesco che dovrebbe essere in grado di elaborare correttamente il testo nelle lingue inglese e spagnola.Therefore, a good choice is this case would be to use the German word breaker, which should be able to process English and Spanish text correctly. Il word breaker inglese potrebbe invece non essere in grado di elaborare perfettamente il testo in tedesco per la presenza delle parole composte.In contrast, the English word breaker might not process German text perfectly because of the compound words of German.

Si noti, tuttavia, che l'utilizzo del word breaker della lingua più complessa di una famiglia di lingue non garantisce un'indicizzazione perfetta di ogni lingua di tale famiglia.Note that using the word breaker of the most complex language in a language family does not guarantee perfect indexing of every language in the family. Potrebbero infatti verificarsi casi limite in cui il word breaker più complesso non è in grado di gestire correttamente il testo scritto in un'altra lingua.Corner cases might exist in which the most complex word breaker cannot correctly handle text written in another language.

Lingue non occidentaliNon Western Languages

Per motivi linguistici, la soluzione precedente non può essere applicata alle lingue non occidentali come il cinese, il giapponese, l'hindi e così via.For non Western languages (such as Chinese, Japanese, Hindi, and so forth) the above workaround does not necessarily work, for linguistic reasons. Per queste lingue, considerare una delle soluzioni alternative seguenti:For non Western languages, consider one of the following workarounds:

  • Per lingue di famiglie diverseFor languages from different families

    Se una colonna dovesse contenere testo in lingue radicalmente diverse, ad esempio spagnolo e giapponese, valutare la possibilità di archiviare tale contenuto in colonne diverse.If a column might contain dramatically different languages, for example, Spanish and Japanese, consider storing the content of different languages in separate columns. In questo modo, sarebbe possibile utilizzare il word breaker specifico della lingua contenuta in ciascuna colonna.This would allow you to use the language-specific word breaker for each column. Se si sceglie questa soluzione e non si conosce la lingua da utilizzare in fase di query, potrebbe essere necessario eseguire la query in entrambe le colonne per essere sicuri che la query trovi la riga o il documento corretto.If you choose this solution and you don't know the query language at query time, you might need to issue the query against both columns to ensure that the query finds the right row or document.

  • Contenuto binario (documenti di Microsoft Word)For Binary content (such as Microsoft Word documents)

    Se il contenuto indicizzato è di tipo binary , il filtro della ricerca full-text che elabora il contenuto di testo prima di inviarlo al word breaker potrebbe rispettare specifici tag della lingua presenti nel file binario.When the indexed content is of binary type, the full-text search filter that processes the textual content before sending it to the word breaker might honor specific language tags existing within the binary file. In questo caso, durante l'indicizzazione il filtro genererà l'LCID corretto per un documento o una sezione di un documento.In this case, at indexing time, the filter will emit the right LCID for a document or section of a document. Il motore di ricerca full-text chiamerà quindi il word breaker per la lingua avente l'LCID specificato.The Full-Text Engine will then call the word breaker for the language with that LCID. È tuttavia consigliabile che al termine dell'indicizzazione di contenuto in più lingue venga verificato che non siano stati commessi errori.However, after indexing multi language content, we recommend that you verify that the content was correctly indexed.

  • Contenuto di testo normaleFor plain text content

    Se il contenuto è testo normale, è possibile convertirlo nel tipo di dati xml e aggiungere tag che indichino la lingua corrispondente a ogni documento o sezione di documento specifica.When your content is plain text, you can convert it to the xml data type and add language tags that indicate the language corresponding to each specific document or document section. Affinché questa soluzione funzioni, tuttavia, è necessario conoscere la lingua prima di procedere all'indicizzazione full-text.For this to work, however, you need to know the language before full-text indexing.

StemmingStemming

Quando si sceglie la lingua a livello di colonna è anche necessario prendere in considerazione lo stemming.An additional consideration when choosing your column-level language is stemming. Nell'ambito delle query full-text il terminestemming definisce il processo di ricerca di tutte le forme flessive di una parola di una determinata lingua.Stemming in full-text queries is the process of searching for all stemmed (inflectional) forms of a word in a particular language. Quando si utilizza un word breaker generico per elaborare più lingue, il processo di stemming funziona solo per la lingua specificata per la colonna, non per le altre lingue presenti nella colonna.When you use a generic word breaker to process several languages, the stemming process works only for the language specified for the column, not for other languages in the column. Ad esempio, gli stemmer del tedesco non funzionano per l'inglese o lo spagnolo e così via.For example, German stemmers do not work for English or Spanish (and so forth). Tutto questo potrebbe influire sulla chiamata a seconda della lingua scelta in fase di query.This might affect your recall depending of which language you choose at query time.

Effetto del tipo di colonna sulla ricerca full-textEffect of Column Type on Full-Text Search

Un'altra considerazione relativa alla scelta della lingua riguarda la modalità di rappresentazione dei dati.Another consideration in language choice is related to how the data is represented. Ai dati non archiviati nella colonna varbinary(max) non vengono applicati filtri speciali.For data that is not stored in varbinary(max) column, no special filtering is performed. Il testo, al contrario, viene normalmente passato tramite il componente per l'esecuzione del word breaking così com'è.Rather, the text is generally passed through the word breaking component as-is.

I word breaker, inoltre, vengono progettati soprattutto per elaborare il testo scritto.Also, word breakers are designed mainly to process written text. Ne consegue che, se il testo include un tipo qualsiasi di markup (ad esempio HTML) le operazioni di indicizzazione e ricerca potrebbero non essere sufficientemente accurate dal punto di vista linguistico.So, if you have any type of markup (such as HTML) on your text, you may not get great linguistic accuracy during indexing and search. In tal caso esistono due possibilità. Il metodo preferito consiste semplicemente nell'archiviare i dati di testo nella colonna varbinary(max) e indicare il tipo del documento per consentire l'applicazione del filtro.In that case, you have two choices—the preferred method is simply to store the text data in varbinary(max) column, and to indicate its document type so it may be filtered. Se questa operazione non è possibile, valutare la possibilità di utilizzare il word breaker neutro ed eventualmente di aggiungere dati di markup, ad esempio "br" nel codice HTML, agli elenchi delle parole non significative.If this is not an option, you may consider using the neutral word breaker and, if possible, adding markup data (such as 'br' in HTML) to your noise word lists.

Nota

Lo stemming basato sulla lingua non viene eseguito se si specifica la lingua neutra.Language based stemming does not come into play when you specify the neutral language.

Scelta di una lingua a livello di colonna non predefinita in una query full-textSpecifying a Non-default Column-Level Language in a Full-Text Query

Per impostazione predefinita, in SQL ServerSQL Serverla ricerca full-text analizza i termini delle query usando la lingua specificata per ogni colonna inclusa nella clausola full-text.By default, in SQL ServerSQL Server, full-text search will parse the query terms using the language specified for each column that is included in the full-text clause. Per modificare questo comportamento, specificare una lingua non predefinita in fase di query.To override this behavior, specify a nondefault language at query time. Per le lingue supportate di cui sono state installate le risorse, è possibile usare la clausola language_term LANGUAGE di una query CONTAINS, CONTAINSTABLE, FREETEXTo FREETEXTTABLE per specificare la lingua usata per l'esecuzione del word breaker, dello stemming, del thesaurus e delle parole non significative dei termini della query.For supported languages whose resources are installed, the LANGUAGE language_term clause of a CONTAINS, CONTAINSTABLE, FREETEXT, or FREETEXTTABLE query can be used to specify the language used for word breaking, stemming, thesaurus, and stopword processing of the query terms.

Vedere ancheSee Also

CONTAINS (Transact-SQL) CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL) CONTAINSTABLE (Transact-SQL)
Tipi di dati (Transact-SQL) Data Types (Transact-SQL)
FREETEXT (Transact-SQL) FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL) FREETEXTTABLE (Transact-SQL)
Configurazione e gestione di filtri per la ricerca Configure and Manage Filters for Search
sp_fulltext_service (Transact-SQL) sp_fulltext_service (Transact-SQL)
sys.fulltext_languages (Transact-SQL) sys.fulltext_languages (Transact-SQL)
Configurazione e gestione di word breaker e stemmer per la ricercaConfigure and Manage Word Breakers and Stemmers for Search