Udostępnij za pośrednictwem


Szybki start: tworzenie indeksu wyszukiwania przy użyciu starszej biblioteki klienta Microsoft.Azure.Search w wersji 10

Ten artykuł zawiera przewodnik Szybki start dla starszej biblioteki klienta Microsoft.Azure.Search (wersja 10), która została zastąpiona przez bibliotekę klienta Azure.Search.Documents (wersja 11).

Uwaga

Jeśli masz istniejące lub wlotowe projekty programistyczne, możesz nadal używać wersji 10. Jednak w przypadku nowych projektów lub używania nowych funkcji należy przejść do nowej biblioteki.

Informacje o tym przewodniku Szybki start

Utwórz aplikację konsolową platformy .NET Core w języku C#, która tworzy, ładuje i wysyła zapytania do indeksu Azure Cognitive Search przy użyciu bibliotek Visual Studio i bibliotek klienta Microsoft.Azure.Search.

W tym artykule wyjaśniono, jak utworzyć aplikację. Możesz również pobrać i uruchomić pełną aplikację.

Uwaga

Kod demonstracyjny w tym artykule używa synchronicznych metod Azure Cognitive Search zestawu SDK platformy .NET w wersji 10 dla uproszczenia. Jednak w przypadku scenariuszy produkcyjnych zalecamy używanie metod asynchronicznych we własnych aplikacjach w celu zapewnienia ich skalowalności i reakcji. Można na przykład użyć CreateAsync polecenia i DeleteAsync zamiast Create i Delete.

Wymagania wstępne

Przed rozpoczęciem musisz mieć następujące elementy:

Pobieranie klucza i adresu URL

Wywołania usługi wymagają punktu końcowego adresu URL i klucza dostępu dla każdego żądania. Usługa wyszukiwania jest tworzona przy użyciu obu tych opcji, więc jeśli dodano Azure Cognitive Search do subskrypcji, wykonaj następujące kroki, aby uzyskać niezbędne informacje:

  1. Zaloguj się do Azure Portal i na stronie Przegląd usługi wyszukiwania pobierz adres URL. Przykładowy punkt końcowy może wyglądać podobnie jak https://mydemo.search.windows.net.

  2. W Ustawienia>Keys uzyskaj klucz administratora dla pełnych praw w usłudze. Istnieją dwa zamienne klucze administracyjne, które zapewniają ciągłość działania w przypadku konieczności przerzucania jednego. Możesz użyć klucza podstawowego lub pomocniczego na żądaniach dodawania, modyfikowania i usuwania obiektów.

    Pobierz również klucz zapytania. Najlepszym rozwiązaniem jest wystawianie żądań zapytań z dostępem tylko do odczytu.

Get an HTTP endpoint and access key

Wszystkie żądania wymagają klucza api-key dla każdego żądania wysłanego do usługi. Prawidłowy klucz ustanawia relację zaufania dla danego żądania między aplikacją wysyłającą żądanie i usługą, która je obsługuje.

Konfigurowanie środowiska

Zacznij od otwarcia Visual Studio i utworzenia nowego projektu aplikacji konsolowej, który można uruchomić na platformie .NET Core.

Instalowanie pakietów NuGet

Pakiet Microsoft.Azure.Search składa się z kilku bibliotek klienckich, które są dystrybuowane jako pakiety NuGet.

W tym projekcie użyj wersji 10 Microsoft.Azure.Search pakietu NuGet i najnowszego Microsoft.Extensions.Configuration.Json pakietu NuGet.

  1. W obszarze Narzędzia>NuGet Menedżer pakietów wybierz pozycję Zarządzaj pakietami NuGet dla rozwiązania....

  2. Kliknij pozycję Browse (Przeglądaj).

  3. Microsoft.Azure.Search Wyszukaj i wybierz wersję 10.

  4. Kliknij pozycję Zainstaluj po prawej stronie, aby dodać zestaw do projektu i rozwiązania.

  5. Powtórz dla Microsoft.Extensions.Configuration.Jsonpolecenia , wybierając wersję 2.2.0 lub nowszą.

