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ć:
- Zapytanie wyszukiwania wyszukuje co najmniej jeden element we wszystkich polach z możliwością wyszukiwania w indeksie. Zapytania wyszukiwania są tworzone przy użyciu uproszczonej składni lub składni zapytania Lucene. Aby uzyskać więcej informacji, zobacz Proste składnie zapytań w usłudze Azure Search i Składnia zapytań Lucene w usłudze Azure Search.
- Zapytanie filtru ocenia wyrażenie logiczne dla wszystkich pól możliwych do filtrowania w indeksie. Zapytania filtrów są tworzone przy użyciu podzestawu języka filtru OData. Aby uzyskać więcej informacji, zobacz Składnia wyrażeń OData dla usługi Azure Search.
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:
- Tworzenie usługa wyszukiwania platformy Azure. Aby uzyskać więcej informacji, zobacz Tworzenie usługa wyszukiwania Azure przy użyciu witryny Azure Portal.
- 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.
- 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 typuDataType.String
musi być oznaczone jako pole klucza.IsFacetable
— wskazuje, czy można przeprowadzić nawigację aspektowa w tym polu. Domyślna wartość tofalse
.IsFilterable
— wskazuje, czy pole może być używane w zapytaniach filtrów. Domyślna wartość tofalse
.IsRetrievable
— wskazuje, czy pole można pobrać w wynikach wyszukiwania. Domyślna wartość totrue
.IsSearchable
— wskazuje, czy pole jest uwzględniane w wyszukiwaniu pełnotekstowym. Domyślna wartość tofalse
.IsSortable
— wskazuje, czy pole może być używane w wyrażeniachOrderBy
. Domyślna wartość tofalse
.
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:
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ścitrue
usł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:
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.