Vyhledat data pomocí Azure Search a Xamarin.Forms

Ukázka stažení Stažení ukázky

Azure Search je cloudová služba, která poskytuje možnosti indexování a dotazování pro nahraná data. Tím se odstraní požadavky na infrastrukturu a složitosti algoritmu hledání, které jsou tradičně spojené s implementací funkce vyhledávání v aplikaci. tento článek ukazuje, jak pomocí knihovny hledání Microsoft Azure integrovat Azure Search do Xamarin.Forms aplikace.

Přehled

Data jsou uložena v Azure Search jako indexy a dokumenty. Index je úložiště dat, která může služba Azure Search vyhledat, a je koncepčně podobná databázové tabulce. Dokument je jediná jednotka prohledávatelných dat v indexu a je koncepčně podobná databázovému řádku. Při odesílání dokumentů a odesílání vyhledávacích dotazů do Azure Search se v rámci vyhledávací služby provedou požadavky na konkrétní index.

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

  • Klíče správce udělují všem operacím úplná práva. To zahrnuje správu služby, vytváření a odstraňování indexů a zdrojů dat.
  • Klíče dotazů udělují přístup jen pro čtení k indexům a dokumentům a měly by být používány aplikacemi, které vydávají požadavky na hledání.

Nejběžnějším požadavkem na Azure Search je spustit dotaz. Existují dva typy dotazů, které lze odeslat:

Vyhledávací dotazy a dotazy filtru lze použít samostatně nebo společně. Při použití společně se dotaz filtru použije jako první pro celý index a pak se vyhledávací dotaz provede na základě výsledků dotazu filtru.

Azure Search také podporuje načítání návrhů na základě vyhledávaného vstupu. Další informace najdete v tématu návrhy dotazů.

Poznámka

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

Nastavení

Postup pro integraci Azure Search do Xamarin.Forms aplikace je následující:

  1. Vytvořte službu Azure Search. Další informace najdete v tématu vytvoření Azure Search služby pomocí webu Azure Portal.
  2. Odeberte program Silverlight jako cílovou architekturu z Xamarin.Forms řešení přenositelné knihovny tříd (PCL). To se dá udělat tak, že změníte profil PCL na libovolný profil, který podporuje vývoj pro různé platformy, ale nepodporuje Silverlight, jako je třeba profil 151 nebo profil 92.
  3. přidejte balíček Microsoft Azure NuGet knihovny hledání do projektu PCL v řešení.

po provedení těchto kroků lze rozhraní API knihovny Microsoft Search použít ke správě vyhledávacích indexů a zdrojů dat, odesílání a správě dokumentů a provádění dotazů.

Vytvoření indexu Azure Search

Schéma indexu musí být definováno, které je mapováno na strukturu dat, která mají být prohledána. To lze provést na webu Azure Portal nebo programově pomocí SearchServiceClient třídy. Tato třída spravuje připojení k Azure Search a lze ji 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));

SearchServiceClientPřetížení konstruktoru převezme název vyhledávací služby a SearchCredentials objektu jako argumenty s SearchCredentials objektem, který zabalí SearchServiceClient pro službu Azure Search. K vytvoření indexu je nutný klíč správce .

Poznámka

SearchServiceClientV aplikaci by se měla použít jediná instance, aby se zabránilo otevření příliš velkého počtu připojení k Azure Search.

Index je definován Index objektem, 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);
}

Index.NameVlastnost 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í, jak se pole používá. Mezi tyto vlastnosti patří:

  • IsKey – Určuje, zda je pole klíčem indexu. Pouze jedno pole v indexu typu DataType.String musí být určeno jako klíčové pole.
  • IsFacetable – Určuje, zda je možné v tomto poli provést omezující navigaci. Výchozí hodnota je false.
  • IsFilterable – Určuje, zda může být pole použito v dotazech filtru. Výchozí hodnota je false.
  • IsRetrievable – Určuje, zda lze pole načíst ve výsledcích hledání. Výchozí hodnota je true.
  • IsSearchable – Určuje, zda je pole součástí fulltextového vyhledávání. Výchozí hodnota je false.
  • IsSortable – Určuje, zda lze pole použít ve OrderBy výrazech. Výchozí hodnota je false.

Poznámka

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

IndexObjekt 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 hledání dotazů na návrhy. SuggestersVlastnost by měla být nastavena na pole Suggester objektů, které definují pole, která se používají k sestavení výsledků návrhu hledání.

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

Poznámka

Při vytváření indexu z aplikace, která musí být udržována s odezvou, použijte Indexes.CreateAsync metodu.

Další informace najdete v tématu vytvoření indexu Azure Search pomocí sady .NET SDK.

Odstraňuje se index Azure Search.

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

searchClient.Indexes.Delete(Constants.Index);

Nahrávání dat do indexu Azure Search

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

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

