Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Uwaga
Wyszukiwanie AI platformy Azure jest dostępna za pośrednictwem portalu Azure, interfejsów API REST i Azure SDKs. Jest także podstawą Foundry IQ — zarządzanej warstwy wiedzy, która przekształca treści przedsiębiorstwa w bazy wiedzy wielokrotnego użytku z uwzględnieniem uprawnień dla agentów w portalu Microsoft Foundry.
W tym artykule wyjaśniono, jak tworzyć obiekty wyszukiwania i zarządzać nimi przy użyciu języka C# i Azure. Biblioteka klienta Search.Documents w Azure SDK dla .NET.
Tej biblioteki można używać na potrzeby operacji płaszczyzny danych, w tym:
- Tworzenie indeksów wyszukiwania, źródeł danych, indeksatorów, zestawów umiejętności i map synonimów i zarządzanie nimi
- Ładowanie dokumentów wyszukiwania i zarządzanie nimi w indeksie
- Wykonywanie zapytań bez konieczności obsługi szczegółów protokołu HTTP i JSON
- Wywoływanie i zarządzanie wzbogacaniem sztucznej inteligencji (zestawami umiejętności) i danymi wyjściowymi
Biblioteka jest dystrybuowana jako pojedynczy pakiet NuGet, który zawiera wszystkie interfejsy API używane do programowego dostępu do usługi wyszukiwania.
Biblioteka kliencka definiuje klasy takie jak SearchIndex, SearchField i SearchDocument, a także operacje takie jak SearchIndexClient.CreateIndex i SearchClient.Search na klasach SearchIndexClient i SearchClient. Te klasy są podzielone na następujące przestrzenie nazw:
Azure.Search.DocumentsAzure.Search.Documents.IndexesAzure.Search.Documents.Indexes.ModelsAzure.Search.Documents.Models
Biblioteka kliencka Azure.Search.Documents nie udostępnia operacji zarządzania usługą, takich jak tworzenie i skalowanie usług wyszukiwania oraz zarządzanie kluczami interfejsu API. Jeśli chcesz zarządzać zasobami wyszukiwania w aplikacji .NET, użyj biblioteki Azure.ResourceManager.Search z zestawu Azure SDK dla platformy .NET.
Wymagania dotyczące zestawu SDK
Program Visual Studio 2019 lub nowszy.
Pobierz pakiet NuGet package, używając w programie Visual Studio pozycji Narzędzia>Menedżer pakietów NuGet>Zarządzaj pakietami NuGet dla rozwiązania. Wyszukaj nazwę
Azure.Search.Documentspakietu .
Zestaw Azure SDK dla platformy .NET jest zgodny z platformą .NET Standard 2.0.
Przykładowa aplikacja
W tym artykule pokazano na przykładzie przykład kodu DotNetHowTo w usłudze GitHub w celu zilustrowania podstawowych pojęć w usłudze Wyszukiwanie AI platformy Azure oraz tworzenia, ładowania i wykonywania zapytań względem indeksu wyszukiwania.
W pozostałej części tego artykułu przyjmij nowy indeks o nazwie hotels wypełniony kilkoma dokumentami z kilkoma zapytaniami zgodnymi z wynikami.
W poniższym przykładzie przedstawiono główny program z ogólnym przepływem:
// This sample shows how to delete, create, upload documents and query an index
static void Main(string[] args)
{
IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
IConfigurationRoot configuration = builder.Build();
SearchIndexClient indexClient = CreateSearchIndexClient(configuration);
string indexName = configuration["SearchIndexName"];
Console.WriteLine("{0}", "Deleting index...\n");
DeleteIndexIfExists(indexName, indexClient);
Console.WriteLine("{0}", "Creating index...\n");
CreateIndex(indexName, indexClient);
SearchClient searchClient = indexClient.GetSearchClient(indexName);
Console.WriteLine("{0}", "Uploading documents...\n");
UploadDocuments(searchClient);
SearchClient indexClientForQueries = CreateSearchClientForQueries(indexName, configuration);
Console.WriteLine("{0}", "Run queries...\n");
RunQueries(indexClientForQueries);
Console.WriteLine("{0}", "Complete. Press any key to end application...\n");
Console.ReadKey();
}
Następnie znajduje się częściowy zrzut ekranu danych wyjściowych, przy założeniu, że ta aplikacja jest uruchamiana z prawidłową nazwą usługi i kluczami interfejsu API:
Typy klientów
Biblioteka klienta używa trzech typów klientów dla różnych operacji: SearchIndexClient do tworzenia, aktualizowania lub usuwania indeksów, SearchClient ładowania lub wykonywania zapytań względem indeksu oraz SearchIndexerClient pracy z indeksatorami i zestawami umiejętności. Ten artykuł koncentruje się na dwóch pierwszych.
Co najmniej wszyscy klienci wymagają nazwy usługi lub punktu końcowego oraz klucza interfejsu API. Te informacje są często podane w pliku konfiguracji, podobnie jak w pliku appsettings.json przykładowej aplikacji DotNetHowTo. Aby odczytać dane z pliku konfiguracji, dodaj do programu using Microsoft.Extensions.Configuration;.
Poniższa instrukcja tworzy klienta indeksu używanego do tworzenia, aktualizowania lub usuwania indeksów. Przyjmuje punkt końcowy usługi i klucz interfejsu API administratora.
private static SearchIndexClient CreateSearchIndexClient(IConfigurationRoot configuration)
{
string searchServiceEndPoint = configuration["YourSearchServiceEndPoint"];
string adminApiKey = configuration["YourSearchServiceAdminApiKey"];
SearchIndexClient indexClient = new SearchIndexClient(new Uri(searchServiceEndPoint), new AzureKeyCredential(adminApiKey));
return indexClient;
}
Następna instrukcja tworzy klienta wyszukiwania używanego do ładowania dokumentów lub uruchamiania zapytań.
SearchClient wymaga indeksu. Potrzebujesz klucza interfejsu API administratora do załadowania dokumentów, ale możesz użyć klucza interfejsu API zapytania do uruchamiania zapytań.
string indexName = configuration["SearchIndexName"];
private static SearchClient CreateSearchClientForQueries(string indexName, IConfigurationRoot configuration)
{
string searchServiceEndPoint = configuration["YourSearchServiceEndPoint"];
string queryApiKey = configuration["YourSearchServiceQueryApiKey"];
SearchClient searchClient = new SearchClient(new Uri(searchServiceEndPoint), indexName, new AzureKeyCredential(queryApiKey));
return searchClient;
}
Uwaga
Jeśli podasz nieprawidłowy klucz dla operacji importowania (na przykład klucz zapytania, w którym był wymagany klucz administracyjny), SearchClient zgłasza CloudException błąd z komunikatem o błędzie Zabronione przy pierwszym wywołaniu metody operacji. Jeśli tak się stanie, sprawdź dwukrotnie klucz interfejsu API.
Usuwanie indeksu
We wczesnych etapach programowania warto dołączyć instrukcję DeleteIndex , aby usunąć indeks pracy w toku, aby można było go odtworzyć przy użyciu zaktualizowanej definicji. Przykładowy kod usługi Wyszukiwanie AI platformy Azure często zawiera krok usuwania, aby można było ponownie uruchomić przykład.
Poniższa linia wywołuje DeleteIndexIfExists:
Console.WriteLine("{0}", "Deleting index...\n");
DeleteIndexIfExists(indexName, indexClient);
Ta metoda używa podanego SearchIndexClient, aby sprawdzić, czy indeks istnieje, a jeśli tak — usunąć go:
private static void DeleteIndexIfExists(string indexName, SearchIndexClient indexClient)
{
try
{
if (indexClient.GetIndex(indexName) != null)
{
indexClient.DeleteIndex(indexName);
}
}
catch (RequestFailedException e) when (e.Status == 404)
{
// Throw an exception if the index name isn't found
Console.WriteLine("The index doesn't exist. No deletion occurred.");
Uwaga
Przykładowy kod w tym artykule używa metod synchronicznych dla uproszczenia, ale należy użyć metod asynchronicznych we własnych aplikacjach, aby zapewnić ich skalowalność i elastyczność. Na przykład w poprzedniej metodzie można użyć DeleteIndexAsync zamiast DeleteIndex.
Tworzenie indeksu
Możesz użyć SearchIndexClient polecenia , aby utworzyć indeks.
Poniższa metoda tworzy nowy SearchIndex obiekt z listą SearchField obiektów, które definiują schemat nowego indeksu. Każde pole ma nazwę, typ danych i kilka atrybutów, które definiują jego zachowanie wyszukiwania.
Pola można zdefiniować na podstawie klasy modelu przy użyciu polecenia FieldBuilder. Klasa FieldBuilder używa odbicia, aby utworzyć listę SearchField obiektów dla indeksu, sprawdzając właściwości publiczne i atrybuty danej Hotel klasy modelu. Przyjrzymy się bliżej klasie Hotel później.
private static void CreateIndex(string indexName, SearchIndexClient indexClient)
{
FieldBuilder fieldBuilder = new FieldBuilder();
var searchFields = fieldBuilder.Build(typeof(Hotel));
var definition = new SearchIndex(indexName, searchFields);
indexClient.CreateOrUpdateIndex(definition);
}
Oprócz pól można również dodać profile oceniania, sugestory lub opcje CORS do indeksu (te parametry zostaną pominięte w przykładzie w celu zwięzłości). Więcej informacji o SearchIndex obiekcie i jego składnikach można znaleźć na liście właściwości SearchIndex, a także w dokumentacji interfejsu API REST.
Uwaga
W razie potrzeby zawsze można utworzyć listę obiektów Field bezpośrednio, zamiast używać FieldBuilder. Na przykład możesz nie chcieć użyć klasy modelu lub użyć istniejącej klasy modelu, której nie chcesz modyfikować, dodając atrybuty.
Wywołaj metodę CreateIndex w pliku Main()
Main tworzy nowy indeks hoteli , wywołując poprzednią metodę:
Console.WriteLine("{0}", "Creating index...\n");
CreateIndex(indexName, indexClient);
Używanie klasy modelu na potrzeby reprezentacji danych
Przykład DotNetHowTo używa klas modelu dla struktur danych Hotel, Address i Room .
Hotel
Addressodwołuje się do typu złożonego pojedynczego poziomu (pola wieloczęściowego) i Room (kolekcji pól wieloczęściowych).
Za pomocą tych typów można utworzyć i załadować indeks oraz utworzyć strukturę odpowiedzi z zapytania:
// Use-case: <Hotel> in a field definition
FieldBuilder fieldBuilder = new FieldBuilder();
var searchFields = fieldBuilder.Build(typeof(Hotel));
// Use-case: <Hotel> in a response
private static void WriteDocuments(SearchResults<Hotel> searchResults)
{
foreach (SearchResult<Hotel> result in searchResults.GetResults())
{
Console.WriteLine(result.Document);
}
Console.WriteLine();
}
Alternatywną metodą jest bezpośrednie dodawanie pól do indeksu. Poniższy przykład przedstawia tylko kilka pól.
SearchIndex index = new SearchIndex(indexName)
{
Fields =
{
new SimpleField("hotelId", SearchFieldDataType.String) { IsKey = true, IsFilterable = true, IsSortable = true },
new SearchableField("hotelName") { IsFilterable = true, IsSortable = true },
new SearchableField("hotelCategory") { IsFilterable = true, IsSortable = true },
new SimpleField("baseRate", SearchFieldDataType.Int32) { IsFilterable = true, IsSortable = true },
new SimpleField("lastRenovationDate", SearchFieldDataType.DateTimeOffset) { IsFilterable = true, IsSortable = true }
}
};
Definicje pola
Model danych na platformie .NET i odpowiadający mu schemat indeksu powinien obsługiwać środowisko wyszukiwania, które chcesz przekazać użytkownikowi końcowemu. Każdy obiekt najwyższego poziomu na platformie .NET, taki jak dokument wyszukiwania w indeksie wyszukiwania, odpowiada wynikowi wyszukiwania przedstawionemu w interfejsie użytkownika. Na przykład w aplikacji wyszukiwania w hotelu użytkownicy końcowi mogą wyszukiwać według nazwy hotelu, funkcji hotelu lub cech określonego pokoju.
W każdej klasie pole jest definiowane za pomocą typu danych i atrybutów określających sposób jego użycia. Nazwa każdej właściwości publicznej w każdej klasie odpowiada polu o tej samej nazwie w definicji indeksu.
Zapoznaj się z poniższym fragmentem kodu, który ściąga kilka definicji pól z klasy Hotel.
Address i Rooms są typami języka C# z własnymi definicjami klas (zapoznaj się z przykładowym kodem, jeśli chcesz je wyświetlić). Oba są typami złożonymi. Aby uzyskać więcej informacji, zobacz How to model complex types (Jak modelować złożone typy).
public partial class Hotel
{
[SimpleField(IsKey = true, IsFilterable = true)]
public string HotelId { get; set; }
[SearchableField(IsSortable = true)]
public string HotelName { get; set; }
[SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnLucene)]
public string Description { get; set; }
[SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public string Category { get; set; }
[JsonIgnore]
public bool? SmokingAllowed => (Rooms != null) ? Array.Exists(Rooms, element => element.SmokingAllowed == true) : (bool?)null;
[SearchableField]
public Address Address { get; set; }
public Room[] Rooms { get; set; }
Wybieranie klasy pola
Podczas definiowania pól można użyć klasy bazowej SearchField lub użyć modeli pomocników pochodnych, które służą jako szablony ze wstępnie skonfigurowanymi właściwościami.
Dokładnie jedno pole w indeksie musi służyć jako klucz dokumentu (IsKey = true). Musi być ciągiem i musi jednoznacznie identyfikować każdy dokument. Wymagane jest również użycie IsHidden = true, co oznacza, że nie będzie ono widoczne w wynikach wyszukiwania.
| Typ pola | Opis i użycie |
|---|---|
SearchField |
Klasa bazowa, w której większość właściwości ma wartość null, przy czym Name jest wymagane, a AnalyzerName domyślnie ma wartość standardowego Lucene. |
SimpleField |
Model pomocnika. Może być dowolnym typem danych, zawsze nie można wyszukiwać (jest ignorowany w przypadku zapytań wyszukiwania pełnotekstowego) i jest pobierany (nie jest ukryty). Inne atrybuty są domyślnie wyłączone, ale można je włączyć. Możesz użyć elementu SimpleField do identyfikatorów dokumentów lub pól używanych tylko w filtrach, fasetach lub profilach punktacji. Jeśli tak, pamiętaj, aby zastosować wszelkie atrybuty niezbędne do scenariusza, takie jak IsKey = true identyfikator dokumentu. Aby uzyskać więcej informacji, zobacz SimpleFieldAttribute.cs w kodzie źródłowym. |
SearchableField |
Model pomocnika. Musi być ciągiem znaków i zawsze można go wyszukiwać oraz pobierać. Inne atrybuty są domyślnie wyłączone, ale można je włączyć. Ponieważ ten typ pola można wyszukiwać, obsługuje synonimy i pełne uzupełnienie właściwości analizatora. Aby uzyskać więcej informacji, zobacz SearchableFieldAttribute.cs w kodzie źródłowym. |
Niezależnie od tego, czy używasz podstawowego interfejsu API SearchField, czy jednego z modeli pomocniczych, musisz jawnie włączyć atrybuty filtrowania, grupowania i sortowania. Na przykład IsFilterable, IsSortable i IsFacetable muszą być jawnie przypisane, jak pokazano w poprzednim przykładzie.
Dodawanie atrybutów pola
Zwróć uwagę, że każde pole jest ozdobione atrybutami, takimi jak IsFilterable, IsSortable, IsKeyi AnalyzerName. Te atrybuty odpowiadają bezpośrednio odpowiednim atrybutom pól w indeksie usługi Wyszukiwanie AI platformy Azure. Klasa FieldBuilder używa tych właściwości do konstruowania definicji pól dla indeksu.
Mapowanie typu pola
Typy .NET właściwości są mapowane na odpowiadające im typy pól w definicji indeksu. Na przykład właściwość typu string Category jest mapowana na pole category, które jest typu Edm.String. Istnieją podobne odwzorowania typów między bool?, Edm.Boolean, DateTimeOffset? i Edm.DateTimeOffset i tak dalej.
Czy zdarzyło ci się zauważyć SmokingAllowed właściwość?
[JsonIgnore]
public bool? SmokingAllowed => (Rooms != null) ? Array.Exists(Rooms, element => element.SmokingAllowed == true) : (bool?)null;
Atrybut JsonIgnore dla tej właściwości informuje element FieldBuilder, aby jej nie serializował do indeksu jako pole. Jest to doskonały sposób tworzenia właściwości obliczeniowych po stronie klienta, których można użyć jako pomocników w aplikacji. W tym przypadku właściwość SmokingAllowed wskazuje, czy jakikolwiek obiekt Room w kolekcji Rooms zezwala na palenie. Jeśli wszystkie są fałszywe, oznacza to, że cały hotel nie zezwala na palenie.
Ładowanie indeksu
Następny krok w Main uzupełnia nowo utworzony indeks hotels. Ta populacja indeksu jest wykonywana w następującej metodzie: (Kod zastąpiony ... w celach ilustracyjnych). Zobacz pełne przykładowe rozwiązanie dla pełnego kodu populacji danych).
private static void UploadDocuments(SearchClient searchClient)
{
IndexDocumentsBatch<Hotel> batch = IndexDocumentsBatch.Create(
IndexDocumentsAction.Upload(
new Hotel()
{
HotelId = "1",
HotelName = "Stay-Kay City Hotel",
...
Address = new Address()
{
StreetAddress = "677 5th Ave",
...
},
Rooms = new Room[]
{
new Room()
{
Description = "Budget Room, 1 Queen Bed (Cityside)",
...
},
new Room()
{
Description = "Budget Room, 1 King Bed (Mountain View)",
...
},
new Room()
{
Description = "Deluxe Room, 2 Double Beds (City View)",
...
}
}
}),
IndexDocumentsAction.Upload(
new Hotel()
{
HotelId = "2",
HotelName = "Old Century Hotel",
...
{
StreetAddress = "140 University Town Center Dr",
...
},
Rooms = new Room[]
{
new Room()
{
Description = "Suite, 2 Double Beds (Mountain View)",
...
},
new Room()
{
Description = "Standard Room, 1 Queen Bed (City View)",
...
},
new Room()
{
Description = "Budget Room, 1 King Bed (Waterfront View)",
...
}
}
}),
IndexDocumentsAction.Upload(
new Hotel()
{
HotelId = "3",
HotelName = "Gastronomic Landscape Hotel",
...
Address = new Address()
{
StreetAddress = "3393 Peachtree Rd",
...
},
Rooms = new Room[]
{
new Room()
{
Description = "Standard Room, 2 Queen Beds (Amenities)",
...
},
new Room ()
{
Description = "Standard Room, 2 Double Beds (Waterfront View)",
...
},
new Room()
{
Description = "Deluxe Room, 2 Double Beds (Cityside)",
...
}
}
}
};
try
{
IndexDocumentsResult result = searchClient.IndexDocuments(batch);
}
catch (Exception)
{
// Sometimes when your Search service is under load, indexing will fail for some of the documents in
// the batch. Depending on your application, you can take compensating actions like delaying and
// retrying. For this simple demo, we just log the failed document keys and continue.
Console.WriteLine("Failed to index some of the documents: {0}");
}
Console.WriteLine("Waiting for documents to be indexed...\n");
Thread.Sleep(2000);
Ta metoda ma cztery części. Pierwszy z nich tworzy tablicę trzech obiektów Hotel, z których każdy zawiera trzy obiekty Room, służące jako dane wejściowe do przesłania do indeksu. Te dane są zakodowane na twardo dla uproszczenia. W rzeczywistej aplikacji dane prawdopodobnie pochodzą z zewnętrznego źródła danych, takiego jak baza danych SQL.
Druga część tworzy IndexDocumentsBatch plik zawierający dokumenty. Należy określić operację, którą chcesz zastosować do partii w momencie jej utworzenia, w tym przypadku przez wywołanie metody IndexDocumentsAction.Upload. Następnie partia zostanie przekazana do indeksu usługi Wyszukiwanie AI platformy Azure za pomocą IndexDocuments metody .
Uwaga
W tym przykładzie po prostu przesyłasz dokumenty. Jeśli chcesz wprowadzić zmiany do istniejących dokumentów lub usunąć dokumenty, możesz zamiast tego utworzyć wsady, wywołując IndexDocumentsAction.Merge, IndexDocumentsAction.MergeOrUpload lub IndexDocumentsAction.Delete. Możesz również mieszać różne operacje w jednej partii, wywołując metodę IndexBatch.New, która pobiera kolekcję IndexDocumentsAction obiektów, z których każda informuje usługę Wyszukiwanie AI platformy Azure o wykonaniu określonej operacji na dokumencie. Możesz utworzyć każdy element IndexDocumentsAction za pomocą własnej operacji, wywołując odpowiednią metodę, taką jak IndexDocumentsAction.Merge, IndexAction.Upload i tak dalej.
Trzecią częścią tej metody jest blok catch, który obsługuje istotny przypadek błędu związanego z indeksowaniem. Jeśli usługa wyszukiwania nie zdoła zaindeksować niektórych dokumentów w danej partii, zostanie zgłoszony wyjątek RequestFailedException. Wyjątek może wystąpić, jeśli indeksujesz dokumenty, gdy usługa jest obciążona dużym obciążeniem. Zdecydowanie zalecamy jawną obsługę tego przypadku w kodzie. Możesz opóźnić, a następnie ponowić indeksowanie dokumentów, których przetwarzanie zakończyło się niepowodzeniem, lub możesz zarejestrować błąd i kontynuować, tak jak w prezentowanym przykładzie. Możesz też wykonać inną akcję w zależności od wymagań spójności danych aplikacji. Alternatywą jest użycie elementu SearchIndexingBufferedSender do inteligentnego przetwarzania wsadowego, automatycznego opróżniania i ponawiania prób dla nieudanych akcji indeksowania. Aby uzyskać więcej kontekstu, zobacz przykład SearchIndexingBufferedSender.
UploadDocuments Na koniec metoda opóźnia się przez dwie sekundy. Indeksowanie odbywa się asynchronicznie w usłudze wyszukiwania, więc przykładowa aplikacja musi poczekać chwilę, aby upewnić się, że dokumenty są dostępne do wyszukiwania. Tego typu opóźnienia są zazwyczaj konieczne tylko w przypadku pokazów, testów i przykładowych aplikacji.
Wywołaj metodę UploadDocuments w pliku Main()
Poniższy fragment kodu tworzy instancję SearchClient przy użyciu metody GetSearchClient obiektu indexClient. indexClient używa w swoich żądaniach klucza administracyjnego interfejsu API, który jest wymagany do ładowania lub odświeżania dokumentów.
Alternatywnym podejściem jest bezpośrednie wywołanie SearchClient z użyciem klucza API administratora w AzureKeyCredential.
SearchClient searchClient = indexClient.GetSearchClient(indexName);
Console.WriteLine("{0}", "Uploading documents...\n");
UploadDocuments(searchClient);
Uruchamianie zapytań
Najpierw skonfiguruj element SearchClient odczytujący punkt końcowy usługi i klucz interfejsu API zapytań z appsettings.json:
private static SearchClient CreateSearchClientForQueries(string indexName, IConfigurationRoot configuration)
{
string searchServiceEndPoint = configuration["YourSearchServiceEndPoint"];
string queryApiKey = configuration["YourSearchServiceQueryApiKey"];
SearchClient searchClient = new SearchClient(new Uri(searchServiceEndPoint), indexName, new AzureKeyCredential(queryApiKey));
return searchClient;
}
Po drugie zdefiniuj metodę, która wysyła żądanie zapytania.
Za każdym razem, gdy metoda wykonuje zapytanie, tworzy nowy SearchOptions obiekt. Ten obiekt służy do określania dodatkowych opcji zapytania, takich jak sortowanie, filtrowanie, stronicowanie i filtrowanie fasetowe. W tej metodzie ustawiamy właściwości Filter, Select i OrderBy dla różnych zapytań. Aby uzyskać więcej informacji na temat składni wyrażeń zapytań wyszukiwania, zobacz Prosta składnia zapytań.
Następnym krokiem jest wykonanie zapytania. Uruchomienie wyszukiwania odbywa się przy użyciu SearchClient.Search metody . Dla każdego zapytania przekaż tekst wyszukiwania do użycia jako ciąg (lub "*" jeśli nie ma tekstu wyszukiwania) oraz utworzone wcześniej opcje wyszukiwania. Określamy również Hotel jako parametr typu dla SearchClient.Search, co informuje zestaw SDK, aby deserializował dokumenty w wynikach wyszukiwania do obiektów typu Hotel.
private static void RunQueries(SearchClient searchClient)
{
SearchOptions options;
SearchResults<Hotel> results;
Console.WriteLine("Query 1: Search for 'motel'. Return only the HotelName in results:\n");
options = new SearchOptions();
options.Select.Add("HotelName");
results = searchClient.Search<Hotel>("motel", options);
WriteDocuments(results);
Console.Write("Query 2: Apply a filter to find hotels with rooms cheaper than $100 per night, ");
Console.WriteLine("returning the HotelId and Description:\n");
options = new SearchOptions()
{
Filter = "Rooms/any(r: r/BaseRate lt 100)"
};
options.Select.Add("HotelId");
options.Select.Add("Description");
results = searchClient.Search<Hotel>("*", options);
WriteDocuments(results);
Console.Write("Query 3: Search the entire index, order by a specific field (lastRenovationDate) ");
Console.Write("in descending order, take the top two results, and show only hotelName and ");
Console.WriteLine("lastRenovationDate:\n");
options =
new SearchOptions()
{
Size = 2
};
options.OrderBy.Add("LastRenovationDate desc");
options.Select.Add("HotelName");
options.Select.Add("LastRenovationDate");
results = searchClient.Search<Hotel>("*", options);
WriteDocuments(results);
Console.WriteLine("Query 4: Search the HotelName field for the term 'hotel':\n");
options = new SearchOptions();
options.SearchFields.Add("HotelName");
//Adding details to select, because "Location" isn't supported yet when deserializing search result to "Hotel"
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Description");
options.Select.Add("Category");
options.Select.Add("Tags");
options.Select.Add("ParkingIncluded");
options.Select.Add("LastRenovationDate");
options.Select.Add("Rating");
options.Select.Add("Address");
options.Select.Add("Rooms");
results = searchClient.Search<Hotel>("hotel", options);
WriteDocuments(results);
}
Po trzecie zdefiniuj metodę zapisującą odpowiedź, drukującą każdy dokument w konsoli:
private static void WriteDocuments(SearchResults<Hotel> searchResults)
{
foreach (SearchResult<Hotel> result in searchResults.GetResults())
{
Console.WriteLine(result.Document);
}
Console.WriteLine();
}
Wywołaj metodę RunQueries w metodzie Main()
SearchClient indexClientForQueries = CreateSearchClientForQueries(indexName, configuration);
Console.WriteLine("{0}", "Running queries...\n");
RunQueries(indexClientForQueries);
Eksplorowanie konstrukcji zapytań
Przyjrzyjmy się bliżej każdemu z zapytań. Oto kod do wykonania pierwszego zapytania:
options = new SearchOptions();
options.Select.Add("HotelName");
results = searchClient.Search<Hotel>("motel", options);
WriteDocuments(results);
W tym przypadku przeszukujemy cały indeks pod kątem słowa motel w dowolnym polu przeszukiwalnym i chcemy pobrać tylko nazwy hoteli, zgodnie z opcją Select. Oto wyniki:
Name: Stay-Kay City Hotel
Name: Old Century Hotel
W drugim zapytaniu użyj filtru, aby wybrać pokoje z nocną stawką mniejszą niż 100 USD. Zwróć w wynikach tylko identyfikator hotelu i opis:
options = new SearchOptions()
{
Filter = "Rooms/any(r: r/BaseRate lt 100)"
};
options.Select.Add("HotelId");
options.Select.Add("Description");
results = searchClient.Search<Hotel>("*", options);
To zapytanie używa wyrażenia OData $filter , Rooms/any(r: r/BaseRate lt 100), do filtrowania dokumentów w indeksie. Używa operatora any, aby zastosować warunek „BaseRate lt 100” do każdego elementu w kolekcji Rooms. Aby uzyskać więcej informacji, zobacz Składnia filtru OData.
W trzecim zapytaniu znajdź dwa najlepsze hotele, które zostały ostatnio odnowione, i pokaż nazwę hotelu i datę ostatniej renowacji. Oto kod:
options =
new SearchOptions()
{
Size = 2
};
options.OrderBy.Add("LastRenovationDate desc");
options.Select.Add("HotelName");
options.Select.Add("LastRenovationDate");
results = searchClient.Search<Hotel>("*", options);
WriteDocuments(results);
W ostatnim zapytaniu znajdź wszystkie nazwy hoteli, które pasują do słowa hotel:
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Description");
options.Select.Add("Category");
options.Select.Add("Tags");
options.Select.Add("ParkingIncluded");
options.Select.Add("LastRenovationDate");
options.Select.Add("Rating");
options.Select.Add("Address");
options.Select.Add("Rooms");
results = searchClient.Search<Hotel>("hotel", options);
WriteDocuments(results);
Ta sekcja zawiera podsumowanie tego wprowadzenia do zestawu .NET SDK, ale nie zatrzymaj się tutaj. W następnej sekcji przedstawiono inne zasoby, aby dowiedzieć się więcej na temat programowania za pomocą usługi Wyszukiwanie AI platformy Azure.
Powiązana zawartość
- Przestrzeń nazw Azure.Search.Documents (dokumentacja interfejsu API)
- azure-search-dotnet-samples (repozytorium w serwisie GitHub)
- search-dotnet-getting-started (repozytorium w serwisie GitHub)
- Informacje o interfejsie API REST usługi Wyszukiwanie AI platformy Azure
- Obsługiwane typy danych (interfejs API REST)