Configurer un suggesteur pour la saisie semi-automatique et les suggestions dans une requête

Dans Azure AI Search, le typeahead ou « recherche au fur et à mesure que vous tapez » est activé par l'utilisation d'un suggérateur. Un suggesteur est une configuration dans un index qui spécifie les champs à utiliser pour remplir la saisie semi-automatique et les correspondances suggérées. Ces champs sont soumis à une tokenisation supplémentaire, générant des séquences de préfixe pour prendre en charge les correspondances sur des termes partiels. Par exemple, un suggesteur qui inclut un champ de city avec une valeur pour Seattle a des combinaisons de préfixes de sea, seat, seatt et seattl pour prendre en charge le typeahead.

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.

Typeahead 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 cet exemple. L’autocomplétion anticipe un terme potentiel, en ajoutant in si vous avez tapé tw. Les suggestions sont des résultats de recherche mini, où un champ comme hotel name représente un document de recherche d’hôtel correspondant à partir de l’index. Concernant les suggestions, vous pouvez couvrir n’importe quel champ fournissant des informations descriptives.

Capture d’écran montrant la comparaison visuelle de la saisie semi-automatique et des requêtes suggérées.

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. Le reste 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 requête d’autocomplétion, à l’aide de l’une des API répertoriées dans Utiliser un suggesteur.

L’expérience de recherche lors de la frappe est activée par champ pour des champs de chaînes. 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’un index spécifique et les réponses sont retournées après qu’un utilisateur fournit au moins une chaîne d’entrée à 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 Ville dans l’adresse), incluez le parent dans le chemin d’accès au 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 le 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. Les champs existants étant déjà tokenisés, vous devez recréer l’index pour les ajouter à un suggesteur. Pour plus d’informations, consultez Mettre à jour ou reconstruire un index dans 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.

L’autocomplétion bénéficie d’un plus grand nombre de champs à exploiter, car le contenu supplémentaire a un potentiel d’achèvement des termes plus important.

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. Sélectionnez donc 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 sont constitués de valeurs répétitives, les suggestions consistent en des résultats identiques, et l’utilisateur ne saura pas laquelle choisir.

Pour convenir aux deux expériences de recherche lors de la frappe, ajoutez tous les champs dont vous avez besoin pour l’autocomplétion, mais utilisez select, top, filter et searchFields pour contrôler les résultats des suggestions.

Choisir des analyseurs

L’analyseur choisi détermine la façon dont les champs sont tokenisés et préfixés. Par exemple, pour une chaîne avec trait d’union comme context-sensitive, l’utilisation d’un analyseur de langage entraînera les combinaisons de jetons suivantes : 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 pour éviter des 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. Cela permet à l’un des champs d’avoir un suggesteur, tandis que l’autre peut être configuré avec une configuration d’analyseur personnalisé.

Création à l’aide du portail Azure

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 à l’aide de 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. Si un analyseur est spécifié sur le champ, il doit s’agir d’un analyseur lexical nommé répertorié sur Struct LexicalAnalyzerName (pas 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 avec toutes les requêtes, l’opération est effectuée sur la collection de documents d’un index, et la requête inclut un paramètre search, qui, dans ce cas, fournit la requête partielle. Ensuite, vous devez ajouter suggesterName à la requête. Si un suggesteur n’est pas défini dans l’index, les appels à l’autocomplétion ou aux suggestions se solde par un échec.

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

Exemple de code

Pour savoir comment utiliser un package suggestions open source pour une saisie semi-automatique dans l’application cliente, consultez Explorer le code de recherche .NET.

Étape suivante

En savoir plus sur la formulation des demandes.