SearchIndexClientAby bylo možné importovat data do indexu, musí být vytvořena instance. To lze provést 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á mají být importována do indexu, jsou zabalena jako IndexBatch objekt, který zapouzdřuje kolekci IndexAction objektů. Každá IndexAction instance obsahuje dokument a vlastnost, která oznamuje Azure Search, jakou akci chcete provést v dokumentu. Ve výše uvedeném příkladu kódu IndexAction.Upload je akce zadána, což vede k tomu, že je dokument vložen do indexu, pokud je nový, nebo nahrazen, pokud již existuje. IndexBatchObjekt se pak pošle do indexu voláním Documents.Index metody SearchIndexClient objektu. Informace o dalších akcích indexování najdete v tématu určení akce indexování, která se má použít.

Poznámka

Pouze 1000 dokumentů lze zahrnout do jedné žádosti o indexování.

Všimněte si, že ve výše uvedeném příkladu kódu monkeyList je kolekce vytvořena jako anonymní objekt z kolekce Monkey objektů. Tím se vytvoří data pro id pole a přeloží se mapování Monkey názvů vlastností Case na ve stylu CamelCase na názvy polí indexu hledání případu. Případně lze toto mapování provést také přidáním [SerializePropertyNamesAsCamelCase] atributu do Monkey třídy.

další informace najdete v tématu Upload dat pro Azure Search pomocí sady .net SDK.

Dotazování indexu Azure Search

SearchIndexClientPro dotazování indexu musí být vytvořena instance. Když aplikace provede dotazy, je vhodné postupovat podle principu minimálního oprávnění a vytvořit SearchIndexClient přímo a předat SearchIndexClient jako argument. Tím zajistíte, že uživatelé budou mít k indexům a dokumentům přístup jen pro čtení. Tento přístup je znázorněn v následujícím příkladu kódu:

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

SearchIndexClientPřetížení konstruktoru převezme název vyhledávací služby, název indexu a SearchCredentials objekt jako argumenty s SearchCredentials objektem, který zabalí SearchIndexClient pro službu Azure Search.

Vyhledávací dotazy

Index lze dotazovat voláním Documents.SearchAsync metody na 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
    });
  }
}

SearchAsyncMetoda přebírá argument text hledání a nepovinný SearchParameters objekt, který lze použít k dalšímu upřesnění dotazu. Vyhledávací dotaz je zadán jako argument text hledání, zatímco dotaz filtru lze zadat nastavením Filter vlastnosti SearchParameters argumentu. 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 je použit pro celý index a odebere dokumenty z výsledků, kde pole není location rovno Číně a není rovno Vietnam. Po filtrování se vyhledávací dotaz provádí u výsledků dotazu filtru.

Poznámka

Chcete-li filtrovat bez vyhledávání, předejte * jako argument text hledání.

SearchAsyncMetoda vrátí DocumentSearchResult objekt, který obsahuje výsledky dotazu. Tento objekt je vyhodnocen s každým objektem, který je Document vytvářen jako Monkey objekt a přidán do MonkeysObservableCollection pro zobrazení. Následující snímky obrazovky zobrazují výsledky vyhledávacího dotazu vrácené z Azure Search:

Výsledky hledání

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

Dotazy k návrhu

Azure Search umožňuje vyžádání návrhů na základě vyhledávacího dotazu zavoláním Documents.SuggestAsync metody na 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
    });
  }
}

SuggestAsyncMetoda přebírá textový argument hledání, název přidaného doplňku (který je definován v indexu) a volitelný SuggestParameters objekt, který lze použít k dalšímu upřesnění dotazu. SuggestParametersInstance nastaví následující vlastnosti:

  • UseFuzzyMatching – Když je nastavená na true , Azure Search najde návrhy i v případě, že v hledaném textu je nahrazený nebo chybějící znak.
  • HighlightPreTag – Značka, která je předřazena k návrhu.
  • HighlightPostTag – Značka, která je připojená k návrhovým výsledkům.
  • MinimumCoverage – představuje procento indexu, který musí být pokryt dotazem návrhu pro dotaz, který má být hlášen jako úspěšný. Výchozí hodnota je 80.
  • Top – počet návrhů, které se mají načíst. Musí to být celé číslo v rozmezí od 1 do 100, přičemž výchozí hodnota je 5.

Celkovým účinkem je, že prvních 10 výsledků z indexu bude vráceno se zvýrazněním přístupů a výsledky budou zahrnovat dokumenty, které obsahují podobně hledané hledané výrazy.

SuggestAsyncMetoda vrátí DocumentSuggestResult objekt, který obsahuje výsledky dotazu. Tento objekt je vyhodnocen s každým objektem, který je Document vytvářen jako Monkey objekt a přidán do MonkeysObservableCollection pro zobrazení. Následující snímky obrazovky ukazují výsledky návrhů vrácené z Azure Search:

Výsledky návrhu

Všimněte si, že v ukázkové aplikaci SuggestAsync je metoda volána pouze v případě, že uživatel dokončí hledání hledaného termínu. Dá se ale použít taky k podpoře automatického dokončování vyhledávacích dotazů, a to tak, že se spustí při každém stisknutí.

Souhrn

tento článek ukazuje, jak pomocí knihovny hledání Microsoft Azure integrovat Azure Search do Xamarin.Forms aplikace. Azure Search je cloudová služba, která poskytuje možnosti indexování a dotazování pro nahraná data. Tím se odstraní požadavky na infrastrukturu a složitosti algoritmu hledání, které jsou tradičně spojené s implementací funkce vyhledávání v aplikaci.