Udostępnij za pośrednictwem


Wyszukiwanie danych za pomocą usługi Azure Search i Xamarin.Forms

Azure Search to usługa w chmurze, która zapewnia możliwości indeksowania i wykonywania zapytań dotyczących przekazanych danych. Spowoduje to usunięcie wymagań dotyczących infrastruktury i złożoności algorytmów wyszukiwania tradycyjnie związanych z implementacją funkcji wyszukiwania w aplikacji. W tym artykule pokazano, jak zintegrować usługę Azure Search z aplikacją Xamarin.Forms przy użyciu biblioteki microsoft Azure Search.

Omówienie

Dane są przechowywane w usłudze Azure Search jako indeksy i dokumenty. Indeks to magazyn danych, który może być przeszukiwany przez usługę Azure usługa wyszukiwania i jest koncepcyjnie podobny do tabeli bazy danych. Dokument jest pojedynczą jednostką danych z możliwością wyszukiwania w indeksie i jest koncepcyjnie podobny do wiersza bazy danych. Podczas przekazywania dokumentów i przesyłania zapytań wyszukiwania do usługi Azure Search żądania są wysyłane do określonego indeksu w usłudze wyszukiwania.

Każde żądanie skierowane do usługi Azure Search musi zawierać nazwę usługi i klucz interfejsu API. Istnieją dwa typy klucza interfejsu API:

  • Klucze administracyjne udzielają pełnych praw do wszystkich operacji. Obejmuje to zarządzanie usługą, tworzenie i usuwanie indeksów oraz źródeł danych.
  • Klucze zapytań zapewniają dostęp tylko do odczytu do indeksów i dokumentów oraz powinny być używane przez aplikacje, które wysyłają żądania wyszukiwania.

Najczęstszym żądaniem usługi Azure Search jest wykonanie zapytania. Istnieją dwa typy zapytań, które można przesłać:

Zapytania wyszukiwania i zapytania filtru mogą być używane oddzielnie lub razem. Gdy jest używane razem, zapytanie filtru jest stosowane najpierw do całego indeksu, a następnie zapytanie wyszukiwania jest wykonywane na wynikach zapytania filtru.

Usługa Azure Search obsługuje również pobieranie sugestii na podstawie danych wejściowych wyszukiwania. Aby uzyskać więcej informacji, zobacz Sugestie zapytania.

Uwaga

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Ustawienia

Proces integrowania usługi Azure Search z aplikacją Xamarin.Forms jest następujący:

  1. Tworzenie usługa wyszukiwania platformy Azure. Aby uzyskać więcej informacji, zobacz Tworzenie usługa wyszukiwania Azure przy użyciu witryny Azure Portal.
  2. Usuń program Silverlight jako platformę docelową z Xamarin.Forms biblioteki klas przenośnych rozwiązania (PCL). Można to zrobić, zmieniając profil PCL na dowolny profil, który obsługuje programowanie międzyplatformowe, ale nie obsługuje programu Silverlight, takiego jak profil 151 lub profil 92.
  3. Dodaj pakiet NuGet biblioteki Microsoft Azure Search do projektu PCL w rozwiązaniuXamarin.Forms.

Po wykonaniu tych kroków interfejs API biblioteki wyszukiwania Microsoft może służyć do zarządzania indeksami wyszukiwania i źródłami danych, przekazywania dokumentów i zarządzania nimi oraz wykonywania zapytań.

Tworzenie indeksu usługi Azure Search

Należy zdefiniować schemat indeksu, który jest mapowany na strukturę danych do przeszukiwania. Można to zrobić w witrynie Azure Portal lub programowo przy użyciu SearchServiceClient klasy . Ta klasa zarządza połączeniami z usługą Azure Search i może służyć do tworzenia indeksu. W poniższym przykładzie kodu pokazano, jak utworzyć wystąpienie tej klasy:

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

Przeciążenie SearchServiceClient konstruktora przyjmuje nazwę usługi wyszukiwania i SearchCredentials obiekt jako argumenty z SearchCredentials obiektem opakowującym klucz administracyjny dla usługi Azure usługa wyszukiwania. Klucz administracyjny jest wymagany do utworzenia indeksu.

Uwaga

SearchServiceClient Pojedyncze wystąpienie powinno być używane w aplikacji, aby uniknąć otwierania zbyt wielu połączeń z usługą Azure Search.

Indeks jest definiowany Index przez obiekt, jak pokazano w poniższym przykładzie kodu:

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

