Az Azure.Search.Documents használata C# .NET-alkalmazásban

Ez a cikk bemutatja, hogyan hozhat létre és kezelhet keresési objektumokat a C# és az Azure.Search.Documents (11-es verzió) ügyfélkódtár használatával az Azure SDK for .NET-ben.

Tudnivalók a 11-es verzióról

A .NET-hez készült Azure SDK tartalmaz egy Azure.Search.Documents ügyfélkódtárat az Azure SDK csapatából, amely funkcionálisan egyenértékű az előző ügyfélkódtár, a Microsoft.Azure.Search szolgáltatáséval. A 11-es verzió konzisztensebb az Azure programozhatósága szempontjából. Ilyenek például a AzureKeyCredential kulcshitelesítés és a System.Text.Json.Szerializálás JSON-szerializáláshoz.

A korábbi verziókhoz hasonlóan a következő kódtárat használhatja:

  • Keresési indexek, adatforrások, indexelők, készségkészletek és szinonimatérképek létrehozása és kezelése
  • Keresési dokumentumok betöltése és kezelése indexben
  • Lekérdezések végrehajtása anélkül, hogy foglalkoznia kellene a HTTP és a JSON részleteivel
  • AI-bővítés (képességkészletek) és kimenetek meghívása és kezelése

A kódtár egyetlen Azure.Search.Documents NuGet-csomagként van elosztva, amely tartalmazza a keresési szolgáltatáshoz való programozott hozzáféréshez használt összes API-t.

Az ügyfélkódtár definiálja az olyan osztályokat, mint SearchIndexa , SearchFieldés SearchDocument, valamint az olyan műveleteket, mint SearchIndexClient.CreateIndex az SearchClient.Search és SearchClient az SearchIndexClient osztályok. Ezek az osztályok a következő névterekbe vannak rendezve:

Az Azure.Search.Documents (11-es verzió) a 2020-06-30-as keresési szolgáltatás specifikációját célozza.

Az ügyfélkódtár nem biztosít szolgáltatásfelügyeleti műveleteket, például keresési szolgáltatások létrehozását és skálázását, valamint API-kulcsok kezelését. Ha .NET-alkalmazásból kell kezelnie a keresési erőforrásokat, használja a Microsoft.Azure.Management.Search könyvtárat a .NET-hez készült Azure SDK-ban.

Frissítés v11-re

Ha a .NET SDK előző verzióját használja, és az aktuális általánosan elérhető verzióra szeretne frissíteni, tekintse meg az Azure AI Search .NET SDK 11-es verziójára való frissítést.

SDK-követelmények

A .NET-hez készült Azure SDK megfelel a .NET Standard 2.0-nak.

Példaalkalmazás

Ez a cikk "példa szerint tanít", és a GitHub DotNetHowTo kód példájára támaszkodva szemlélteti az Azure AI Search alapvető fogalmait – pontosabban a keresési indexek létrehozását, betöltését és lekérdezését.

A cikk további részében tegyük fel, hogy egy új, "hotels" nevű indexet töltünk fel néhány dokumentummal, és több lekérdezéssel, amelyek megfelelnek az eredményeknek.

Az alábbiakban látható a fő program, amely a teljes folyamatot mutatja:

// 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();
}

A következő egy részleges képernyőkép a kimenetről, feltéve, hogy érvényes szolgáltatásnévvel és API-kulcsokkal futtatja az alkalmazást:

Screenshot of the Console.WriteLine output from the sample program.

Ügyféltípusok

Az ügyfélkódtár három ügyféltípust használ a különböző műveletekhez: SearchIndexClient indexek létrehozására, frissítésére vagy törlésére, SearchClient indexek betöltésére vagy lekérdezésére, valamint SearchIndexerClient indexelőkkel és képességkészletekkel való együttműködésre. Ez a cikk az első kettőre összpontosít.

Legalább az összes ügyfélnek szüksége van a szolgáltatás nevére vagy végpontjára, valamint egy API-kulcsra. Ezeket az információkat gyakran egy konfigurációs fájlban kell megadni, hasonlóan ahhoz, amit a appsettings.jsonDotNetHowTo mintaalkalmazás fájljában talál. A konfigurációs fájlból való olvasáshoz adja hozzá using Microsoft.Extensions.Configuration; a programhoz.

Az alábbi utasítás létrehozza az indexek létrehozásához, frissítéséhez vagy törléséhez használt indexügyfélt. Szolgáltatásvégpontot és rendszergazdai API-kulcsot igényel.

