Suchen von Daten mit Azure Search und Xamarin.Forms

Azure Search ist ein Clouddienst, der Indizierungs- und Abfragefunktionen für hochgeladene Daten bereitstellt. Dadurch werden die Infrastrukturanforderungen und suchalgorithmuskomplexitäten entfernt, die traditionell der Implementierung von Suchfunktionen in einer Anwendung zugeordnet sind. In diesem Artikel wird veranschaulicht, wie Sie die Microsoft Azure Search-Bibliothek verwenden, um Azure Search in eine Xamarin.Forms Anwendung zu integrieren.

Übersicht

Daten werden in Azure Search als Indizes und Dokumente gespeichert. Ein Index ist ein Datenspeicher von Daten, die vom Azure Suchdienst durchsucht werden können und konzeptuell einer Datenbanktabelle ähneln. Ein Dokument ist eine einzelne Einheit von durchsuchbaren Daten in einem Index und ähnelt konzeptuell einer Datenbankzeile. Beim Hochladen von Dokumenten und Senden von Suchabfragen an Azure Search werden Anforderungen an einen bestimmten Index im Suchdienst gestellt.

Jede Anforderung an Azure Search muss den Namen des Diensts und einen API-Schlüssel enthalten. Es gibt zwei Arten von API-Schlüssel:

  • Administratorschlüssel gewähren allen Vorgängen vollständige Rechte. Dazu gehören die Verwaltung des Diensts, das Erstellen und Löschen von Indizes und Datenquellen.
  • Abfrageschlüssel gewähren schreibgeschützten Zugriff auf Indizes und Dokumente und sollten von Anwendungen verwendet werden, die Suchanforderungen ausstellen.

Die häufigste Anforderung an Azure Search besteht darin, eine Abfrage auszuführen. Es gibt zwei Arten von Abfragen, die übermittelt werden können:

  • Eine Suchabfrage sucht nach einem oder mehreren Elementen in allen durchsuchbaren Feldern in einem Index. Suchabfragen werden mithilfe der vereinfachten Syntax oder der Lucene-Abfragesyntax erstellt. Weitere Informationen finden Sie unter Einfache Abfragesyntax in Azure Search und Lucene-Abfragesyntax in Azure Search.
  • Eine Filterabfrage wertet einen booleschen Ausdruck über alle filterbaren Felder in einem Index aus. Filterabfragen werden mithilfe einer Teilmenge der OData-Filtersprache erstellt. Weitere Informationen finden Sie unter OData-Ausdruckssyntax für Azure Search.

Suchabfragen und Filterabfragen können separat oder zusammen verwendet werden. Wenn sie zusammen verwendet wird, wird die Filterabfrage zuerst auf den gesamten Index angewendet, und dann wird die Suchabfrage für die Ergebnisse der Filterabfrage ausgeführt.

Azure Search unterstützt auch das Abrufen von Vorschlägen basierend auf der Sucheingabe. Weitere Informationen finden Sie unter Vorschlagsabfragen.

Hinweis

Wenn Sie kein Azure-Abonnement besitzen, erstellen Sie ein kostenloses Konto, bevor Sie beginnen.

Setup

Der Prozess für die Integration von Azure Search in eine Xamarin.Forms Anwendung lautet wie folgt:

  1. Erstellen Sie ein Azure Suchdienst. Weitere Informationen finden Sie unter Erstellen eines Azure Suchdienst mithilfe des Azure-Portals.
  2. Entfernen Sie Silverlight als Zielframework aus der Xamarin.Forms Lösung Portable Class Library (PCL). Dies kann erreicht werden, indem Sie das PCL-Profil in ein beliebiges Profil ändern, das die plattformübergreifende Entwicklung unterstützt, aber Silverlight nicht unterstützt, z. B. Profil 151 oder Profil 92.
  3. Fügen Sie das NuGet-Paket der Microsoft Azure Search-Bibliothek dem PCL-Projekt in der Xamarin.Forms Projektmappe hinzu.

