Procedure consigliate per la scelta di una lingua durante la creazione di un indice full-text
Quando si crea un indice full-text, è necessario specificare una lingua a livello di colonna per la colonna indicizzata. Il word breaker e gli stemmer della lingua specificata verranno utilizzati dalle query full-text sulla colonna. Quando si crea un indice full-text, è necessario considerare alcuni aspetti relativi alla scelta della lingua delle colonne. Tali considerazioni riguardano il modo in cui il testo viene suddiviso in token e quindi indicizzato dal motore di ricerca full-text.
[!NOTA]
Per specificare una lingua a livello di colonna per una colonna di un indice full-text, utilizzare la clausola LANGUAGE language_term quando si specifica la colonna. Per ulteriori informazioni, vedere CREATE FULLTEXT INDEX (Transact-SQL) e ALTER FULLTEXT INDEX (Transact-SQL).
Word breaker
Il word breaker ha la funzione di suddividere in token il testo da indicizzare in base ai delimitatori delle parole specifici della lingua. Il comportamento del word breaker varierà pertanto a seconda della lingua scelta. Se si utilizza una lingua, x, per indicizzare più lingue, {x, y e z}, è possibile che si verifichino risultati imprevisti. È 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. 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. Nella lingua inglese, ad esempio, i delimitatori delle parole sono dati in genere da spazi o da elementi di punteggiatura. In altre lingue come il tedesco, invece, le parole o i caratteri vengono spesso uniti insieme. La lingua a livello di colonna scelta dovrebbe pertanto rappresentare la lingua che si desidera venga archiviata nelle righe di quella colonna.
Lingue occidentali
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. È ad esempio possibile archiviare in una sola colonna contenuto nelle lingue inglese, spagnola e tedesca. 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. 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. Il word breaker inglese potrebbe invece non essere in grado di elaborare perfettamente il testo in tedesco per la presenza delle parole composte.
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. 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.
Lingue non occidentali
Per motivi linguistici, la soluzione precedente non può essere applicata alle lingue non occidentali come il cinese, il giapponese, l'hindi e così via. Per queste lingue, considerare una delle soluzioni alternative seguenti:
Per lingue di famiglie diverse
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. In questo modo, sarebbe possibile utilizzare il word breaker specifico della lingua contenuta in ciascuna colonna. 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.
Contenuto binario (documenti di Microsoft Word)
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 tag della lingua specifici presenti nel file binario. In questo caso, durante l'indicizzazione il filtro genererà l'LCID corretto per un documento o una sezione di un documento. Il motore di ricerca full-text chiamerà quindi il word breaker per la lingua avente l'LCID specificato. È tuttavia consigliabile che al termine dell'indicizzazione di contenuto in più lingue venga verificato che non siano stati commessi errori.
Contenuto di testo normale
Se il contenuto è di 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. Affinché questa soluzione funzioni, tuttavia, è necessario conoscere la lingua prima di procedere all'indicizzazione full-text.
Stemming
Quando si sceglie la lingua a livello di colonna è anche necessario prendere in considerazione lo stemming. Nell'ambito delle query full-text il termine stemming definisce il processo di ricerca di tutte le forme flessive di una parola di una determinata lingua. 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. Ad esempio, gli stemmer del tedesco non funzionano per l'inglese o lo spagnolo e così via. Tutto questo potrebbe influire sulla chiamata a seconda della lingua scelta in fase di query.
Impatto del metodo di archiviazione dati sulla ricerca full-text
Un'altra considerazione relativa alla scelta della lingua riguarda la modalità di rappresentazione dei dati. Ai dati non archiviati nella colonna varbinary(max) non vengono applicati filtri speciali. Il testo, al contrario, viene normalmente passato tramite il componente per l'esecuzione del word breaking così com'è.
I word breaker, inoltre, vengono progettati soprattutto per elaborare il testo scritto. 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. 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. 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.
[!NOTA]
Lo stemming basato sulla lingua non viene eseguito se si specifica la lingua neutra.
Scelta di una lingua a livello di colonna non predefinita in una query full-text
Per impostazione predefinita, in SQL Server 2008 la ricerca full-text analizza i termini delle query utilizzando la lingua specificata per ogni colonna inclusa nella clausola full-text. Per modificare questo comportamento, specificare una lingua non predefinita in fase di query. Per le lingue supportate di cui sono state installate le risorse, è possibile utilizzare la clausola LANGUAGE language_term di una query CONTAINS, CONTAINSTABLE, FREETEXT o FREETEXTTABLE per specificare la lingua utilizzata per l'esecuzione del word breaker, dello stemming, del thesaurus e delle parole non significative dei termini della query.
Supporto linguistico
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.
Introduzione ai word breaker e agli stemmer
In SQL Server 2008 è inclusa una nuova famiglia completa di word breaker e stemmer, notevolmente migliorati rispetto a quelli disponibili in precedenza in SQL Server.
[!NOTA]
Microsoft Natural Language Group (MS NLG) ha implementato e supporta questi nuovi componenti linguistici.
I nuovi word breaker offrono i vantaggi seguenti:
Affidabilità
I test effettuati hanno dimostrato che i nuovi word breaker sono affidabili anche negli ambienti di elaborazione query più complessi.
Protezione
In SQL Server 2008 i nuovi word breaker sono abilitati per impostazione predefinita grazie a una protezione sensibilmente migliorata. È vivamente consigliabile che i componenti esterni quali word breaker e filtri vengano firmati per migliorare la protezione e l'affidabilità di SQL Server. È possibile configurare la funzionalità full-text per verificare che questi componenti siano firmati come illustrato di seguito:
EXEC sp_fulltext_service 'verify_signature';
Qualità
I word breaker sono di nuova progettazione e i test effettuati hanno dimostrato una qualità semantica migliore rispetto a quella dei word breaker precedenti. Ne risulta una maggiore accuratezza delle chiamate in SQL Server 2008.
Copertura
Per numerose lingue, i word breaker sono inclusi direttamente in SQL Server 2008 e abilitati per impostazione predefinita.
Per un elenco delle lingue per le quali in SQL Server 2008 sono inclusi un word breaker e stemmer, vedere sys.fulltext_languages (Transact-SQL).
Word breaker di terze parti
Per SQL Server 2008 sono disponibili numerosi word breaker esterni di terze parti. È possibile registrare manualmente questi word breaker. Per ulteriori informazioni, vedere Como carregar separadores de palavras de terceiros licenciados.
Dopo avere caricato word breaker esterni (di terze parti), è necessario aggiornare l'elenco delle lingue con supporto della funzionalità full-text eseguendo la stored procedure di sistema sp_fulltext_service con l'opzione update_languages specificata.
EXEC sp_fulltext_service 'update_languages';
Le lingue dei word breaker caricati saranno elencate dalla vista del catalogo sys.fulltext_languages.
Utilizzo del nome della lingua a livello di colonna da parte della ricerca full-text
Quando si crea un indice full-text, è necessario specificare un nome di lingua valido per ogni colonna. 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 non è disponibile una lingua simile, viene specificato il word breaker neutro. Questo comportamento potrebbe influire negativamente sull'accuratezza delle chiamate. Per creare un indice full-text, è pertanto consigliabile specificare un nome di lingua valido e disponibile per ogni colonna.
[!NOTA]
L'identificatore LCID viene utilizzato per tutti i tipi di dati considerati idonei per l'indicizzazione full-text, ad esempio char o nchar. Se l'ordinamento di una colonna di tipo char, varchar o text è impostato su una lingua diversa da quella identificata dall'LCID, l'LCID verrà utilizzato comunque durante l'indicizzazione full-text e le query di quelle colonne.
Vedere anche