private static SearchIndexClient CreateSearchIndexClient(IConfigurationRoot configuration)
{
    string searchServiceEndPoint = configuration["SearchServiceEndPoint"];
    string adminApiKey = configuration["SearchServiceAdminApiKey"];

    SearchIndexClient indexClient = new SearchIndexClient(new Uri(searchServiceEndPoint), new AzureKeyCredential(adminApiKey));
    return indexClient;
}

A következő utasítás létrehozza a dokumentumok betöltéséhez vagy lekérdezések futtatásához használt keresési ügyfelet. SearchClient indexet igényel. A dokumentumok betöltéséhez rendszergazdai API-kulcsra lesz szüksége, de lekérdezési API-kulccsal is futtathat lekérdezéseket.

string indexName = configuration["SearchIndexName"];

private static SearchClient CreateSearchClientForQueries(string indexName, IConfigurationRoot configuration)
{
    string searchServiceEndPoint = configuration["SearchServiceEndPoint"];
    string queryApiKey = configuration["SearchServiceQueryApiKey"];

    SearchClient searchClient = new SearchClient(new Uri(searchServiceEndPoint), indexName, new AzureKeyCredential(queryApiKey));
    return searchClient;
}

Feljegyzés

Ha érvénytelen kulcsot ad meg az importálási művelethez (például egy lekérdezési kulcsot, ahol rendszergazdai kulcsra volt szükség), a SearchClient rendszer a művelet metódusának első hívásakor a "Tiltott" hibaüzenettel jelenik CloudException meg. Ha ez történik Önhöz, ellenőrizze duplán az API-kulcsot.

Az index törlése

A fejlesztés korai szakaszában érdemes lehet belefoglalni egy DeleteIndex utasítást, amely törli a folyamatban lévő indexet, hogy újra létre tudja hozni egy frissített definícióval. Az Azure AI Search mintakódja gyakran tartalmaz törlési lépést, hogy újrafuttassa a mintát.

A következő sorhívások DeleteIndexIfExists:

Console.WriteLine("{0}", "Deleting index...\n");
DeleteIndexIfExists(indexName, indexClient);

Ez a metódus a megadott SearchIndexClient módon ellenőrzi, hogy az index létezik-e, és ha igen, törli azt:

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.");

Feljegyzés

A cikkben szereplő példakód a szinkron metódusokat használja az egyszerűség kedvéért, de az aszinkron metódusokat a saját alkalmazásaiban kell használnia, hogy skálázhatóak és rugalmasak maradjanak. A fenti metódusban például ahelyett használhatná DeleteIndexAsync a következőt DeleteIndex: .

Index létrehozása

Indexet is SearchIndexClient létrehozhat.

Az alábbi metódus létrehoz egy új SearchIndex objektumot az új index sémáját meghatározó objektumok listájával SearchField . Minden mező rendelkezik névvel, adattípussal és számos attribútummal, amelyek meghatározzák a keresési viselkedést.

A mezők egy modellosztályból definiálhatók a következő használatával FieldBuilder: . Az FieldBuilder osztály tükröződéssel hozza létre az index objektumlistáját SearchField az adott Hotel modellosztály nyilvános tulajdonságainak és attribútumainak vizsgálatával. Később részletesebben is megnézzük az Hotel osztályt.

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);
}

A mezők mellett pontozási profilokat, javaslatokat vagy CORS-beállításokat is hozzáadhat az indexhez (ezeket a paramétereket kihagyja a minta a rövidség kedvéért). A SearchIndex objektumról és annak összetevőiről a tulajdonságok listájában SearchIndex , valamint a REST API-referenciaban talál további információt.

Feljegyzés

Szükség esetén a használat FieldBuilder helyett mindig közvetlenül hozhatja létre az objektumok listájátField. Előfordulhat például, hogy nem szeretne modellosztályt használni, vagy olyan meglévő modellosztályt kell használnia, amelyet nem szeretne módosítani attribútumok hozzáadásával.

CreateIndex meghívása a Main() alkalmazásban

Main új "hotels" indexet hoz létre a fenti metódus meghívásával:

Console.WriteLine("{0}", "Creating index...\n");
CreateIndex(indexName, indexClient);

Modellosztály használata adatábrázoláshoz

A DotNetHowTo minta modellosztályokat használ a Hotel, a Address és a Room adatstruktúrákhoz. Hotel referenciák Address, egy egyszintű összetett típus (többrészes mező) és Room (többrészes mezők gyűjteménye).

Ezekkel a típusokkal hozhatja létre és töltheti be az indexet, és strukturálhatja egy lekérdezés válaszát:

// 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();
}

