Configurer un suggesteur pour la saisie semi-automatique et les correspondances suggérées dans une requête

Dans Recherche Azure AI, la saisie semi-automatique (saisie semi-automatique) ou « search-as-you-type » est activée via un suggesteur. Un suggesteur est une configuration dans un index spécifiant les champs à utiliser pour remplir la saisie semi-automatique et les suggestions. Ces champs subissent une tokenisation supplémentaire, générant des séquences de préfixes pour prendre en charge les correspondances en termes partiels. Par exemple, un suggesteur qui comprend un champ Ville avec une valeur pour « Seattle » aura des combinaisons de préfixe « sea », « seat », « seatt » et « seattl » pour prendre en charge l’autocomplétion.

Les correspondances sur des termes partiels peuvent être une requête autocomplétée ou une correspondance suggérée. Le même suggesteur prend en charge les deux expériences.

L’autocomplétion se présente sous deux formes : l’autocomplétion, qui complète une entrée partielle pour une recherche sur un terme entier, ou des suggestions, qui invitent à cliquer sur une correspondance particulière. L’autocomplétion génère une requête. Les suggestions produisent un document correspondant.

La capture d’écran suivante illustre les deux. L’autocomplétion anticipe un terme potentiel, en ajoutant « in » si vous avez tapé « tw ». Les suggestions sont des mini-résultats de recherche, où un champ comme Nom de l’hôtel représente un document de recherche d’hôtels correspondants à partir de l’index. Concernant les suggestions, vous pouvez couvrir n’importe quel champ fournissant des informations descriptives.

Visual comparison of autocomplete and suggested queries

Vous pouvez utiliser ces fonctionnalités séparément ou ensemble. Pour implémenter ces comportements dans Recherche Azure AI, il existe un composant de requête et d’index.

  • Ajoutez un suggesteur à une définition d’index de recherche. La suite de cet article se concentre sur la création d’un suggesteur.

  • Appelez une requête avec suggesteur, sous la forme d’une demande de suggestion ou d’une demande de saisie semi-automatique, à l’aide de l’une des API répertoriées dans une section ultérieure.

La recherche en tant que type est activée par champ pour les champs de chaîne. Vous pouvez implémenter les deux comportements prédictifs dans la même solution de recherche si vous souhaitez une expérience similaire à celle indiquée dans la capture d’écran. Les deux requêtes ciblent la collection de documents d’index et de réponses spécifiques sont retournées une fois qu’un utilisateur fournit au moins une chaîne d’entrée de trois caractères.

Comment créer un suggesteur