Nachdem Sie diese Schritte ausgeführt haben, kann die Microsoft Search-Bibliotheks-API verwendet werden, um Suchindizes und Datenquellen zu verwalten, Dokumente hochzuladen und zu verwalten und Abfragen auszuführen.

Erstellen eines Azure Search-Index

Ein Indexschema muss definiert werden, das der Struktur der zu durchsuchenden Daten zugeordnet ist. Dies kann im Azure-Portal oder programmgesteuert mithilfe der SearchServiceClient Klasse erreicht werden. Diese Klasse verwaltet Verbindungen mit Azure Search und kann zum Erstellen eines Indexes verwendet werden. Im folgenden Codebeispiel wird veranschaulicht, wie eine Instanz dieser Klasse erstellt wird:

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

Die SearchServiceClient Konstruktorüberladung verwendet einen Suchdienstnamen und ein SearchCredentials Objekt als Argumente, wobei der SearchCredentialsAdministratorschlüssel für azure Suchdienst umbrochen wird. Der Administratorschlüssel ist erforderlich, um einen Index zu erstellen.

Hinweis

Eine einzelne SearchServiceClient Instanz sollte in einer Anwendung verwendet werden, um zu viele Verbindungen mit Azure Search zu vermeiden.

Ein Index wird durch das Index Objekt definiert, wie im folgenden Codebeispiel veranschaulicht:

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);
}

Die Index.Name Eigenschaft sollte auf den Namen des Indexes festgelegt werden, und die Index.Fields Eigenschaft sollte auf ein Array von Field Objekten festgelegt werden. Jede Field Instanz gibt einen Namen, einen Typ und alle Eigenschaften an, die angeben, wie das Feld verwendet wird. Zu diesen Eigenschaften zählen folgende:

  • IsKey – gibt an, ob das Feld der Schlüssel des Indexes ist. Nur ein Feld im Index des Typs DataType.Stringmuss als Schlüsselfeld festgelegt werden.
  • IsFacetable – gibt an, ob es möglich ist, eine facetierte Navigation in diesem Feld durchzuführen. Der Standardwert ist false.
  • IsFilterable – Gibt an, ob das Feld in Filterabfragen verwendet werden kann. Der Standardwert ist false.
  • IsRetrievable – gibt an, ob das Feld in Suchergebnissen abgerufen werden kann. Der Standardwert ist true.
  • IsSearchable – gibt an, ob das Feld in Volltextsuchen enthalten ist. Der Standardwert ist false.
  • IsSortable – Gibt an, ob das Feld in OrderBy Ausdrücken verwendet werden kann. Der Standardwert ist false.

Hinweis

Das Ändern eines Indexes nach der Bereitstellung umfasst die Neuerstellung und erneutes Laden der Daten.

Ein Index Objekt kann optional eine Suggesters Eigenschaft angeben, die die Felder im Index definiert, die verwendet werden sollen, um AutoVervollständigen- oder Suchvorschlagsabfragen zu unterstützen. Die Suggesters Eigenschaft sollte auf ein Array von Suggester Objekten festgelegt werden, die die Felder definieren, die zum Erstellen der Suchergebnisse verwendet werden.

Nach dem Erstellen des Index Objekts wird der Index durch Aufrufen Indexes.Create der SearchServiceClient Instanz erstellt.

Hinweis

Verwenden Sie beim Erstellen eines Indexes aus einer Anwendung, die reaktionsfähig gehalten werden muss, die Indexes.CreateAsync Methode.

Weitere Informationen finden Sie unter Erstellen eines Azure Search-Index mithilfe des .NET SDK.

Löschen des Azure Search-Indexes

Ein Index kann durch Aufrufen Indexes.Delete der SearchServiceClient Instanz gelöscht werden:

searchClient.Indexes.Delete(Constants.Index);

Hochladen von Daten in den Azure Search-Index

