Choisir une langue lors de la création d’un index de recherche en texte intégral

S’applique à :SQL ServerBase de données Azure SQLAzure SQL Managed Instance

Lorsque vous créez un index en texte intégral, spécifiez un langage au niveau de la colonne pour la colonne indexée. Les requêtes de texte intégral sur la colonne utilisent l'analyseur lexical et les générateurs de formes dérivées de la langue spécifiée. Considérez comment le Full-Text Engine tokenise puis indexe votre texte lorsque vous choisissez la langue des colonnes.

Remarque

Pour spécifier une langue au niveau des colonnes d’une colonne d’index de recherche en texte intégral, utilisez la LANGUAGE <language_term> clause lors de la spécification de la colonne. Pour plus d’informations, consultez CREATE FULLTEXT INDEX et ALTER FULLTEXT INDEX.

Cette section fournit une introduction aux analyseurs lexicaux et aux générateur de formes dérivées et indique comment la recherche en texte intégral utilise le LCID de la langue de la colonne.

Introduction aux analyseurs lexicaux et aux générateurs de formes dérivées

Le Moteur de base de données SQL Server inclut des analyseurs lexicaux et des générateurs de forme pour de nombreuses langues, activés par défaut. Microsoft Natural Language Group (NLG) implémente et prend en charge ces composants linguistiques. Pour une liste des langues prises en charge, voir sys.fulltext_languages.

Les composants externes tels que les séparateurs de mots et les filtres doivent être signés pour améliorer la sécurité. Pour vérifier la signature, exécutez la déclaration suivante :

EXECUTE sp_fulltext_service 'verify_signature';

Comment la recherche en texte intégral utilise le nom de la langue défini au niveau de la colonne

Lorsque vous créez un index en texte intégral, spécifiez un nom de langue valide pour chaque colonne. Si un nom de langue est valide mais que la vue catalogue sys.fulltext_languages ne le retourne pas, Full-Text recherche revient au nom de langue disponible le plus proche de la même famille linguistique, le cas échéant. Sinon, la recherche en texte intégral revient à l'analyseur lexical neutre. Pour éviter ce comportement de basculement, spécifiez un nom de langue valide et disponible.

Remarque

Le LCID est appliqué à tous les types de données pouvant faire l’objet d’une indexation de texte intégral (par exemple char ou nchar). Si l’ordre de tri d’une colonne de type char, varcharou text est défini à l’aide d’une langue différente de la langue identifiée par le LCID, ce dernier est néanmoins utilisé durant l’indexation de recherche en texte intégral et l’interrogation de ces colonnes.

Césure de mots

Un analyseur lexical crée des jetons dans le texte indexé à partir des limites des mots, qui sont spécifiques aux langues. Par conséquent, le comportement d'analyse lexicale diffère d'une langue à l'autre. Si vous utilisez une langue, xpour indexer plusieurs langues {x, yet z}, certains du comportement peuvent entraîner des résultats inattendus. Par exemple, un tiret (-) ou une virgule (,) peuvent être des éléments de séparation de mots qui sont ignorés dans une langue, mais pas dans une autre. Rarement, un comportement de génération de formes dérivées inattendu peut également se produire parce qu'un mot donné peut être dérivé différemment dans d'autres langues. Par exemple, en anglais, les limites des mots sont généralement fixées par des espaces blancs ou un signe de ponctuation. Dans d’autres langues, comme l’allemand, des mots ou des caractères peuvent être combinés. Par conséquent, la langue au niveau des colonnes que vous choisissez doit représenter la langue que vous prévoyez de stocker dans les lignes de cette colonne.

Langues occidentales

Pour la famille occidentale de langues, si vous ne savez pas quelles langues seront stockées dans une colonne, ou si vous prévoyez que plusieurs langues soient stockées, une solution de contournement générale consiste à utiliser le analyseur de mots pour la langue la plus complexe susceptible d’être stockée dans la colonne.

Par exemple, vous pouvez vous attendre à stocker du contenu anglais, espagnol et allemand dans une seule colonne. Ces trois langues occidentales possèdent des modèles de rupture de mots similaires, avec les modèles allemands étant les plus complexes. Par conséquent, dans ce cas, un bon choix est d’utiliser le « word breaker » allemand, qui peut traiter correctement les textes anglais et espagnol. Par contre, il se peut que l'analyseur lexical anglais ne puisse pas traiter parfaitement le texte allemand à cause des mots composés allemands.