Dodawanie informacji o usłudze Azure Cognitive Search

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz pozycję Dodaj>nowy element... .

  2. W obszarze Dodaj nowy element wyszukaj ciąg "JSON", aby zwrócić listę typów elementów powiązanych z plikiem JSON.

  3. Wybierz pozycję Plik JSON, nadaj plikowi nazwę "appsettings.json", a następnie kliknij przycisk Dodaj.

  4. Dodaj plik do katalogu wyjściowego. Kliknij prawym przyciskiem myszy plik appsettings.json i wybierz pozycję Właściwości. W obszarze Kopiuj do katalogu wyjściowego wybierz pozycję Kopiuj, jeśli nowsze.

  5. Skopiuj następujący kod JSON do nowego pliku JSON.

    {
      "SearchServiceName": "<YOUR-SEARCH-SERVICE-NAME>",
      "SearchServiceAdminApiKey": "<YOUR-ADMIN-API-KEY>",
      "SearchIndexName": "hotels-quickstart"
    }
    
  6. Zastąp nazwę usługi wyszukiwania (YOUR-SEARCH-SERVICE-NAME) i klucz interfejsu API administratora (YOUR-ADMIN-API-KEY) prawidłowymi wartościami. Jeśli punkt końcowy usługi to https://mydemo.search.windows.net, nazwa usługi to "mydemo".

Dodaj klasę ". Pliki metody do projektu

Ten krok jest wymagany do wygenerowania znaczących danych wyjściowych w konsoli programu . Podczas drukowania wyników w oknie konsoli poszczególne pola z obiektu Hotel muszą być zwracane jako ciągi. Ten krok implementuje funkcję ToString() w celu wykonania tego zadania, które należy wykonać przez skopiowanie niezbędnego kodu do dwóch nowych plików.

  1. Dodaj dwie puste definicje klas do projektu: Address.Methods.cs, Hotel.Methods.cs

  2. W pliku Address.Methods.cs zastąp domyślną zawartość następującym kodem, wiersze 1–25.

  3. W pliku Hotel.Methods.cs skopiuj wiersze 1-68.

1 — Tworzenie indeksu

