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:
- Klíče správce uděluje ú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í dotaz vyhledá jednu nebo více položek ve všech prohledávatelných polích v indexu. Vyhledávací dotazy se vytvářejí pomocí zjednodušené syntaxe nebo syntaxe dotazů Lucene. Další informace najdete v tématu Jednoduchá syntaxe dotazů ve službě Azure Search a Syntaxe dotazů Lucene ve službě Azure Search.
- Dotaz filtru vyhodnotí logický výraz pro všechna filtrovatelná pole v indexu. Dotazy filtru se sestavují pomocí podmnožina jazyka filtru OData. Další informace najdete v tématu Syntaxe výrazů OData pro Azure Search.
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í:
- Vytvořte Search Azure. Další informace najdete v tématu Vytvoření Search Azure pomocí webu Azure Portal.
- 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.
- 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 typuDataType.String
.IsFacetable
– označuje, zda je možné provést fasetovou navigaci v tomto poli. Výchozí hodnota jefalse
.IsFilterable
– označuje, jestli se pole dá použít v dotazech filtru. Výchozí hodnota jefalse
.IsRetrievable
– označuje, zda je možné pole načíst ve výsledcích hledání. Výchozí hodnota jetrue
.IsSearchable
– označuje, zda je pole zahrnuto v fulltextových vyhledáváních. Výchozí hodnota jefalse
.IsSortable
– označuje, zda lze pole použít veOrderBy
výrazech. Výchozí hodnota jefalse
.
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 Monkeys
ObservableCollection
zobrazení. Následující snímky obrazovky ukazují výsledky vyhledávacího dotazu vrácené službou Azure Search:
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á natrue
, 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 Monkeys
ObservableCollection
zobrazení. Následující snímky obrazovky ukazují výsledky návrhu vrácené službou Azure Search:
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.