Egy másik módszer, ha közvetlenül ad hozzá mezőket egy indexhez. Az alábbi példa csak néhány mezőt mutat be.

 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 }
         }
 };

Meződefiníciók

A .NET-ben található adatmodellnek és a hozzá tartozó indexsémának támogatnia kell a végfelhasználónak nyújtott keresési élményt. A .NET minden legfelső szintű objektuma, például egy keresési indexben lévő keresési dokumentum egy olyan keresési eredménynek felel meg, amely a felhasználói felületen jelenne meg. Egy szállodakereső alkalmazásban például a végfelhasználók a szálloda neve, a szálloda jellemzői vagy egy adott szoba jellemzői alapján kereshetnek.

Minden osztályon belül egy mező olyan adattípussal és attribútumokkal van definiálva, amelyek meghatározzák a használat módját. Az egyes osztály egyes nyilvános tulajdonságainak neve egy olyan mezőre van leképezni, amelynek neve megegyezik az indexdefinícióban.

Tekintse meg az alábbi kódrészletet, amely több meződefiníciót is lekér a Hotel osztályból. Figyelje meg, hogy a Cím és a Szobák C# típusúak saját osztálydefiníciókkal (ha meg szeretné tekinteni őket, tekintse meg a mintakódot). Mindkettő összetett típus. További információ: Összetett típusok modellezése.

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; }

Mezőosztály kiválasztása

Mezők definiálásakor használhatja az alaposztályt SearchField , vagy használhat "sablonként" szolgáló származtatott segédmodelleket előre konfigurált tulajdonságokkal.

Az index pontosan egy mezőjének dokumentumkulcsként (IsKey = true) kell szolgálnia. Sztringnek kell lennie, és egyedileg kell azonosítania az egyes dokumentumokat. Emellett rendelkeznie kell IsHidden = truevele, ami azt jelenti, hogy nem látható a keresési eredményekben.

Mezőtípus Leírás és használat
SearchField Alaposztály, amelynek a legtöbb tulajdonsága null értékű, kivéve Name , hogy melyik kötelező, és AnalyzerName melyik alapértelmezés szerint a standard Lucene.
SimpleField Segédmodell. Bármilyen adattípus lehet, mindig nem kereshető (a teljes szöveges keresési lekérdezések figyelmen kívül hagyják), és lekérdezhető (nem rejtett). Más attribútumok alapértelmezés szerint ki vannak kapcsolva, de engedélyezhetők. Használhat SimpleField dokumentumazonosítókat vagy mezőket, amelyeket csak szűrőkben, aspektusokban vagy pontozási profilokban használ. Ha igen, mindenképpen alkalmazza a forgatókönyvhöz szükséges attribútumokat, például IsKey = true egy dokumentumazonosítót. További információ: SimpleFieldAttribute.cs a forráskódban.
SearchableField Segédmodell. Sztringnek kell lennie, és mindig kereshető és lekérdezhető. Más attribútumok alapértelmezés szerint ki vannak kapcsolva, de engedélyezhetők. Mivel ez a mezőtípus kereshető, támogatja a szinonimákat és az elemző tulajdonságainak teljes kiegészítését. További információ: SearchableFieldAttribute.cs a forráskódban.

Akár az alapszintű SearchField API-t, akár az egyik segédmodellt használja, explicit módon engedélyeznie kell a szűrési, aspektus- és rendezési attribútumokat. Az IsFilterable, az IsSortable és az IsFacetable attribútumot például explicit módon kell hozzárendelni, ahogyan az a fenti példában is látható.

Mezőattribútumok hozzáadása

Figyelje meg, hogyan díszítik az egyes mezőket olyan attribútumokkal, mint a IsFilterable, IsSortable, IsKeyés AnalyzerName. Ezek az attribútumok közvetlenül egy Azure AI Search-index megfelelő mezőattribútumaihoz vannak megfeleltetve. Az FieldBuilder osztály ezeket a tulajdonságokat használja az index meződefinícióinak létrehozásához.

Mezőtípus-leképezés

A tulajdonságok .NET-típusai az indexdefinícióban lévő egyenértékű mezőtípusokra vannak megfeleltetve. Például a rendszer a Edm.String típusú Category szöveges tulajdonságot a category mezőbe képezi le. Hasonló típusleképezések léteznek a , Edm.Boolean, DateTimeOffset?és Edm.DateTimeOffset így tovább közöttbool?.

Észrevette a tulajdonságot SmokingAllowed ?

[JsonIgnore]
public bool? SmokingAllowed => (Rooms != null) ? Array.Exists(Rooms, element => element.SmokingAllowed == true) : (bool?)null;