Indeks hoteli składa się z prostych i złożonych pól, gdzie proste pole to "HotelName" lub "Description", a pola złożone są adresem z polami podrzędnymi lub kolekcją pokoi. Gdy indeks zawiera typy złożone, izoluj złożone definicje pól w oddzielnych klasach.

  1. Dodaj dwie puste definicje klas do projektu: Address.cs, Hotel.cs

  2. W pliku Address.cs zastąp domyślną zawartość następującym kodem:

    using System;
    using Microsoft.Azure.Search;
    using Microsoft.Azure.Search.Models;
    using Newtonsoft.Json;
    
    namespace AzureSearchQuickstart
    {
        public partial class Address
        {
            [IsSearchable]
            public string StreetAddress { get; set; }
    
            [IsSearchable, IsFilterable, IsSortable, IsFacetable]
            public string City { get; set; }
    
            [IsSearchable, IsFilterable, IsSortable, IsFacetable]
            public string StateProvince { get; set; }
    
            [IsSearchable, IsFilterable, IsSortable, IsFacetable]
            public string PostalCode { get; set; }
    
            [IsSearchable, IsFilterable, IsSortable, IsFacetable]
            public string Country { get; set; }
        }
    }
    
  3. W pliku Hotel.cs klasa definiuje ogólną strukturę indeksu, w tym odwołania do klasy adresów.

    namespace AzureSearchQuickstart
    {
        using System;
        using Microsoft.Azure.Search;
        using Microsoft.Azure.Search.Models;
        using Newtonsoft.Json;
    
        public partial class Hotel
        {
            [System.ComponentModel.DataAnnotations.Key]
            [IsFilterable]
            public string HotelId { get; set; }
    
            [IsSearchable, IsSortable]
            public string HotelName { get; set; }
    
            [IsSearchable]
            [Analyzer(AnalyzerName.AsString.EnMicrosoft)]
            public string Description { get; set; }
    
            [IsSearchable]
            [Analyzer(AnalyzerName.AsString.FrLucene)]
            [JsonProperty("Description_fr")]
            public string DescriptionFr { get; set; }
    
            [IsSearchable, IsFilterable, IsSortable, IsFacetable]
            public string Category { get; set; }
    
            [IsSearchable, IsFilterable, IsFacetable]
            public string[] Tags { get; set; }
    
            [IsFilterable, IsSortable, IsFacetable]
            public bool? ParkingIncluded { get; set; }
    
            [IsFilterable, IsSortable, IsFacetable]
            public DateTimeOffset? LastRenovationDate { get; set; }
    
            [IsFilterable, IsSortable, IsFacetable]
            public double? Rating { get; set; }
    
            public Address Address { get; set; }
        }
    }
    

    Atrybuty w polu określają sposób jej użycia w aplikacji. Na przykład IsSearchable atrybut musi być przypisany do każdego pola, które powinno zostać uwzględnione w wyszukiwaniu pełnotekstowym.

    Uwaga

    W zestawie SDK platformy .NET pola muszą być jawnie przypisywane jako IsSearchable, IsFilterable, IsSortablei IsFacetable. To zachowanie jest sprzeczne z interfejsem API REST, który niejawnie umożliwia przypisywanie na podstawie typu danych (na przykład proste pola ciągów są automatycznie przeszukiwalne).

    Dokładnie jedno pole w indeksie typu string musi być polem klucza , jednoznacznie identyfikując każdy dokument. W tym schemacie kluczem jest HotelId.

    W tym indeksie pola opisu używają właściwości opcjonalnej analyzer określonej, gdy chcesz zastąpić domyślny standardowy analizator Lucene. Pole description_fr używa francuskiego analizatora Lucene (FrLucene), ponieważ przechowuje tekst francuski. Narzędzie description korzysta z opcjonalnego analizatora języka firmy Microsoft (EnMicrosoft).

  4. W pliku Program.cs utwórz wystąpienie SearchServiceClient klasy w celu nawiązania połączenia z usługą przy użyciu wartości przechowywanych w pliku konfiguracji aplikacji (appsettings.json).

    SearchServiceClientma właściwość zapewniającą Indexes wszystkie metody, które należy utworzyć, wyświetlić listę, zaktualizować lub usunąć indeksy Azure Cognitive Search.

    using System;
    using System.Linq;
    using System.Threading;
    using Microsoft.Azure.Search;
    using Microsoft.Azure.Search.Models;
    using Microsoft.Extensions.Configuration;
    
    namespace AzureSearchQuickstart
    {
        class Program {
            // Demonstrates index delete, create, load, and query
            // Commented-out code is uncommented in later steps
            static void Main(string[] args)
            {
                IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
                IConfigurationRoot configuration = builder.Build();
    
                SearchServiceClient serviceClient = CreateSearchServiceClient(configuration);
    
                string indexName = configuration["SearchIndexName"];
    
                Console.WriteLine("{0}", "Deleting index...\n");
                DeleteIndexIfExists(indexName, serviceClient);
    
                Console.WriteLine("{0}", "Creating index...\n");
                CreateIndex(indexName, serviceClient);
    
                // Uncomment next 3 lines in "2 - Load documents"
                // ISearchIndexClient indexClient = serviceClient.Indexes.GetClient(indexName);
                // Console.WriteLine("{0}", "Uploading documents...\n");
                // UploadDocuments(indexClient);
    
                // Uncomment next 2 lines in "3 - Search an index"
                // Console.WriteLine("{0}", "Searching index...\n");
                // RunQueries(indexClient);
    
                Console.WriteLine("{0}", "Complete.  Press any key to end application...\n");
                Console.ReadKey();
            }
    
            // Create the search service client
            private static SearchServiceClient CreateSearchServiceClient(IConfigurationRoot configuration)
            {
                string searchServiceName = configuration["SearchServiceName"];
                string adminApiKey = configuration["SearchServiceAdminApiKey"];
    
                SearchServiceClient serviceClient = new SearchServiceClient(searchServiceName, new SearchCredentials(adminApiKey));
                return serviceClient;
            }
    
            // Delete an existing index to reuse its name
            private static void DeleteIndexIfExists(string indexName, SearchServiceClient serviceClient)
            {
                if (serviceClient.Indexes.Exists(indexName))
                {
                    serviceClient.Indexes.Delete(indexName);
                }
            }
    
            // Create an index whose fields correspond to the properties of the Hotel class.
            // The Address property of Hotel will be modeled as a complex field.
            // The properties of the Address class in turn correspond to sub-fields of the Address complex field.
            // The fields of the index are defined by calling the FieldBuilder.BuildForType() method.
            private static void CreateIndex(string indexName, SearchServiceClient serviceClient)
            {
                var definition = new Microsoft.Azure.Search.Models.Index()
                {
                    Name = indexName,
                    Fields = FieldBuilder.BuildForType<Hotel>()
                };
    
                serviceClient.Indexes.Create(definition);
            }
        }
    }    
    

    Jeśli to możliwe, udostępnij jedno wystąpienie SearchServiceClient aplikacji, aby uniknąć otwierania zbyt wielu połączeń. Metody klas są bezpieczne wątkowo, aby umożliwić takie udostępnianie.

    Klasa ma kilka konstruktorów. Konstruktor odpowiedni w tym przypadku przyjmuje jako parametry nazwę usługi wyszukiwania i obiekt SearchCredentials. SearchCredentials opakowuje klucz interfejsu API.

    W definicji indeksu najprostszym sposobem utworzenia Field obiektów jest wywołanie FieldBuilder.BuildForType metody, przekazując klasę modelu dla parametru typu. Właściwości klasy modelu są mapowane na pola indeksu. To mapowanie umożliwia powiązanie dokumentów z indeksu wyszukiwania z wystąpieniami klasy modelu.

    Uwaga

    Jeśli nie zamierzasz używać klasy modelu, nadal możesz zdefiniować indeks poprzez bezpośrednie utworzenie obiektów Field. Możesz podać nazwę pola konstruktorowi wraz z typem danych (lub analizatorem w przypadku pól ciągów). Możesz również ustawić inne właściwości, takie jak IsSearchable, , IsFilterableaby wymienić kilka.

  5. Naciśnij klawisz F5, aby skompilować aplikację i utworzyć indeks.

    Jeśli projekt zostanie pomyślnie skompilowanych, zostanie otwarte okno konsoli, pisząc komunikaty o stanie na ekranie usuwania i tworzenia indeksu.