Nach dem Definieren des Indexes können Daten mithilfe eines von zwei Modellen in den Index hochgeladen werden:

  • Pullmodell – Daten werden regelmäßig aus Azure Cosmos DB, Azure SQL-Datenbank, Azure Blob Storage oder SQL Server aufgenommen, die in einem virtuellen Azure-Computer gehostet werden.
  • Pushmodell – Daten werden programmgesteuert an den Index gesendet. Dies ist das in diesem Artikel angenommene Modell.

Eine SearchIndexClient Instanz muss erstellt werden, um Daten in den Index zu importieren. Dies kann durch Aufrufen der SearchServiceClient.Indexes.GetClient Methode erreicht werden, wie im folgenden Codebeispiel veranschaulicht:

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)));
  }
}

Daten, die in den Index importiert werden sollen, werden als IndexBatch Objekt gepackt, das eine Auflistung von IndexAction Objekten kapselt. Jede IndexAction Instanz enthält ein Dokument und eine Eigenschaft, die Azure Search angibt, welche Aktion für das Dokument ausgeführt werden soll. Im obigen Codebeispiel wird die IndexAction.Upload Aktion angegeben, was dazu führt, dass das Dokument in den Index eingefügt wird, wenn es neu ist oder ersetzt wird, wenn es bereits vorhanden ist. Das IndexBatch Objekt wird dann an den Index gesendet, indem die Documents.Index Methode für das SearchIndexClient Objekt aufgerufen wird. Informationen zu anderen Indizierungsaktionen finden Sie unter Entscheiden, welche Indizierungsaktion verwendet werden soll.

Hinweis

In einer einzigen Indizierungsanforderung können nur 1000 Dokumente enthalten sein.

Beachten Sie, dass die monkeyList Auflistung im obigen Codebeispiel als anonymes Objekt aus einer Auflistung von Monkey Objekten erstellt wird. Dadurch werden Daten für das id Feld erstellt und die Zuordnung der Pascal-Falleigenschaftsnamen Monkey zu den Indexnamen der Kamelfallsuche aufgelöst. Alternativ kann diese Zuordnung auch durch Hinzufügen des [SerializePropertyNamesAsCamelCase] Attributs zur Monkey Klasse erreicht werden.

Weitere Informationen finden Sie unter Hochladen von Daten in Azure Search mithilfe des .NET SDK.

Abfragen des Azure Search-Indexes

Zum Abfragen eines Indexes muss eine SearchIndexClient Instanz erstellt werden. Wenn eine Anwendung Abfragen ausführt, empfiehlt es sich, dem Prinzip der geringsten Berechtigung zu folgen und einen SearchIndexClient direkt zu erstellen und den Abfrageschlüssel als Argument zu übergeben. Dadurch wird sichergestellt, dass Benutzer schreibgeschützten Zugriff auf Indizes und Dokumente haben. Dieser Ansatz wird im folgenden Codebeispiel veranschaulicht:

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

Die SearchIndexClient Konstruktorüberladung verwendet einen Suchdienstnamen, indexnamen und ein SearchCredentials Objekt als Argumente, wobei das Objekt den SearchCredentialsAbfrageschlüssel für die Azure Suchdienst umschlossen.

Search Queries

Der Index kann abgefragt werden, indem die Documents.SearchAsync Methode für die SearchIndexClient Instanz aufgerufen wird, wie im folgenden Codebeispiel veranschaulicht:

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
    });
  }
}

Die SearchAsync Methode verwendet ein Suchtextargument und ein optionales SearchParameters Objekt, das verwendet werden kann, um die Abfrage weiter zu verfeinern. Eine Suchabfrage wird als Suchtextargument angegeben, während eine Filterabfrage durch Festlegen der Filter Eigenschaft des SearchParameters Arguments angegeben werden kann. Im folgenden Codebeispiel werden beide Abfragetypen veranschaulicht:

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