Właściwość Index.Name powinna być ustawiona na nazwę indeksu, a Index.Fields właściwość powinna być ustawiona na tablicę Field obiektów. Każde Field wystąpienie określa nazwę, typ i wszelkie właściwości, które określają sposób użycia pola. Te właściwości obejmują:

  • IsKey — wskazuje, czy pole jest kluczem indeksu. Tylko jedno pole w indeksie typu DataType.Stringmusi być oznaczone jako pole klucza.
  • IsFacetable — wskazuje, czy można przeprowadzić nawigację aspektowa w tym polu. Domyślna wartość to false.
  • IsFilterable — wskazuje, czy pole może być używane w zapytaniach filtrów. Domyślna wartość to false.
  • IsRetrievable — wskazuje, czy pole można pobrać w wynikach wyszukiwania. Domyślna wartość to true.
  • IsSearchable — wskazuje, czy pole jest uwzględniane w wyszukiwaniu pełnotekstowym. Domyślna wartość to false.
  • IsSortable — wskazuje, czy pole może być używane w wyrażeniach OrderBy . Domyślna wartość to false.

Uwaga

Zmiana indeksu po wdrożeniu obejmuje ponowne kompilowanie i ponowne ładowanie danych.

Obiekt Index może opcjonalnie określić Suggesters właściwość, która definiuje pola w indeksie, które mają być używane do obsługi autouzupełniań lub zapytań sugestii wyszukiwania. Właściwość Suggesters powinna być ustawiona na tablicę Suggester obiektów definiujących pola używane do kompilowania wyników sugestii wyszukiwania.

Po utworzeniu Index obiektu indeks jest tworzony przez wywołanie Indexes.Create wystąpienia SearchServiceClient .

Uwaga

Podczas tworzenia indeksu na podstawie aplikacji, która musi być elastyczna, użyj Indexes.CreateAsync metody .

Aby uzyskać więcej informacji, zobacz Tworzenie indeksu usługi Azure Search przy użyciu zestawu .NET SDK.

Usuwanie indeksu usługi Azure Search

Indeks można usunąć, wywołując Indexes.Delete SearchServiceClient wystąpienie:

searchClient.Indexes.Delete(Constants.Index);

Przekazywanie danych do indeksu usługi Azure Search

Po zdefiniowaniu indeksu można przekazać do niego dane przy użyciu jednego z dwóch modeli:

  • Model ściągania — dane są okresowo pozyskiwane z usług Azure Cosmos DB, Azure SQL Database, Azure Blob Storage lub SQL Server hostowanych na maszynie wirtualnej platformy Azure.
  • Model wypychania — dane są programowo wysyłane do indeksu. Jest to model przyjęty w tym artykule.

Aby SearchIndexClient zaimportować dane do indeksu, należy utworzyć wystąpienie. Można to osiągnąć, wywołując metodę SearchServiceClient.Indexes.GetClient , jak pokazano w poniższym przykładzie kodu:

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

Dane do zaimportowania do indeksu są pakowane jako IndexBatch obiekt, który hermetyzuje kolekcję IndexAction obiektów. Każde IndexAction wystąpienie zawiera dokument i właściwość, która informuje usługę Azure Search, która akcja ma być wykonywana w dokumencie. W powyższym IndexAction.Upload przykładzie kodu jest określona akcja, która powoduje, że dokument jest wstawiany do indeksu, jeśli jest nowy, lub zastąpiony, jeśli już istnieje. Obiekt IndexBatch jest następnie wysyłany do indeksu przez wywołanie Documents.Index metody w SearchIndexClient obiekcie . Aby uzyskać informacje na temat innych akcji indeksowania, zobacz Wybieranie akcji indeksowania do użycia.

Uwaga

W jednym żądaniu indeksowania można uwzględnić tylko 1000 dokumentów.

Pamiętaj, monkeyList że w powyższym przykładzie kodu kolekcja jest tworzona jako obiekt anonimowy z kolekcji Monkey obiektów. Spowoduje to utworzenie danych dla id pola i rozpoznawanie mapowania nazw właściwości wielkości liter Monkey Pascal na nazwy pól indeksu wyszukiwania przypadków wielbłąda. Można również wykonać to mapowanie przez dodanie atrybutu [SerializePropertyNamesAsCamelCase] Monkey do klasy.

Aby uzyskać więcej informacji, zobacz Przekazywanie danych do usługi Azure Search przy użyciu zestawu .NET SDK.

Wykonywanie zapytań względem indeksu usługi Azure Search

Aby SearchIndexClient wykonywać zapytania dotyczące indeksu, należy utworzyć wystąpienie. Gdy aplikacja wykonuje zapytania, zaleca się przestrzeganie zasady najniższych uprawnień i bezpośrednie przekazanie SearchIndexClient klucza zapytania jako argumentu. Dzięki temu użytkownicy mają dostęp tylko do odczytu do indeksów i dokumentów. Takie podejście przedstawiono w poniższym przykładzie kodu:

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