2 — Ładowanie dokumentów

W Azure Cognitive Search dokumenty to struktury danych, które są zarówno danymi wejściowymi do indeksowania, jak i danych wyjściowych z zapytań. Jak uzyskano z zewnętrznego źródła danych, dane wejściowe dokumentu mogą być wierszami w bazie danych, obiektami blob w usłudze Blob Storage lub dokumentami JSON na dysku. W tym przykładzie przyjmujemy skrót i osadzamy dokumenty JSON dla czterech hoteli w kodzie.

Podczas przekazywania dokumentów należy użyć IndexBatch obiektu. Obiekt IndexBatch zawiera kolekcję IndexAction obiektów, z których każda zawiera dokument i właściwość informującą Azure Cognitive Search akcję do wykonania (przekazywanie, scalanie, usuwanie i scalanieOrUpload).

  1. W pliku Program.cs utwórz tablicę dokumentów i akcji indeksu, a następnie przekaż tablicę do IndexBatch. Poniższe dokumenty są zgodne z indeksem hotel-quickstart zdefiniowanym przez klasy hotelowe i adresowe.

    // Upload documents as a batch
    private static void UploadDocuments(ISearchIndexClient indexClient)
    {
        var actions = new IndexAction<Hotel>[]
        {
            IndexAction.Upload(
                new Hotel()
                {
                    HotelId = "1",
                    HotelName = "Secret Point Motel",
                    Description = "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
                    DescriptionFr = "L'hôtel est idéalement situé sur la principale artère commerciale de la ville en plein cœur de New York. A quelques minutes se trouve la place du temps et le centre historique de la ville, ainsi que d'autres lieux d'intérêt qui font de New York l'une des villes les plus attractives et cosmopolites de l'Amérique.",
                    Category = "Boutique",
                    Tags = new[] { "pool", "air conditioning", "concierge" },
                    ParkingIncluded = false,
                    LastRenovationDate = new DateTimeOffset(1970, 1, 18, 0, 0, 0, TimeSpan.Zero),
                    Rating = 3.6,
                    Address = new Address()
                    {
                        StreetAddress = "677 5th Ave",
                        City = "New York",
                        StateProvince = "NY",
                        PostalCode = "10022",
                        Country = "USA"
                    }
                }
            ),
            IndexAction.Upload(
                new Hotel()
                {
                    HotelId = "2",
                    HotelName = "Twin Dome Motel",
                    Description = "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
                    DescriptionFr = "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
                    Category = "Boutique",
                    Tags = new[] { "pool", "free wifi", "concierge" },
                    ParkingIncluded = false,
                    LastRenovationDate =  new DateTimeOffset(1979, 2, 18, 0, 0, 0, TimeSpan.Zero),
                    Rating = 3.60,
                    Address = new Address()
                    {
                        StreetAddress = "140 University Town Center Dr",
                        City = "Sarasota",
                        StateProvince = "FL",
                        PostalCode = "34243",
                        Country = "USA"
                    }
                }
            ),
            IndexAction.Upload(
                new Hotel()
                {
                    HotelId = "3",
                    HotelName = "Triple Landscape Hotel",
                    Description = "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
                    DescriptionFr = "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
                    Category = "Resort and Spa",
                    Tags = new[] { "air conditioning", "bar", "continental breakfast" },
                    ParkingIncluded = true,
                    LastRenovationDate = new DateTimeOffset(2015, 9, 20, 0, 0, 0, TimeSpan.Zero),
                    Rating = 4.80,
                    Address = new Address()
                    {
                        StreetAddress = "3393 Peachtree Rd",
                        City = "Atlanta",
                        StateProvince = "GA",
                        PostalCode = "30326",
                        Country = "USA"
                    }
                }
            ),
            IndexAction.Upload(
                new Hotel()
                {
                    HotelId = "4",
                    HotelName = "Sublime Cliff Hotel",
                    Description = "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 1800 palace.",
                    DescriptionFr = "Le sublime Cliff Hotel est situé au coeur du centre historique de sublime dans un quartier extrêmement animé et vivant, à courte distance de marche des sites et monuments de la ville et est entouré par l'extraordinaire beauté des églises, des bâtiments, des commerces et Monuments. Sublime Cliff fait partie d'un Palace 1800 restauré avec amour.",
                    Category = "Boutique",
                    Tags = new[] { "concierge", "view", "24-hour front desk service" },
                    ParkingIncluded = true,
                    LastRenovationDate = new DateTimeOffset(1960, 2, 06, 0, 0, 0, TimeSpan.Zero),
                    Rating = 4.6,
                    Address = new Address()
                    {
                        StreetAddress = "7400 San Pedro Ave",
                        City = "San Antonio",
                        StateProvince = "TX",
                        PostalCode = "78216",
                        Country = "USA"
                    }
                }
            ),
        };
    
        var batch = IndexBatch.New(actions);
    
        try
        {
            indexClient.Documents.Index(batch);
        }
        catch (IndexBatchException e)
        {
            // When a service is under load, indexing might fail for some documents in the batch. 
            // Depending on your application, you can compensate by 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}",
                String.Join(", ", e.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key)));
        }
    
        // Wait 2 seconds before starting queries 
        Console.WriteLine("Waiting for indexing...\n");
        Thread.Sleep(2000);
    }
    

    Po zainicjowaniu obiektu można wysłać go do indeksuIndexBatch , wywołując Documents.IndexSearchIndexClient obiekt . Documents to właściwość SearchIndexClient , która udostępnia metody dodawania, modyfikowania, usuwania lub wykonywania zapytań dotyczących dokumentów w indeksie.

    Otaczające try/catch wywołanie Index metody przechwytuje błędy indeksowania, które mogą wystąpić, jeśli usługa jest obciążona dużym obciążeniem. W kodzie produkcyjnym można opóźnić, a następnie ponowić próbę indeksowania dokumentów, które zakończyły się niepowodzeniem, lub rejestrować i kontynuować, podobnie jak w przypadku przykładu, lub obsługiwać je w inny sposób, który spełnia wymagania spójności danych aplikacji.

    2-sekundowe opóźnienie rekompensuje indeksowanie, co jest asynchroniczne, dzięki czemu wszystkie dokumenty można indeksować przed wykonaniem zapytań. Kodowanie z opóźnieniem jest zwykle konieczne tylko w przypadku pokazów, testów i przykładowych aplikacji.

  2. W pliku Program.cs w pliku głównym usuń znaczniki komentarza dla "2 — załaduj dokumenty".

    // Uncomment next 3 lines in "2 - Load documents"
    ISearchIndexClient indexClient = serviceClient.Indexes.GetClient(indexName);
    Console.WriteLine("{0}", "Uploading documents...\n");
    UploadDocuments(indexClient);
    
  3. Naciśnij klawisz F5, aby ponownie skompilować aplikację.

    Jeśli projekt zostanie pomyślnie skompilowanych, zostanie otwarte okno konsoli z komunikatem o stanie, tym razem z komunikatem o przekazaniu dokumentów. W Azure Portal na stronie Przegląd usługi wyszukiwania indeks hotels-quickstart powinien teraz zawierać 4 dokumenty.

