Partager via


Rechercher des données avec Recherche Azure et Xamarin.Forms

Recherche Azure est un service cloud qui fournit des fonctionnalités d’indexation et d’interrogation pour les données chargées. Cela supprime les exigences de l’infrastructure et les complexités de l’algorithme de recherche généralement associées à l’implémentation de fonctionnalités de recherche dans une application. Cet article montre comment utiliser la bibliothèque Recherche Microsoft Azure pour intégrer Recherche Azure dans une Xamarin.Forms application.

Vue d’ensemble

Les données sont stockées dans Recherche Azure sous forme d’index et de documents. Un index est un magasin de données qui peut être recherché par le service Search Azure, et est conceptuellement similaire à une table de base de données. Un document est une unité unique de données pouvant faire l’objet d’une recherche dans un index et est conceptuellement similaire à une ligne de base de données. Lors du chargement de documents et de l’envoi de requêtes de recherche à Recherche Azure, les requêtes sont adressées à un index spécifique dans le service de recherche.

Chaque requête adressée à Recherche Azure doit inclure le nom du service et une clé API. Il existe deux types de clé API :

  • Administration clés accordent des droits complets à toutes les opérations. Cela inclut la gestion du service, la création et la suppression d’index et de sources de données.
  • Les clés de requête accordent un accès en lecture seule aux index et aux documents, et doivent être utilisées par les applications qui émettent des demandes de recherche.

La requête la plus courante à Recherche Azure consiste à exécuter une requête. Il existe deux types de requête qui peuvent être envoyés :

  • Une requête de recherche recherche recherche un ou plusieurs éléments dans tous les champs pouvant faire l’objet d’une recherche dans un index. Les requêtes de recherche sont générées à l’aide de la syntaxe simplifiée ou de la syntaxe de requête Lucene. Pour plus d’informations, consultez Syntaxe de requête simple dans Recherche Azure et Syntaxe de requête Lucene dans Recherche Azure.
  • Une requête de filtre évalue une expression booléenne sur tous les champs filtrables d’un index. Les requêtes de filtre sont générées à l’aide d’un sous-ensemble du langage de filtre OData. Pour plus d’informations, consultez la syntaxe d’expression OData pour Recherche Azure.

Les requêtes de recherche et les requêtes de filtre peuvent être utilisées séparément ou ensemble. Lorsqu’elle est utilisée ensemble, la requête de filtre est appliquée en premier à l’index entier, puis la requête de recherche est effectuée sur les résultats de la requête de filtre.

Recherche Azure prend également en charge la récupération des suggestions en fonction de l’entrée de recherche. Pour plus d’informations, consultez Requêtes de suggestion.

Remarque

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Programme d’installation

Le processus d’intégration d’Azure Search dans une Xamarin.Forms application est le suivant :

  1. Créez un service Search Azure. Pour plus d’informations, consultez Créer un service Search Azure à l’aide du portail Azure.
  2. Supprimez Silverlight en tant que framework cible de la bibliothèque de classes portables de la Xamarin.Forms solution. Pour ce faire, modifiez le profil PCL en n’importe quel profil prenant en charge le développement multiplateforme, mais ne prend pas en charge Silverlight, tel que le profil 151 ou le profil 92.
  3. Ajoutez le package NuGet de la bibliothèque Recherche Microsoft Azure au projet PCL dans la Xamarin.Forms solution.

Une fois ces étapes effectuées, l’API bibliothèque de Recherche Microsoft peut être utilisée pour gérer les index de recherche et les sources de données, charger et gérer des documents et exécuter des requêtes.

Création de l'index Azure Search

Un schéma d’index doit être défini qui mappe à la structure des données à rechercher. Cette opération peut être effectuée dans le portail Azure ou par programmation à l’aide de la SearchServiceClient classe. Cette classe gère les connexions à Recherche Azure et peut être utilisée pour créer un index. L’exemple de code suivant montre comment créer une instance de cette classe :

var searchClient =
  new SearchServiceClient(Constants.SearchServiceName, new SearchCredentials(Constants.AdminApiKey));