L’utilisation du analyseur de mots de la langue la plus complexe dans une famille de langues ne garantit pas l’indexation parfaite de chaque langue de la famille. Il peut exister des cas limites où même l’analyseur de mots le plus sophistiqué ne parvient pas à traiter correctement un texte rédigé dans une autre langue.

Langues non occidentales

Pour les langues non occidentales (comme le chinois, le japonais, l’hindi, etc.), la solution précédente ne fonctionne pas forcément, pour des raisons linguistiques. Pour les langues non occidentales, considérez l’une des solutions suivantes :

  • Pour les langues de familles différentes

    Si une colonne peut contenir des langues complètement différentes, par exemple l'espagnol et le japonais, pensez à stocker le contenu de langues différentes dans des colonnes séparées. Cette séparation vous permet d’utiliser, pour chaque colonne, l’analyseur lexical propre à la langue concernée. Si vous choisissez cette solution et que vous ne connaissez pas la langue de la requête à l'heure de la requête, vous pouvez devoir lancer la requête par rapport aux deux colonnes afin de faire en sorte que la requête recherche la bonne ligne ou le bon document.

  • Pour le contenu binaire (comme les documents Microsoft Word)

    Lorsque le contenu indexé est de type binaire , le filtre de recherche Full-Text qui traite le texte avant de l’envoyer au briseur de mots peut honorer des balises linguistiques spécifiques dans le fichier binaire. Dans ce cas, au moment de l’indexation, le filtre émet le LCID approprié pour un document ou une section d’un document. Le moteur d'indexation et de recherche en texte intégral appelle ensuite l'analyseur lexical pour la langue correspondant à ce LCID. Cependant, après avoir indexé le contenu multilingue, vérifiez que le contenu a été correctement indexé.

  • Pour un contenu de texte brut

    Lorsque votre contenu est du texte brut, vous pouvez le convertir en type de données xml et ajouter les balises de langue qui indiquent la langue qui correspond à chaque document ou section de document spécifique. Pour que cette option fonctionne toutefois, vous devez connaître la langue avant l'indexation de recherche en texte intégral.

Recherche de radical

La recherche de radical est un autre point à prendre en considération lors du choix de la langue de votre colonne. Larecherche de radical dans les requêtes de texte intégral se définit comme la recherche de toutes les formes fléchies d’un mot dans une langue particulière. Lorsque vous utilisez un analyseur lexical générique pour traiter plusieurs langues, le processus de recherche de radical fonctionne uniquement pour la langue spécifiée pour la colonne, et non pour d'autres langues dans la colonne. Par exemple, les générateur de formes dérivées allemands ne fonctionnent pas pour l'anglais et l'espagnol (etc.). Ce comportement peut affecter votre rappel selon la langue choisie au moment de la requête.

Un autre point à prendre en considération dans le choix de la langue est lié au mode de représentation des données. Pour les données qui ne sont pas stockées dans une colonne varbinary(max), aucun filtrage spécial n’est effectué. À la place, le texte est généralement traité tel quel par le composant de séparation des mots.

Les analyseurs lexicaux sont, aussi, principalement conçus pour traiter le texte écrit. Si votre texte contient du balisage (comme du HTML), la précision linguistique lors de l’indexation et de la recherche peut être réduite. Dans ce cas, vous avez deux choix : la méthode préférée est de stocker les données textuelles dans une colonne varbinary(max ), et d’indiquer son type de document afin qu’elles puissent être filtrées. Si cette approche ne vous convient pas, vous pouvez utiliser un analyseur lexical neutre et, si possible, ajoutez des données de balisage (par exemple « br » en langage HTML) à vos listes de mots parasites.

Remarque

Le stemming basé sur la langue ne s’applique pas lorsque vous spécifiez le langage neutre.

Spécifier un langage au niveau de colonne non par défaut dans une requête en texte intégral

Par défaut, dans le Moteur de base de données, Full-Text Search analyse les termes de requête en utilisant le langage spécifié pour chaque colonne dans la clause texte intégral. Pour remplacer ce comportement, spécifiez une langue autre que par défaut au moment de la requête. Pour les langues prises en charge dont les ressources sont installées, la clause LANGUAGE <language_term> d’une requête CONTAINS, CONTAINSTABLE, FREETEXT ou FREETEXTTABLE est utilisée pour spécifier la langue utilisée pour l’analyse lexicale, la recherche de radical, le dictionnaire des synonymes et le traitement des mots vides des termes de la requête.