Share via


Normalisation du texte pour le filtrage, les facettes et le tri sans prise en compte de la casse

Important

Cette fonctionnalité est en préversion publique sous les conditions d’utilisation supplémentaires. L’API REST en préversion prend en charge cette fonctionnalité.

Dans la recherche cognitive Azure, un normalisateur est un composant qui pré-traite le texte pour la correspondance de mots clés sur les champs marqués comme « filtrable », « à choix multiples » ou « triable ». Contrairement aux champs « pouvant faire l’objet d’une recherche » en texte intégral associés à des analyseurs de texte, le contenu créé pour les opérations de filtre, facettes et tri ne subit pas d’analyse ou de segmentation du texte en unités lexicales. L’omission de l’analyse de texte peut produire des résultats inattendus lorsque la casse et les différences de caractères s’affichent, c’est pourquoi vous avez besoin d’un normaliseur pour homogénéiser les variations dans votre contenu.

En appliquant un normaliseur, vous pouvez obtenir des transformations de texte légères qui améliorent les résultats :

  • Casse cohérente (par exemple, tout en minuscules ou en majuscules)
  • Normalisent les accents et les signes diacritiques tels que ö ou ê en caractères ASCII équivalents, « o » et « e » dans notre exemple
  • Mappent des caractères tels que - et les espaces blancs en un caractère spécifié par l’utilisateur

Avantages des normaliseurs

La recherche et la récupération de documents à partir d’un index de recherche requiert la mise en correspondance de l’entrée de requête avec le contenu du document. La correspondance est soit sur le contenu segmenté, comme c’est le cas lorsque vous appelez la « recherche », ou sur du contenu non segmenté si la requête est une opération filter, facet ou orderby.

Étant donné que le contenu non segmenté n’est pas non plus analysé, les petites différences dans le contenu sont évaluées comme des valeurs distinctes. Penchez-vous sur les exemples suivants :

  • $filter=City eq 'Las Vegas' renvoie uniquement les documents qui contiennent le texte "Las Vegas" exact et excluent les documents avec "LAS VEGAS" et "las vegas", ce qui est insuffisant lorsque le cas d’usage requiert tous les documents indépendamment de la casse.

  • search=*&facet=City,count:5 retournera "Las Vegas", "LAS VEGAS" et "las vegas" en tant que valeurs distinctes en dépit d’être la même ville.

  • search=usa&$orderby=City retournera les villes dans l’ordre lexicographique : "Las Vegas", "Seattle", , "las vegas"même si l’intention est d’ordonner les mêmes villes ensemble indépendamment du cas.

Un normaliseur, appelé pendant l’indexation et l’exécution des requêtes, ajoute des transformations légères qui lissent les différences mineures dans le texte pour les scénarios de filtre, de facette et de tri. Dans les exemples précédents, les variantes sont "Las Vegas" traitées en fonction du normaliseur que vous sélectionnez (par exemple, tout le texte est en minuscules) pour obtenir des résultats plus uniformes.

Comment spécifier un normaliseur

Les normaliseurs sont spécifiés dans une définition d’index, par champ, sur des champs de texte (Edm.String et Collection(Edm.String)) dont au moins une des propriétés « filterable », « sortablee » ou « facetable » est définie sur true. La définition d’un normaliseur est facultative et a la valeur Null par défaut. Nous recommandons d’évaluer les normaliseurs prédéfinis avant d’en configurer un personnalisé.

Les normaliseurs ne peuvent être spécifiés que lorsque vous ajoutez un nouveau champ à l’index, aussi, si possible, essayez d’évaluer les besoins de normalisation à l’avance et d’affecter des normaliseurs au cours des phases initiales de développement lorsque les index sont encore régulièrement supprimés et recréés.

  1. Lors de la création d’une définition de champ dans l’index, définissez la propriété « normalizer » sur l’un des valeurs suivantes : un normaliseur prédéfini tel que « lowercase », ou un analyseur personnalisé (défini dans le même schéma d’index).

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "filterable": true,
       "analyzer": "en.microsoft",
       "normalizer": "lowercase"
       ...
     }
    ]
    
  2. Les normaliseurs personnalisés sont définis en premier dans la section « normalizers » de l’index, puis attribués à la définition de champ, comme indiqué à l’étape précédente. Pour plus d’informations, consultez Créer un index et Ajouter des normaliseurs personnalisés.

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": null,
       "normalizer": "my_custom_normalizer"
     },
    

Remarque

Pour modifier le normaliseur d’un champ existant, régénérez entièrement l’index (vous ne pouvez pas reconstruire des champs individuels).

Une bonne solution pour les index de production, où la reconstruction d’index est coûteuse, consiste à créer un nouveau champ identique à l’ancien, mais avec la nouvelle normalisation, et de l’utiliser à la place de l’ancien. Utilisez Mettre à jour l’index pour incorporer le nouveau champ et mergeOrUpload pour le remplir. Par la suite, pendant l’opération de maintenance planifiée de l’index, vous pouvez le nettoyer de façon à supprimer les champs obsolètes.