La surcharge du SearchServiceClient constructeur prend un nom de service de recherche et un SearchCredentials objet en tant qu’arguments, avec l’objet SearchCredentials encapsulant la clé d’administration pour l’service Search Azure. La clé d’administration est requise pour créer un index.

Remarque

Une seule SearchServiceClient instance doit être utilisée dans une application pour éviter d’ouvrir trop de connexions à Recherche Azure.

Un index est défini par l’objet Index , comme illustré dans l’exemple de code suivant :

static void CreateSearchIndex()
{
  var index = new Index()
  {
    Name = Constants.Index,
    Fields = new[]
    {
      new Field("id", DataType.String) { IsKey = true, IsRetrievable = true },
      new Field("name", DataType.String) { IsRetrievable = true, IsFilterable = true, IsSortable = true, IsSearchable = true },
      new Field("location", DataType.String) { IsRetrievable = true, IsFilterable = true, IsSortable = true, IsSearchable = true },
      new Field("details", DataType.String) { IsRetrievable = true, IsFilterable = true, IsSearchable = true },
      new Field("imageUrl", DataType.String) { IsRetrievable = true }
    },
    Suggesters = new[]
    {
      new Suggester("nameSuggester", SuggesterSearchMode.AnalyzingInfixMatching, new[] { "name" })
    }
  };

  searchClient.Indexes.Create(index);
}

La Index.Name propriété doit être définie sur le nom de l’index et la Index.Fields propriété doit être définie sur un tableau d’objets Field . Chaque Field instance spécifie un nom, un type et toutes les propriétés, qui spécifient la façon dont le champ est utilisé. Ces propriétés sont les suivantes :

  • IsKey : indique si le champ est la clé de l’index. Un seul champ de l’index, de type DataType.String, doit être désigné comme champ clé.
  • IsFacetable : indique s’il est possible d’effectuer une navigation à facettes sur ce champ. La valeur par défaut est false.
  • IsFilterable : indique si le champ peut être utilisé dans les requêtes de filtre. La valeur par défaut est false.
  • IsRetrievable : indique si le champ peut être récupéré dans les résultats de recherche. La valeur par défaut est true.
  • IsSearchable : indique si le champ est inclus dans les recherches en texte intégral. La valeur par défaut est false.
  • IsSortable : indique si le champ peut être utilisé dans OrderBy les expressions. La valeur par défaut est false.

Remarque

La modification d’un index après son déploiement implique la reconstruction et le rechargement des données.

Un Index objet peut éventuellement spécifier une Suggesters propriété, qui définit les champs de l’index à utiliser pour prendre en charge la saisie semi-automatique ou les requêtes de suggestion de recherche. La Suggesters propriété doit être définie sur un tableau d’objets Suggester qui définissent les champs utilisés pour générer les résultats de la suggestion de recherche.

Après avoir créé l’objet Index , l’index est créé en appelant Indexes.Create l’instance SearchServiceClient .

Remarque

Lors de la création d’un index à partir d’une application qui doit être conservé réactif, utilisez la Indexes.CreateAsync méthode.

Pour plus d’informations, consultez Créer un index Recherche Azure à l’aide du Kit de développement logiciel (SDK) .NET.

Suppression de l’index Recherche Azure

Un index peut être supprimé en appelant Indexes.Delete l’instance SearchServiceClient :

searchClient.Indexes.Delete(Constants.Index);

Chargement de données dans l’index Recherche Azure

Après avoir défini l’index, les données peuvent être chargées sur celui-ci à l’aide de l’un des deux modèles suivants :

  • Modèle d’extraction : les données sont régulièrement ingérées à partir d’Azure Cosmos DB, d’Azure SQL Database, de Stockage Blob Azure ou de SQL Server hébergées dans une machine virtuelle Azure.
  • Modèle Push : les données sont envoyées par programmation à l’index. Il s’agit du modèle adopté dans cet article.

Une SearchIndexClient instance doit être créée pour importer des données dans l’index. Pour ce faire, appelez la SearchServiceClient.Indexes.GetClient méthode, comme illustré dans l’exemple de code suivant :

