Hledání dat pomocí služby Azure Search a Xamarin.Forms

Azure Search je cloudová služba, která poskytuje funkce indexování a dotazování na nahraná data. Tím se odeberou požadavky na infrastrukturu a složitosti vyhledávacích algoritmů tradičně spojených s implementací funkcí vyhledávání v aplikaci. Tento článek ukazuje, jak pomocí knihovny Microsoft Azure Search integrovat Službu Azure Search do Xamarin.Forms aplikace.

Přehled

Data se ukládají ve službě Azure Search jako indexy a dokumenty. Index je úložiště dat, která je možné prohledávat v Azure Search, a je koncepčně podobná databázové tabulce. Dokument je jedna jednotka prohledávatelných dat v indexu a koncepčně se podobá řádku databáze. Při nahrávání dokumentů a odesílání vyhledávacích dotazů do služby Azure Search se požadavky provádějí na konkrétní index ve vyhledávací službě.

Každý požadavek provedený ve službě Azure Search musí obsahovat název služby a klíč rozhraní API. Existují dva typy klíče rozhraní API:

  • Správa klíče udělovat úplná práva všem operacím. To zahrnuje správu služby, vytváření a odstraňování indexů a zdrojů dat.
  • Klíče dotazů udělují přístup k indexům a dokumentům jen pro čtení a měly by je používat aplikace, které vydávají žádosti o vyhledávání.

Nejběžnějším požadavkem služby Azure Search je spuštění dotazu. Existují dva typy dotazů, které je možné odeslat:

Vyhledávací dotazy a filtrovací dotazy je možné použít samostatně nebo společně. Při společném použití se dotaz filtru použije nejprve na celý index a pak se vyhledávací dotaz provede s výsledky dotazu filtru.

Azure Search také podporuje načítání návrhů na základě vstupu hledání. Další informace najdete v tématu Dotazy pro návrhy.

Poznámka:

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.

Nastavení

Proces integrace služby Azure Search do Xamarin.Forms aplikace je následující:

  1. Vytvořte Search Azure. Další informace najdete v tématu Vytvoření Search Azure pomocí webu Azure Portal.
  2. Odeberte Silverlight jako cílovou architekturu Xamarin.Forms z knihovny přenosných tříd (PCL). Toho lze dosáhnout změnou profilu PCL na jakýkoli profil, který podporuje vývoj pro různé platformy, ale nepodporuje Silverlight, například profil 151 nebo profil 92.
  3. Přidejte balíček NuGet knihovny Microsoft Azure Search Library do projektu PCL v Xamarin.Forms řešení.

Po provedení těchto kroků je možné rozhraní API knihovny Microsoft Search Library použít ke správě indexů vyhledávání a zdrojů dat, nahrávání a správě dokumentů a spouštění dotazů.

Vytvoření indexu Služby Azure Search

Musí být definováno schéma indexu, které se mapuje na strukturu dat, která se mají prohledávat. Toho lze dosáhnout na webu Azure Portal nebo programově pomocí SearchServiceClient třídy. Tato třída spravuje připojení ke službě Azure Search a dá se použít k vytvoření indexu. Následující příklad kódu ukazuje, jak vytvořit instanci této třídy:

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

Přetížení SearchServiceClient konstruktoru přebírá název vyhledávací služby a SearchCredentials objekt jako argumenty s objektem SearchCredentials zabaleným klíčem správce pro Azure Search. Klíč správce je nutný k vytvoření indexu.

Poznámka:

Jedna SearchServiceClient instance by se měla použít v aplikaci, aby se zabránilo otevření příliš velkého počtu připojení ke službě Azure Search.

Index je definován objektem Index , jak je znázorněno v následujícím příkladu kódu:

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