Aby uzyskać więcej informacji na temat przetwarzania dokumentów, zobacz "Jak zestaw SDK platformy .NET obsługuje dokumenty".

3 — Przeszukiwanie indeksu

Wyniki zapytania można uzyskać zaraz po zindeksowanym pierwszym dokumencie, ale rzeczywiste testowanie indeksu powinno czekać, aż wszystkie dokumenty zostaną zindeksowane.

W tej sekcji dodano dwie funkcje: logikę zapytań i wyniki. W przypadku zapytań użyj Search metody . Ta metoda przyjmuje tekst wyszukiwania, a także inne parametry.

Klasa DocumentsSearchResult reprezentuje wyniki.

  1. W pliku Program.cs utwórz metodę WriteDocuments, która wyświetla wyniki wyszukiwania w konsoli.

    private static void WriteDocuments(DocumentSearchResult<Hotel> searchResults)
    {
        foreach (SearchResult<Hotel> result in searchResults.Results)
        {
            Console.WriteLine(result.Document);
        }
    
        Console.WriteLine();
    }
    
  2. Utwórz metodę RunQueries w celu wykonywania zapytań i zwracania wyników. Wyniki to obiekty hotelowe. Możesz użyć parametru select, aby wyświetlić poszczególne pola. Jeśli pole nie zostanie uwzględnione w parametrze select, jego odpowiadająca mu właściwość Hotel będzie mieć wartość null.

    private static void RunQueries(ISearchIndexClient indexClient)
    {
        SearchParameters parameters;
        DocumentSearchResult<Hotel> results;
    
        // Query 1 
        Console.WriteLine("Query 1: Search for term 'Atlanta' with no result trimming");
        parameters = new SearchParameters();
        results = indexClient.Documents.Search<Hotel>("Atlanta", parameters);
        WriteDocuments(results);
    
        // Query 2
        Console.WriteLine("Query 2: Search on the term 'Atlanta', with trimming");
        Console.WriteLine("Returning only these fields: HotelName, Tags, Address:\n");
        parameters =
            new SearchParameters()
            {
                Select = new[] { "HotelName", "Tags", "Address" },
            };
        results = indexClient.Documents.Search<Hotel>("Atlanta", parameters);
        WriteDocuments(results);
    
        // Query 3
        Console.WriteLine("Query 3: Search for the terms 'restaurant' and 'wifi'");
        Console.WriteLine("Return only these fields: HotelName, Description, and Tags:\n");
        parameters =
            new SearchParameters()
            {
                Select = new[] { "HotelName", "Description", "Tags" }
            };
        results = indexClient.Documents.Search<Hotel>("restaurant, wifi", parameters);
        WriteDocuments(results);
    
        // Query 4 -filtered query
        Console.WriteLine("Query 4: Filter on ratings greater than 4");
        Console.WriteLine("Returning only these fields: HotelName, Rating:\n");
        parameters =
            new SearchParameters()
            {
                Filter = "Rating gt 4",
                Select = new[] { "HotelName", "Rating" }
            };
        results = indexClient.Documents.Search<Hotel>("*", parameters);
        WriteDocuments(results);
    
        // Query 5 - top 2 results
        Console.WriteLine("Query 5: Search on term 'boutique'");
        Console.WriteLine("Sort by rating in descending order, taking the top two results");
        Console.WriteLine("Returning only these fields: HotelId, HotelName, Category, Rating:\n");
        parameters =
            new SearchParameters()
            {
                OrderBy = new[] { "Rating desc" },
                Select = new[] { "HotelId", "HotelName", "Category", "Rating" },
                Top = 2
            };
        results = indexClient.Documents.Search<Hotel>("boutique", parameters);
        WriteDocuments(results);
    }
    

    Istnieją dwa sposoby dopasowywania terminów w zapytaniu: wyszukiwanie pełnotekstowe i filtry. Zapytanie wyszukiwania pełnotekstowego wyszukuje co najmniej jeden termin w IsSearchable polach w indeksie. Filtr jest wyrażeniem logicznym, które jest obliczane względem IsFilterable pól w indeksie. Wyszukiwanie pełnotekstowe i filtry można używać razem lub oddzielnie.

    Zarówno operacja wyszukiwania, jak i filtrowania są wykonywane przy użyciu metody Documents.Search. Zapytanie wyszukiwania może zostać przekazane za pośrednictwem parametru searchText, natomiast wyrażenie filtrowania może zostać przekazane za pośrednictwem właściwości Filter klasy SearchParameters. Aby filtrować bez wyszukiwania, po prostu przekaż wartość "*" jako parametr searchText. Aby wyszukiwać bez filtrowania, pozostaw nieustawioną właściwość Filter lub nie przekazuj jej w wystąpieniu obiektu SearchParameters.

  3. W pliku Program.cs w pliku main usuń znaczniki komentarza dla ciągu "3 — wyszukaj".

    // Uncomment next 2 lines in "3 - Search an index"
    Console.WriteLine("{0}", "Searching documents...\n");
    RunQueries(indexClient);
    
  4. Rozwiązanie zostało zakończone. Naciśnij klawisz F5, aby ponownie skompilować aplikację i uruchomić program w całości.

    Dane wyjściowe zawierają te same komunikaty, co poprzednio, z dodatkami do informacji o zapytaniach i wynikach.