static void UploadDataToSearchIndex()
{
  var indexClient = searchClient.Indexes.GetClient(Constants.Index);

  var monkeyList = MonkeyData.Monkeys.Select(m => new
  {
    id = Guid.NewGuid().ToString(),
    name = m.Name,
    location = m.Location,
    details = m.Details,
    imageUrl = m.ImageUrl
  });

  var batch = IndexBatch.New(monkeyList.Select(IndexAction.Upload));
  try
  {
    indexClient.Documents.Index(batch);
  }
  catch (IndexBatchException ex)
  {
    // Sometimes when the Search service is under load, indexing will fail for some
    // documents in the batch. Compensating actions like delaying and retrying should be taken.
    // Here, the failed document keys are logged.
    Console.WriteLine("Failed to index some documents: {0}",
      string.Join(", ", ex.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key)));
  }
}

Les données à importer dans l’index sont empaquetées en tant qu’objet IndexBatch , ce qui encapsule une collection d’objets IndexAction . Chaque IndexAction instance contient un document et une propriété qui indique à Recherche Azure quelle action effectuer sur le document. Dans l’exemple de code ci-dessus, l’action IndexAction.Upload est spécifiée, ce qui entraîne l’insertion du document dans l’index s’il est nouveau ou remplacé s’il existe déjà. L’objet IndexBatch est ensuite envoyé à l’index en appelant la Documents.Index méthode sur l’objet SearchIndexClient . Pour plus d’informations sur d’autres actions d’indexation, consultez Décider de l’action d’indexation à utiliser.

Remarque

Seuls 1 000 documents peuvent être inclus dans une requête d’indexation unique.

Notez que dans l’exemple de code ci-dessus, la monkeyList collection est créée en tant qu’objet anonyme à partir d’une collection d’objets Monkey . Cela crée des données pour le id champ et résout le mappage des noms de propriétés de cas Monkey Pascal aux noms de champs d’index de recherche de cas chameaux. Vous pouvez également effectuer ce mappage en ajoutant l’attribut [SerializePropertyNamesAsCamelCase] à la Monkey classe.

Pour plus d’informations, consultez Charger des données dans Recherche Azure à l’aide du Kit de développement logiciel (SDK) .NET.

Interrogation de l’index Recherche Azure

Une SearchIndexClient instance doit être créée pour interroger un index. Lorsqu’une application exécute des requêtes, il est conseillé de suivre le principe du privilège minimum et de créer une SearchIndexClient requête directement, en passant la clé de requête en tant qu’argument. Cela garantit que les utilisateurs disposent d’un accès en lecture seule aux index et aux documents. Cette approche est illustrée dans l’exemple de code suivant :

SearchIndexClient indexClient =
  new SearchIndexClient(Constants.SearchServiceName, Constants.Index, new SearchCredentials(Constants.QueryApiKey));

La surcharge du SearchIndexClient constructeur prend un nom de service de recherche, un nom d’index et un SearchCredentials objet en tant qu’arguments, avec l’objet SearchCredentials encapsulant la clé de requête pour le service Search Azure.

Requêtes de recherche

L’index peut être interrogé en appelant la Documents.SearchAsync méthode sur l’instance SearchIndexClient , comme illustré dans l’exemple de code suivant :

async Task AzureSearch(string text)
{
  Monkeys.Clear();

  var searchResults = await indexClient.Documents.SearchAsync<Monkey>(text);
  foreach (SearchResult<Monkey> result in searchResults.Results)
  {
    Monkeys.Add(new Monkey
    {
      Name = result.Document.Name,
      Location = result.Document.Location,
      Details = result.Document.Details,
      ImageUrl = result.Document.ImageUrl
    });
  }
}

La SearchAsync méthode prend un argument de texte de recherche et un objet facultatif SearchParameters qui peut être utilisé pour affiner davantage la requête. Une requête de recherche est spécifiée comme argument de texte de recherche, tandis qu’une requête de filtre peut être spécifiée en définissant la Filter propriété de l’argument SearchParameters . L’exemple de code suivant illustre les deux types de requêtes :

var parameters = new SearchParameters
{
  Filter = "location ne 'China' and location ne 'Vietnam'"
};
var searchResults = await indexClient.Documents.SearchAsync<Monkey>(text, parameters);