Pour créer un suggesteur, ajoutez-en un à une définition d’index. Un suggesteur prend un nom et une collection de champs sur lesquels l’expérience d’autocomplétion est activée. Le meilleur moment pour créer un suggesteur est lorsque vous définissez également le champ qui l’utilise.

  • Utilisez uniquement des champs de chaîne.

  • Si le champ de chaîne fait partie d’un type complexe, par exemple, un champ City (Ville) dans Address (Adresse), incluez le parent dans le chemin du champ : "Address/City" (REST, C# et Python), ou ["Address"]["City"] (JavaScript).

  • Utilisez l’analyseur Lucene standard par défaut ("analyzer": null) ou un analyseur de langage (par exemple, "analyzer": "en.Microsoft") sur le champ.

Si vous essayez de créer un suggesteur à l’aide de champs préexistants, l’API l’interdit. Des préfixes sont générés pendant l’indexation, lorsque des termes partiels combinant deux caractères ou plus sont tokenisés avec des termes entiers. Étant donné que les champs existants sont déjà tokenisés, vous devez reconstruire l’index si vous souhaitez les ajouter à un suggesteur. Pour plus d’informations, consultez Comment régénérer un index Recherche Azure AI.

Choisir des champs

Bien qu’un suggesteur possède plusieurs propriétés, il se compose principalement d’une collection de champs de chaîne pour lesquels vous activez une expérience « search-as-you-type ». Il existe un suggesteur pour chaque index ; la liste des suggesteurs doit donc inclure tous les champs qui contribuent au contenu des suggestions et de l’autocomplétion.

La saisie semi-automatique tire parti d’un plus grand pool de champs à partir duquel tirer, car le contenu supplémentaire offre un potentiel d’achèvement plus long terme.

En revanche, les suggestions produisent de meilleurs résultats lorsque votre choix de champ est sélectif. N’oubliez pas que la suggestion est un proxy pour un document de recherche afin de sélectionner les champs qui représentent le mieux un résultat unique. Les noms, titres ou autres champs uniques qui font la distinction entre plusieurs correspondances fonctionnent le mieux. Si les champs se composent de valeurs répétitives, les suggestions se composent de résultats identiques et un utilisateur ne sait pas lequel choisir.

Pour satisfaire les deux expériences de recherche en tant que type, ajoutez tous les champs dont vous avez besoin pour la saisie semi-automatique, mais utilisez selectensuite , top, filteret searchFields pour contrôler les résultats pour les suggestions.

Choisir des analyseurs

Votre choix d’analyseur détermine la façon dont les champs sont tokenisés et préfixés. Par exemple, pour une chaîne en trait d’union comme « sensible au contexte », l’utilisation d’un analyseur de langage génère ces combinaisons de jetons : « context », « sensitive », « context-sensitive ». Si vous aviez utilisé l’analyseur Lucene standard, la chaîne avec trait d’union n’existerait pas.

Lors de l’évaluation des analyseurs, envisagez d’utiliser l’API d’analyse de texte pour savoir comment les termes sont traités. Une fois que vous avez créé un index, vous pouvez essayer divers analyseurs sur une chaîne pour afficher la sortie du jeton.

Les champs qui utilisent des analyseurs personnalisés ou des analyseurs intégrés (à l’exception de Lucene standard) sont explicitement interdits d’empêcher les résultats médiocres.

Remarque

Si vous avez besoin de contourner la contrainte de l’analyseur, par exemple, si vous avez besoin d’un analyseur de mot clé ou de ngram pour certains scénarios de requête, vous devez utiliser deux champs distincts pour le même contenu. Ceci permettra à l’un des champs d’avoir un suggesteur et à l'autre d'être configuré avec une configuration d’analyseur personnalisée.

Créer à l’aide du portail

Lorsque vous utilisez l’Assistant Ajouter un index ou Importer des données pour créer un index, vous avez la possibilité d’activer un suggesteur :

  1. Dans la définition de l’index, entrez un nom pour le suggesteur.

  2. Dans chaque définition de nouveau champ, activez une case à cocher dans la colonne Suggesteur. Une case à cocher est disponible uniquement sur les champs de chaîne.

Comme indiqué précédemment, le choix de l’analyseur a un impact sur la segmentation du texte en unités lexicales et en préfixes. Tenez compte de l’ensemble de la définition du champ lors de l’activation des suggesteurs.

Créer à l’aide de REST

Dans l’API REST, ajoutez des suggesteurs via Créer un index ou Mettre à jour l’index.

{
  "name": "hotels-sample-index",
  "fields": [
    . . .
        {
            "name": "HotelName",
            "type": "Edm.String",
            "facetable": false,
            "filterable": false,
            "key": false,
            "retrievable": true,
            "searchable": true,
            "sortable": false,
            "analyzer": "en.microsoft",
            "indexAnalyzer": null,
            "searchAnalyzer": null,
            "synonymMaps": [],
            "fields": []
        },
  ],
  "suggesters": [
    {
      "name": "sg",
      "searchMode": "analyzingInfixMatching",
      "sourceFields": ["HotelName"]
    }
  ],
  "scoringProfiles": [
    . . .
  ]
}

Créer à l’aide de .NET

En C#, définissez un objet SearchSuggester. Suggesters est une collection sur un objet SearchIndex, mais elle ne peut recevoir qu’un seul élément. Ajoutez un suggesteur à une définition d’index.

private static void CreateIndex(string indexName, SearchIndexClient indexClient)
{
    FieldBuilder fieldBuilder = new FieldBuilder();
    var searchFields = fieldBuilder.Build(typeof(Hotel));

    var definition = new SearchIndex(indexName, searchFields);

    var suggester = new SearchSuggester("sg", new[] { "HotelName", "Category", "Address/City", "Address/StateProvince" });
    definition.Suggesters.Add(suggester);

    indexClient.CreateOrUpdateIndex(definition);
}

Informations de référence sur les propriétés

Propriété Description
name Spécifiée dans la définition de suggesteur, mais également appelée sur une requête Autocomplétion ou Suggestions.
sourceFields Spécifiée dans la définition de suggesteur. Il s’agit d’une liste d’un ou plusieurs champs de l’index qui sont la source du contenu pour des suggestions. Les champs doivent être de type Edm.String. Tout analyseur spécifié dans le champ doit correspondre à un analyseur lexical nommé issu de cette liste (et non à un analyseur personnalisé).

Il vous est conseillé de spécifier uniquement les champs qui se prêtent à une réponse attendue et appropriée, qu’il s’agisse d’une chaîne complète dans une barre de recherche ou d’une liste déroulante.

Un nom d’hôtel est un bon candidat, car il est précis. Les champs détaillés tels que des descriptions et des commentaires sont trop denses. De même, les champs répétitifs, tels que les balises et les catégories sont moins efficaces. Dans les exemples, nous incluons tout de même « catégorie » pour montrer que vous pouvez inclure plusieurs champs.
searchMode Paramètre REST uniquement, mais également visible dans le portail. Ce paramètre n’est pas disponible dans le Kit de développement logiciel (SDK) .NET. Il indique la stratégie utilisée pour rechercher des expressions candidates. Le seul mode actuellement pris en charge est analyzingInfixMatching, qui établit actuellement une correspondance au début d’un terme.

Utiliser un suggesteur

Un suggesteur est utilisé dans une requête. Après la création d’un suggesteur, appelez l’une des API suivantes pour tester une expérience « search-as-you-type » :

Dans une application de recherche, le code client doit utiliser une bibliothèque comme jQuery UI Autocomplete pour collecter la requête partielle et fournir la correspondance. Pour plus d’informations sur cette tâche, consultez Ajouter l’autocomplétion ou les résultats suggérés au code client.

L’utilisation de l’API est illustrée dans l’appel suivant de l’API REST Autocomplétion. Dans cet exemple, deux éléments importants sont à retenir. Tout d’abord, comme pour toutes les requêtes, l’opération est effectuée sur la collection de documents d’un index et la requête inclut un search paramètre, qui fournit dans ce cas la requête partielle. Ensuite, vous devez ajouter suggesterName à la demande. Si un suggesteur n’est pas défini dans l’index, les appels à la saisie semi-automatique ou aux suggestions échouent.

POST /indexes/myxboxgames/docs/autocomplete?search&api-version=2023-11-01
{
  "search": "minecraf",
  "suggesterName": "sg"
}

Exemple de code

Étapes suivantes

En savoir plus sur la formulation des requêtes