Czyszczenie zasobów

W przypadku pracy w ramach własnej subskrypcji warto sprawdzić po zakończeniu projektu, czy dalej potrzebuje się utworzonych zasobów. Uruchomione zasoby mogą generować koszty. Zasoby możesz usuwać pojedynczo lub możesz usunąć grupę zasobów, aby usunąć cały ich zestaw.

Zasoby można znaleźć i zarządzać nimi w portalu, korzystając z linku Wszystkie zasoby lub Grupy zasobów w okienku nawigacji po lewej stronie.

Jeśli używasz bezpłatnej usługi, pamiętaj, że masz ograniczenie do trzech indeksów, indeksatorów i źródeł danych. Możesz usunąć poszczególne elementy w portalu, aby pozostać w limicie.

Następne kroki

W tym przewodniku Szybki start w języku C# przedstawiono serię zadań tworzenia indeksu, ładowania go z dokumentami i uruchamiania zapytań. Na różnych etapach skorzystaliśmy ze skrótów, aby uprościć kod pod kątem czytelności i zrozumienia. Jeśli znasz podstawowe pojęcia, zalecamy następny artykuł dotyczący eksploracji alternatywnych podejść i pojęć, które pogłębią Twoją wiedzę.

Przykładowy kod i indeks są rozszerzonymi wersjami tego kodu. Następny przykład dodaje kolekcję Rooms, używa różnych klas i akcji i przyjrzy się bliżej sposobom przetwarzania.

Chcesz zoptymalizować i zaoszczędzić na wydatkach na chmurę?