Cette requête de filtre est appliquée à l’index entier et supprime les documents des résultats où le location champ n’est pas égal à la Chine et non égal au Vietnam. Après le filtrage, la requête de recherche est effectuée sur les résultats de la requête de filtre.

Remarque

Pour filtrer sans effectuer de recherche, passez * en tant qu’argument de texte de recherche.

La SearchAsync méthode retourne un DocumentSearchResult objet qui contient les résultats de la requête. Cet objet est énuméré, chaque Document objet étant créé en tant qu’objet Monkey et ajouté à l’affichage MonkeysObservableCollection . Les captures d’écran suivantes montrent les résultats de la requête de recherche retournés par Recherche Azure :

Résultats de la recherche

Pour plus d’informations sur la recherche et le filtrage, consultez Interroger votre index Recherche Azure à l’aide du Kit de développement logiciel (SDK) .NET.

Requêtes de suggestion

Recherche Azure permet de demander des suggestions en fonction d’une requête de recherche, en appelant la Documents.SuggestAsync méthode sur l’instance SearchIndexClient . Ceci est illustré dans l’exemple de code suivant :

async Task AzureSuggestions(string text)
{
  Suggestions.Clear();

  var parameters = new SuggestParameters()
  {
    UseFuzzyMatching = true,
    HighlightPreTag = "[",
    HighlightPostTag = "]",
    MinimumCoverage = 100,
    Top = 10
  };

  var suggestionResults =
    await indexClient.Documents.SuggestAsync<Monkey>(text, "nameSuggester", parameters);

  foreach (var result in suggestionResults.Results)
  {
    Suggestions.Add(new Monkey
    {
      Name = result.Text,
      Location = result.Document.Location,
      Details = result.Document.Details,
      ImageUrl = result.Document.ImageUrl
    });
  }
}

La SuggestAsync méthode prend un argument de texte de recherche, le nom du suggesteur à utiliser (défini dans l’index) et un objet facultatif SuggestParameters qui peut être utilisé pour affiner davantage la requête. L’instance SuggestParameters définit les propriétés suivantes :

  • UseFuzzyMatching – lorsqu’il est défini truesur , Recherche Azure trouve des suggestions, même s’il existe un caractère substitué ou manquant dans le texte de recherche.
  • HighlightPreTag : balise qui est précédée de correspondances de suggestion.
  • HighlightPostTag : balise ajoutée aux correspondances de suggestion.
  • MinimumCoverage : représente le pourcentage de l’index qui doit être couvert par une requête de suggestion pour que la requête soit signalée comme ayant réussi. La valeur par défaut est 80.
  • Top : nombre de suggestions à récupérer. Il doit s’agir d’un entier compris entre 1 et 100, avec une valeur par défaut de 5.

L’effet global est que les 10 premiers résultats de l’index seront retournés avec la mise en surbrillance des correspondances, et les résultats incluront des documents qui incluent des termes de recherche orthographiés similaires.

La SuggestAsync méthode retourne un DocumentSuggestResult objet qui contient les résultats de la requête. Cet objet est énuméré, chaque Document objet étant créé en tant qu’objet Monkey et ajouté à l’affichage MonkeysObservableCollection . Les captures d’écran suivantes montrent les résultats de suggestion retournés par Recherche Azure :

Résultats des suggestions

Notez que dans l’exemple d’application, la SuggestAsync méthode est appelée uniquement lorsque l’utilisateur termine la saisie d’un terme de recherche. Toutefois, il peut également être utilisé pour prendre en charge les requêtes de recherche complète automatiquement en s’exécutant sur chaque touche.

Résumé

Cet article a montré comment utiliser la bibliothèque Recherche Microsoft Azure pour intégrer Recherche Azure dans une Xamarin.Forms application. Recherche Azure est un service cloud qui fournit des fonctionnalités d’indexation et d’interrogation pour les données chargées. Cela supprime les exigences de l’infrastructure et les complexités de l’algorithme de recherche généralement associées à l’implémentation de fonctionnalités de recherche dans une application.