A JsonIgnore tulajdonság attribútuma azt jelzi, FieldBuilder hogy ne szerializálja azt mezőként az indexbe. Ez egy nagyszerű módja annak, hogy ügyféloldali számított tulajdonságokat hozzon létre, amelyek segédként használhatók az alkalmazásban. Ebben az esetben a SmokingAllowed tulajdonság azt tükrözi, hogy a Rooms gyűjteményben található-e dohányzásRoom. Ha minden hamis, az azt jelzi, hogy az egész szálloda nem engedélyezi a dohányzást.

Index betöltése

A következő lépés feltölti Main az újonnan létrehozott "hotels" indexet. Ez az indexpopuláció a következő módszerrel történik: (Néhány kód a következőre cserélve: "..." szemléltetés céljából. Tekintse meg a teljes adatpopulációs kód mintamegoldását.)

private static void UploadDocuments(SearchClient searchClient)
{
    IndexDocumentsBatch<Hotel> batch = IndexDocumentsBatch.Create(
        IndexDocumentsAction.Upload(
            new Hotel()
            {
                HotelId = "1",
                HotelName = "Secret Point Motel",
                ...
                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 = "Twin Dome Motel",
                ...
                {
                    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 = "Triple 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);

Ez a módszer négy részből áll. Az első három objektumból álló Hotel tömböt hoz létre, amelyek mindegyike három Room objektummal rendelkezik, amelyek bemeneti adatokként szolgálnak majd az indexbe való feltöltéshez. Ezek az adatok az egyszerűség kedvéért nehezen kódoltak. Egy tényleges alkalmazásban az adatok valószínűleg külső adatforrásból, például SQL-adatbázisból származnak.

A második rész létrehozza IndexDocumentsBatch a dokumentumokat tartalmazó részt. A kötegre a létrehozáskor alkalmazni kívánt műveletet adja meg, ebben az esetben a hívással IndexDocumentsAction.Upload. A köteg ezután a metódussal fel lesz töltve az Azure AI Search-indexbe IndexDocuments .

Feljegyzés

Ebben a példában csak dokumentumokat töltünk fel. Ha meglévő dokumentumokba szeretné egyesíteni a módosításokat, vagy törölni szeretné a dokumentumokat, kötegeket hozhat létre hívással IndexDocumentsAction.Merge, IndexDocumentsAction.MergeOrUploadvagy IndexDocumentsAction.Delete ehelyett. A különböző műveleteket egyetlen kötegben is kombinálhatja, ha meghív IndexBatch.Newegy objektumgyűjteményt IndexDocumentsAction , amelyek mindegyike arra utasítja az Azure AI Search-t, hogy végezzen el egy adott műveletet egy dokumentumon. Mindegyik IndexDocumentsAction saját művelettel hozható létre, ha meghívja a megfelelő metódust, például IndexDocumentsAction.Mergeaz , IndexAction.Uploadés így tovább.

A metódus harmadik része egy fogási blokk, amely egy fontos hibaesetet kezel az indexeléshez. Ha a keresési szolgáltatás nem indexeli a kötegben lévő dokumentumok egy részét, RequestFailedException a művelet egy hibát jelez. Kivétel akkor fordulhat elő, ha dokumentumokat indexel, miközben a szolgáltatás nagy terhelés alatt áll. Javasoljuk, hogy a kódban explicit módon kezelje ezt az esetet. Azon dokumentumok esetében, ahol az indexelés meghiúsult, elhalaszthatja azt, majd később újra megpróbálkozhat az indexeléssel, vagy a mintának megfelelően naplózhatja azt, és folytathatja a munkáját, esetleg – az alkalmazás adatkonzisztencia-követelményeitől függően – más műveletbe kezdhet. Egy másik lehetőség a SearchIndexingBufferedSender használata az intelligens kötegeléshez, az automatikus kiürítéshez és a sikertelen indexelési műveletek újrapróbálkozásához. Ebben a példában további kontextust talál.

Végül a UploadDocuments metódus két másodpercig késik. Az indexelés aszinkron módon történik a keresési szolgáltatásban, ezért a mintaalkalmazásnak rövid ideig kell várnia, hogy a dokumentumok elérhetők legyenek a kereséshez. Ilyen mértékű késleltetésre kizárólag demók, tesztek és mintaalkalmazások esetében van szükség.

UploadDocuments hívása a Main() alkalmazásban

Az alábbi kódrészlet beállít egy példányt SearchClient az GetSearchClient indexClient metódus használatával. Az indexClient egy rendszergazdai API-kulcsot használ a kéréseihez, amely a dokumentumok betöltéséhez vagy frissítéséhez szükséges.

Másik módszer a közvetlen hívásSearchClient, amely egy rendszergazdai API-kulcsot ad át.AzureKeyCredential

SearchClient searchClient = indexClient.GetSearchClient(indexName);

Console.WriteLine("{0}", "Uploading documents...\n");
UploadDocuments(searchClient);

Lekérdezések futtatása

Először állítson be egy SearchClient olyant, amely beolvassa a szolgáltatásvégpontot és lekérdezi az API-kulcsot appsettings.json:

private static SearchClient CreateSearchClientForQueries(string indexName, IConfigurationRoot configuration)
{
    string searchServiceEndPoint = configuration["SearchServiceEndPoint"];
    string queryApiKey = configuration["SearchServiceQueryApiKey"];

    SearchClient searchClient = new SearchClient(new Uri(searchServiceEndPoint), indexName, new AzureKeyCredential(queryApiKey));
    return searchClient;
}

Másodszor definiáljon egy metódust, amely lekérdezési kérelmet küld.

Minden alkalommal, amikor a metódus végrehajt egy lekérdezést, létrehoz egy új SearchOptions objektumot. Ezzel az objektummal további beállításokat adhat meg a lekérdezéshez, például rendezést, szűrést, lapozást és arculati beállításokat. Ebben a metódusban a különböző lekérdezésekhez állítjuk be a Filter, Selectés OrderBy a tulajdonságot. További információ a keresési kifejezés szintaxisáról: Egyszerű lekérdezési szintaxis.

A következő lépés a lekérdezés végrehajtása. A keresés futtatása a SearchClient.Search módszerrel történik. Minden lekérdezéshez adja át a sztringként használni kívánt keresési szöveget (vagy "*" ha nincs keresési szöveg), valamint a korábban létrehozott keresési beállításokat. Meg is adhatja Hotel a típusparamétert SearchClient.Search, amely arra utasítja az SDK-t, hogy deszerializálja a keresési eredményekben lévő dokumentumokat típusobjektumokká 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);
}

Harmadszor definiáljon egy metódust, amely megírja a választ, és minden dokumentumot a konzolra nyomtat:

private static void WriteDocuments(SearchResults<Hotel> searchResults)
{
    foreach (SearchResult<Hotel> result in searchResults.GetResults())
    {
        Console.WriteLine(result.Document);
    }

    Console.WriteLine();
}

RunQueries hívása a Main() alkalmazásban

SearchClient indexClientForQueries = CreateSearchClientForQueries(indexName, configuration);

Console.WriteLine("{0}", "Running queries...\n");
RunQueries(indexClientForQueries);

Lekérdezésszerkezetek megismerése

Nézzük meg közelebbről az egyes lekérdezéseket. Az első lekérdezés végrehajtásához a következő kódot kell megadni:

options = new SearchOptions();
options.Select.Add("HotelName");

results = searchClient.Search<Hotel>("motel", options);

WriteDocuments(results);

Ebben az esetben a teljes indexben a "motel" szóra keresünk minden kereshető mezőben, és csak a szálloda nevét szeretnénk lekérni a beállítás által Select megadott módon. Az eredmények a következők:

Name: Secret Point Motel

Name: Twin Dome Motel

A második lekérdezésben használjon szűrőt a 100 USD-nél alacsonyabb éjszakai arányú szobák kiválasztásához. Csak a szálloda azonosítóját és leírását adja vissza az eredményekben:

options = new SearchOptions()
{
    Filter = "Rooms/any(r: r/BaseRate lt 100)"
};
options.Select.Add("HotelId");
options.Select.Add("Description");

results = searchClient.Search<Hotel>("*", options);

A fenti lekérdezés egy OData-kifejezést $filter használ az Rooms/any(r: r/BaseRate lt 100)indexben lévő dokumentumok szűréséhez. Ez bármely operátort használ a "BaseRate lt 100" alkalmazásához a Szobák gyűjtemény minden elemére. További információ: OData szűrőszintaxis.

A harmadik lekérdezésben keresse meg a legutóbb felújított két szállodát, és adja meg a szálloda nevét és az utolsó felújítás dátumát. A kód a következő:

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);

Az utolsó lekérdezésben keresse meg az összes hotelnevet, amely megfelel a "hotel" szónak:

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);

Ez a szakasz a .NET SDK bemutatását zárja, de itt ne hagyja abba. A következő szakasz további forrásokat javasol az Azure AI Search-beli programozással kapcsolatos további információkhoz.

Következő lépések