Diese Filterabfrage wird auf den gesamten Index angewendet und entfernt Dokumente aus den Ergebnissen, bei denen das location Feld nicht mit China und nicht gleich Vietnam ist. Nach dem Filtern wird die Suchabfrage für die Ergebnisse der Filterabfrage ausgeführt.

Hinweis

Um ohne Suche zu filtern, übergeben Sie * das Suchtextargument.

Die SearchAsync Methode gibt ein DocumentSearchResult Objekt zurück, das die Abfrageergebnisse enthält. Dieses Objekt wird aufgezählt, wobei jedes Document Objekt als Monkey Objekt erstellt und zur MonkeysObservableCollection Anzeige hinzugefügt wird. Die folgenden Screenshots zeigen suchergebnisse, die von Azure Search zurückgegeben wurden:

Suchergebnisse

Weitere Informationen zum Suchen und Filtern finden Sie unter Abfragen Ihres Azure Search-Index mithilfe des .NET SDK.

Vorschlagsabfragen

Azure Search ermöglicht das Anfordern von Vorschlägen basierend auf einer Suchabfrage, indem die Documents.SuggestAsync Methode für die SearchIndexClient Instanz aufgerufen wird. Dies wird im folgenden Codebeispiel veranschaulicht:

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
    });
  }
}

Die SuggestAsync Methode verwendet ein Suchtextargument, den Namen des zu verwendenden Vorschlagers (der im Index definiert ist) und ein optionales SuggestParameters Objekt, das verwendet werden kann, um die Abfrage weiter zu verfeinern. Die SuggestParameters Instanz legt die folgenden Eigenschaften fest:

  • UseFuzzyMatching – Bei Festlegung auf true, findet Azure Search Vorschläge, auch wenn im Suchtext ein ersetztes oder fehlendes Zeichen vorhanden ist.
  • HighlightPreTag – das Tag, das den Vorschlagstreffern vorangestellt ist.
  • HighlightPostTag – das Tag, das an Vorschlagstreffer angefügt wird.
  • MinimumCoverage – stellt den Prozentsatz des Indexes dar, der von einer Vorschlagsabfrage abgedeckt werden muss, damit die Abfrage erfolgreich gemeldet wird. Der Standardwert ist 80.
  • Top – die Anzahl der abzurufenden Vorschläge. Es muss eine ganze Zahl zwischen 1 und 100 sein, wobei der Standardwert 5 ist.

Der Gesamteffekt besteht darin, dass die top 10 Ergebnisse aus dem Index mit Trefferheraufhebung zurückgegeben werden, und die Ergebnisse enthalten Dokumente, die ähnlich geschriebene Suchbegriffe enthalten.

Die SuggestAsync Methode gibt ein DocumentSuggestResult Objekt zurück, das die Abfrageergebnisse enthält. Dieses Objekt wird aufgezählt, wobei jedes Document Objekt als Monkey Objekt erstellt und zur MonkeysObservableCollection Anzeige hinzugefügt wird. Die folgenden Screenshots zeigen die Von Azure Search zurückgegebenen Vorschlagsergebnisse:

Vorschlagsergebnisse

Beachten Sie, dass die Methode in der Beispielanwendung nur aufgerufen wird, SuggestAsync wenn der Benutzer die Eingabe eines Suchbegriffs abgeschlossen hat. Es kann jedoch auch verwendet werden, um automatisch abgeschlossene Suchabfragen zu unterstützen, indem sie auf jeder Keypress ausgeführt werden.

Zusammenfassung

In diesem Artikel wurde gezeigt, wie Sie die Microsoft Azure Search-Bibliothek verwenden, um Azure Search in eine Xamarin.Forms Anwendung zu integrieren. Azure Search ist ein Clouddienst, der Indizierungs- und Abfragefunktionen für hochgeladene Daten bereitstellt. Dadurch werden die Infrastrukturanforderungen und suchalgorithmuskomplexitäten entfernt, die traditionell der Implementierung von Suchfunktionen in einer Anwendung zugeordnet sind.