Normaliseurs prédéfinis et personnalisés

La recherche cognitive Azure fournit des normalisateurs intégrés pour les cas d’utilisation courants, avec la possibilité de les personnaliser en fonction des besoins.

Category Description
Normaliseurs prédéfinis Fournis prêts à l’emploi et utilisables sans aucune configuration.
Normaliseurs personnalisés1 Pour les scénarios avancés. Requiert une configuration définie par l’utilisateur d’une combinaison d’éléments existants, comprenant de filtres de caractères et de jetons.

(1) Les normaliseurs personnalisés ne spécifient pas de générateurs de jetons, car les normaliseurs produisent toujours un jeton unique.

Référence sur les normaliseurs

Normaliseurs prédéfinis

Nom Description et options
standard Met le texte en minuscules, puis applique l’asciifolding.
minuscules Convertit des caractères en minuscules.
majuscules Convertit des caractères en majuscules.
asciifolding Transforme les caractères qui ne sont pas dans le bloc Unicode latin de base en leur équivalent ASCII, s’il en existe un. Par exemple, en remplaçant àapar .
elision Supprime l’élision au début des jetons.

Filtres de caractères pris en charge

Les normaliseurs prennent en charge deux filtres de caractères identiques à leurs équivalents dans les filtres de caractères d’analyseur personnalisé :

Filtres de jetons pris en charge

La liste ci-dessous montre les filtres de jetons pris en charge pour les normaliseurs, et est un sous-ensemble des filtres de jetons globaux utilisés dans des analyseurs personnalisés.

Ajouter des normaliseurs personnalisés

Les normaliseurs personnalisés sont définis dans le schéma d’index. La définition inclut un nom, un type, et un ou plusieurs filtres de caractères et de jetons. Les filtres de caractères et de jetons sont les blocs de construction d’un normaliseur personnalisé, et sont responsables du traitement du texte. Ces filtres sont appliqués de gauche à droite.

Le token_filter_name_1 est le nom d’un filtre de jetons, tandis que char_filter_name_1 et char_filter_name_2 sont les noms des filtres de caractères (voir les tableaux Filtres de jetons pris en charge et Filtres de caractères pris en charge ci-dessous pour les valeurs valides).

"normalizers":(optional)[
   {
      "name":"name of normalizer",
      "@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
      "charFilters":[
         "char_filter_name_1",
         "char_filter_name_2"
      ],
      "tokenFilters":[
         "token_filter_name_1"
      ]
   }
],
"charFilters":(optional)[
   {
      "name":"char_filter_name_1",
      "@odata.type":"#char_filter_type",
      "option1": "value1",
      "option2": "value2",
      ...
   }
],
"tokenFilters":(optional)[
   {
      "name":"token_filter_name_1",
      "@odata.type":"#token_filter_type",
      "option1": "value1",
      "option2": "value2",
      ...
   }
]

Des normaliseurs personnalisés peuvent être ajoutés lors de la création de l’index ou ultérieurement en en mettant un à jour. L’ajout d’un normaliseur personnalisé à un index existant nécessite que l’indicateur « allowIndexDowntime » soit spécifié dans Index de mise à jour et entraîne l’indisponibilité de l’index pendant quelques secondes.

Exemple de normaliseur personnalisé

L’exemple ci-dessous illustre une définition de normalisation personnalisée avec les filtres de caractères et de jetons correspondants. Les options personnalisées pour les filtres de caractères et de jetons sont spécifiées séparément comme des constructions nommées, puis référencées dans la définition du normaliseur, comme illustré ci-dessous.

  • Une normalisation personnalisée nommée « my_custom_normalizer » est définie dans la section « normalizers » de la définition d’index.

  • Le normaliseur est composé de deux filtres de caractères et de trois filtres de jetons : élision, minuscules et filtre d’asciifolding personnalisé « my_asciifolding ».

  • Le premier filtre de caractères, « map_dash », remplace tous les tirets par des traits de soulignement tandis que le second, « remove_whitespace », supprime toutes les espaces.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false,
        },
        {
           "name":"city",
           "type":"Edm.String",
           "filterable": true,
           "facetable": true,
           "normalizer": "my_custom_normalizer"
        }
     ],
     "normalizers":[
        {
           "name":"my_custom_normalizer",
           "@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
           "charFilters":[
              "map_dash",
              "remove_whitespace"
           ],
           "tokenFilters":[              
              "my_asciifolding",
              "elision",
              "lowercase",
           ]
        }
     ],
     "charFilters":[
        {
           "name":"map_dash",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["-=>_"]
        },
        {
           "name":"remove_whitespace",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["\\u0020=>"]
        }
     ],
     "tokenFilters":[
        {
           "name":"my_asciifolding",
           "@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
           "preserveOriginal":true
        }
     ]
  }

Voir aussi