Przeciążenie SearchIndexClient konstruktora przyjmuje nazwę usługi wyszukiwania, nazwę indeksu i SearchCredentials obiekt jako argumenty z obiektem SearchCredentials opakowującym klucz zapytania dla usługi Azure usługa wyszukiwania.

Zapytania wyszukiwania

Indeks można odpytować, wywołując metodę Documents.SearchAsync w wystąpieniu SearchIndexClient , jak pokazano w poniższym przykładzie kodu:

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

Metoda SearchAsync przyjmuje argument tekstowy wyszukiwania i opcjonalny SearchParameters obiekt, który może służyć do dalszego uściślenia zapytania. Kwerenda wyszukiwania jest określana jako argument tekstowy wyszukiwania, podczas gdy zapytanie filtru można określić przez ustawienie Filter właściwości argumentu SearchParameters . W poniższym przykładzie kodu przedstawiono oba typy zapytań:

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

To zapytanie filtru jest stosowane do całego indeksu i usuwa dokumenty z wyników, w których location pole nie jest równe Chinom i nie jest równe Wietnamowi. Po filtrowaniu zapytanie wyszukiwania jest wykonywane na wynikach zapytania filtru.

Uwaga

Aby filtrować bez wyszukiwania, przekaż * jako argument tekstowy wyszukiwania.

Metoda SearchAsync zwraca DocumentSearchResult obiekt zawierający wyniki zapytania. Ten obiekt jest wyliczany, a każdy Document obiekt jest tworzony jako Monkey obiekt i dodawany do obiektu do wyświetlania Monkeys ObservableCollection . Na poniższych zrzutach ekranu przedstawiono wyniki zapytania wyszukiwania zwrócone z usługi Azure Search:

Wyniki wyszukiwania

Aby uzyskać więcej informacji na temat wyszukiwania i filtrowania, zobacz Query your Azure Search index using the .NET SDK (Wykonywanie zapytań względem indeksu usługi Azure Search przy użyciu zestawu .NET SDK).

Zapytania sugestii

Usługa Azure Search umożliwia żądanie sugestii na podstawie zapytania wyszukiwania przez wywołanie Documents.SuggestAsync metody w wystąpieniu SearchIndexClient . Przedstawiono to w poniższym przykładzie kodu:

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

Metoda SuggestAsync przyjmuje argument tekstowy wyszukiwania, nazwę sugestora do użycia (zdefiniowanego w indeksie) oraz opcjonalny SuggestParameters obiekt, który może służyć do dalszego uściślenia zapytania. Wystąpienie SuggestParameters ustawia następujące właściwości:

  • UseFuzzyMatching — po ustawieniu wartości trueusługa Azure Search znajdzie sugestie, nawet jeśli w tekście wyszukiwania znajduje się znak zastępczy lub brak go.
  • HighlightPreTag — tag, który jest poprzedzany trafieniami sugestii.
  • HighlightPostTag — tag dołączany do trafień sugestii.
  • MinimumCoverage — reprezentuje procent indeksu, który musi być objęty zapytaniem sugestii, aby zapytanie zostało zgłoszone pomyślnie. Wartość domyślna to 80.
  • Top — liczba sugestii do pobrania. Musi być liczbą całkowitą z zakresu od 1 do 100 z wartością domyślną 5.

Ogólny efekt polega na tym, że 10 pierwszych wyników z indeksu zostanie zwróconych z wyróżnieniem trafień, a wyniki będą zawierać dokumenty, które zawierają podobnie napisane terminy wyszukiwania.

Metoda SuggestAsync zwraca DocumentSuggestResult obiekt zawierający wyniki zapytania. Ten obiekt jest wyliczany, a każdy Document obiekt jest tworzony jako Monkey obiekt i dodawany do obiektu do wyświetlania Monkeys ObservableCollection . Na poniższych zrzutach ekranu przedstawiono wyniki sugestii zwrócone z usługi Azure Search:

Wyniki sugestii

Należy pamiętać, że w przykładowej aplikacji metoda jest wywoływana tylko wtedy, SuggestAsync gdy użytkownik zakończy wprowadzanie terminu wyszukiwania. Można go jednak również użyć do obsługi autouzupełniania zapytań wyszukiwania przez wykonanie na każdej maszynie keypress.

Podsumowanie

W tym artykule pokazano, jak zintegrować usługę Azure Search z aplikacją Xamarin.Forms przy użyciu biblioteki microsoft Azure Search. Azure Search to usługa w chmurze, która zapewnia możliwości indeksowania i wykonywania zapytań dotyczących przekazanych danych. Spowoduje to usunięcie wymagań dotyczących infrastruktury i złożoności algorytmów wyszukiwania tradycyjnie związanych z implementacją funkcji wyszukiwania w aplikacji.