Vlastnost Index.Name by měla být nastavena na název indexu a Index.Fields vlastnost by měla být nastavena na pole Field objektů. Každá Field instance určuje název, typ a všechny vlastnosti, které určují způsob použití pole. Mezi tyto vlastnosti patří:

  • IsKey – označuje, zda je pole klíčem indexu. Jako pole klíče musí být označeno pouze jedno pole v indexu typu DataType.String.
  • IsFacetable – označuje, zda je možné provést fasetovou navigaci v tomto poli. Výchozí hodnota je false.
  • IsFilterable – označuje, jestli se pole dá použít v dotazech filtru. Výchozí hodnota je false.
  • IsRetrievable – označuje, zda je možné pole načíst ve výsledcích hledání. Výchozí hodnota je true.
  • IsSearchable – označuje, zda je pole zahrnuto v fulltextových vyhledáváních. Výchozí hodnota je false.
  • IsSortable – označuje, zda lze pole použít ve OrderBy výrazech. Výchozí hodnota je false.

Poznámka:

Změna indexu po nasazení zahrnuje opětovné sestavení a opětovné načtení dat.

Objekt Index může volitelně zadat Suggesters vlastnost, která definuje pole v indexu, která se mají použít k podpoře automatického dokončování nebo dotazů návrhů hledání. Vlastnost Suggesters by měla být nastavena na pole Suggester objektů, které definují pole, která se používají k sestavení výsledků návrhů hledání.

Po vytvoření objektu Index se index vytvoří voláním Indexes.Create instance SearchServiceClient .

Poznámka:

Při vytváření indexu z aplikace, která musí být responzivní, použijte metodu Indexes.CreateAsync .

Další informace najdete v tématu Vytvoření indexu Služby Azure Search pomocí sady .NET SDK.

Odstranění indexu Služby Azure Search

Index lze odstranit voláním Indexes.Delete instance SearchServiceClient :

searchClient.Indexes.Delete(Constants.Index);

Nahrání dat do indexu Služby Azure Search

Po definování indexu je možné do něj nahrát data pomocí jednoho ze dvou modelů:

  • Model vyžádání obsahu – data se pravidelně ingestují ze služby Azure Cosmos DB, Azure SQL Database, Azure Blob Storage nebo SQL Serveru hostovaného na virtuálním počítači Azure.
  • Model nabízených oznámení – data se do indexu odesílají prostřednictvím kódu programu. Toto je model přijatý v tomto článku.

Aby SearchIndexClient bylo možné importovat data do indexu, musí se vytvořit instance. Toho lze dosáhnout voláním SearchServiceClient.Indexes.GetClient metody, jak je znázorněno v následujícím příkladu kódu:

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

Data, která se mají importovat do indexu, jsou zabalena jako IndexBatch objekt, který zapouzdřuje kolekci IndexAction objektů. Každá IndexAction instance obsahuje dokument a vlastnost, která službě Azure Search říká, která akce se má v dokumentu provést. V příkladu kódu výše IndexAction.Upload je zadána akce, která vede k tomu, že dokument je vložen do indexu, pokud je nový, nebo nahrazen, pokud již existuje. Objekt IndexBatch se pak odešle do indexu voláním Documents.Index metody na objektu SearchIndexClient . Informace o dalších akcích indexování naleznete v tématu Rozhodnutí o akci indexování, která se má použít.

Poznámka:

Do jedné žádosti o indexování je možné zahrnout pouze 1000 dokumentů.

Všimněte si, monkeyList že v příkladu kódu výše se kolekce vytvoří jako anonymní objekt z kolekce Monkey objektů. Tím se vytvoří data pro id dané pole a přeloží se mapování názvů vlastností případu Monkey Pascal na názvy polí indexu vyhledávání velkých a malých písmen. Toto mapování lze také provést přidáním atributu [SerializePropertyNamesAsCamelCase]Monkey do třídy.

Další informace najdete v tématu Nahrání dat do služby Azure Search pomocí sady .NET SDK.

Dotazování indexu Služby Azure Search

Pro SearchIndexClient dotazování indexu musí být vytvořena instance. Když aplikace spouští dotazy, doporučuje se postupovat podle principu nejnižších oprávnění a vytvořit SearchIndexClient přímo a předat klíč dotazu jako argument. Tím zajistíte, že uživatelé budou mít přístup jen pro čtení k indexům a dokumentům. Tento přístup je ukázaný v následujícím příkladu kódu:

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

Přetížení SearchIndexClient konstruktoru přebírá název vyhledávací služby, název indexu SearchCredentials a objekt jako argumenty, přičemž SearchCredentials objekt obtéká klíč dotazu pro Azure Search.

Vyhledávací dotazy

Index lze dotazovat voláním Documents.SearchAsync metody v SearchIndexClient instanci, jak je znázorněno v následujícím příkladu kódu:

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 vezme hledaný textový argument a volitelný SearchParameters objekt, který lze použít k dalšímu upřesnění dotazu. Vyhledávací dotaz je zadán jako argument pro hledaný text, zatímco dotaz filtru lze zadat nastavením Filter vlastnosti argumentu SearchParameters . Následující příklad kódu ukazuje oba typy dotazů:

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

Tento dotaz filtru se použije na celý index a odebere dokumenty z výsledků, kde location se pole nerovná Číně a nerovná se Vietnamu. Po filtrování se vyhledávací dotaz provede s výsledky dotazu filtru.

Poznámka:

Pokud chcete filtrovat bez hledání, předejte * ho jako argument pro hledaný text.

Metoda SearchAsync vrátí DocumentSearchResult objekt, který obsahuje výsledky dotazu. Tento objekt je uveden, přičemž každý Document objekt je vytvořen jako Monkey objekt a přidán do MonkeysObservableCollection zobrazení. Následující snímky obrazovky ukazují výsledky vyhledávacího dotazu vrácené službou Azure Search:

Výsledky hledání

Další informace o vyhledávání a filtrování najdete v tématu Dotazování indexu Služby Azure Search pomocí sady .NET SDK.

Návrhy dotazů

Azure Search umožňuje požadovat návrhy na základě vyhledávacího dotazu voláním Documents.SuggestAsync metody v SearchIndexClient instanci. To je znázorněno v následujícím příkladu kódu:

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 přebírá hledaný textový argument, název sugestivu, který se má použít (který je definován v indexu) a volitelný SuggestParameters objekt, který lze použít k dalšímu upřesnění dotazu. Instance SuggestParameters nastaví následující vlastnosti:

  • UseFuzzyMatching – pokud je tato možnost nastavená na true, Azure Search najde návrhy, i když je ve hledaném textu nahrazený nebo chybějící znak.
  • HighlightPreTag – značka, která je předchycena na návrhy.
  • HighlightPostTag – značka, která je připojena k přístupům návrhů.
  • MinimumCoverage – představuje procento indexu, které musí být pokryto návrhovým dotazem, aby dotaz ohlásil úspěch. Výchozí hodnota je 80.
  • Top – počet návrhů k načtení. Musí to být celé číslo od 1 do 100 s výchozí hodnotou 5.

Celkový efekt spočívá v tom, že prvních 10 výsledků z indexu se vrátí se zvýrazněním hitů a výsledky budou obsahovat dokumenty, které obsahují podobně napsané hledané termíny.

Metoda SuggestAsync vrátí DocumentSuggestResult objekt, který obsahuje výsledky dotazu. Tento objekt je uveden, přičemž každý Document objekt je vytvořen jako Monkey objekt a přidán do MonkeysObservableCollection zobrazení. Následující snímky obrazovky ukazují výsledky návrhu vrácené službou Azure Search:

Výsledky návrhů

Všimněte si, že v ukázkové aplikaci se metoda vyvolá pouze v případě, SuggestAsync že uživatel dokončí zadávání hledaného termínu. Dá se ale také použít k podpoře automatického dokončování vyhledávacích dotazů spuštěním na jednotlivých stiskech klíčů.

Shrnutí

Tento článek ukazuje, jak pomocí knihovny Microsoft Azure Search integrovat Službu Azure Search do Xamarin.Forms aplikace. Azure Search je cloudová služba, která poskytuje funkce indexování a dotazování na nahraná data. Tím se odeberou požadavky na infrastrukturu a složitosti vyhledávacích algoritmů tradičně spojených s implementací funkcí vyhledávání v aplikaci.