Rövid útmutató: Teljes szöveges keresés

Megjegyzés:

Azure AI Keresés a Azure portálon, REST API-kon és Azure SDK-k keresztül érhető el. Emellett a Foundry IQ-t is támogatja, amely a vállalati tartalmakat újrafelhasználható, engedélytudatos tudásbázisokká alakítja át az Microsoft Foundry portálon található ügynökök számára.

Ebben a gyors útmutatóban a Azure AI Keresés .NET ügyfélkönyvtárát használja egy teljes szöveges keresés, más néven kulcsszókeresés keresési indexének létrehozásához, betöltéséhez és lekérdezéséhez.

A teljes szöveges keresés az Apache Lucene-t használja az indexeléshez és a lekérdezésekhez, valamint a BM25 rangsorolási algoritmust a pontozási eredményekhez. Ez a rövid útmutató a azure-search-sample-data GitHub adattár fiktív szállodai adatait használja az index feltöltéséhez.

Tipp.

Azonnal hozzá szeretne kezdeni? Töltse le a forráskódot GitHub.

Előfeltételek

Hozzáférés konfigurálása

Mielőtt hozzákezdene, győződjön meg arról, hogy rendelkezik hozzáféréssel a tartalomhoz és a műveletekhez a Azure AI Keresés. Ez a rövid útmutató a Microsoft Entra ID-t használja a hitelesítéshez és a szerepköralapú hozzáférés engedélyezéséhez. Szerepkörök hozzárendeléséhez tulajdonosnak vagy felhasználói hozzáférés-rendszergazdának kell lennie. Ha a szerepkörök nem megvalósíthatók, használja inkább a kulcsalapú hitelesítést .

Az ajánlott szerepköralapú hozzáférés konfigurálása:

  1. Engedélyezze a szerepköralapú hozzáférést a keresési szolgáltatáshoz.

  2. Rendelje hozzá a következő szerepköröket a felhasználói fiókjához.

    • Keresési szolgáltatás közreműködője

    • Keresési index adatszolgáltatója

    • Keresési index adatolvasó

Végpont lekérése

Minden Azure AI Keresés szolgáltatás rendelkezik egy endpoint, amely egy egyedi URL-cím, amely azonosítja és hálózati hozzáférést biztosít a szolgáltatáshoz. Egy későbbi szakaszban ezt a végpontot adja meg, hogy programozott módon csatlakozzon a keresési szolgáltatáshoz.

A végpont lekérése:

  1. Nyissa meg a keresési szolgáltatást az Azure Portalon.

  2. A bal oldali panelen válassza az Áttekintés lehetőséget.

  3. Jegyezze fel a végpontot, amelynek így kell kinéznie https://my-service.search.windows.net.

A környezet beállítása

  1. A Git használatával klónozza a mintaadattárat.

    git clone https://github.com/Azure-Samples/azure-search-dotnet-samples
    
  2. Lépjen a gyors kezdés mappába.

    cd azure-search-dotnet-samples/quickstart-keyword-search/AzureSearchQuickstart
    
  3. A Program.cs esetében cserélje le a serviceEndpoint helyőrző értékét a Get-végpontban beszerzett URL-címre.

  4. Telepítse a függőségeket innen AzureSearchQuickstart.csproj: .

    dotnet restore
    

    Amikor a visszaállítás befejeződött, ellenőrizze, hogy nem jelennek-e meg hibák a kimenetben.

  5. Microsoft Entra ID-vel történő kulcs nélküli hitelesítés esetén jelentkezzen be az Azure-fiókjába. Ha több előfizetéssel rendelkezik, válassza ki azt, amelyik a Azure AI Keresés szolgáltatást tartalmazza.

    az login
    

A kód futtatása

Hozza létre és futtassa az alkalmazást.

dotnet run

Kimenet

A kimenetnek a következőhöz hasonlónak kell lennie:

Deleting index...

Creating index...

Uploading documents...

Waiting for indexing...

Starting queries...

Query #1: Search on empty term '*' to return all documents, showing a subset of fields...

HotelId: 3
Name: Gastronomic Landscape Hotel
Rating: 4.8

HotelId: 2
Name: Old Century Hotel
Rating: 3.6

HotelId: 4
Name: Sublime Palace Hotel
Rating: 4.6

HotelId: 1
Name: Stay-Kay City Hotel
Rating: 3.6


Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...

HotelId: 3
Name: Gastronomic Landscape Hotel
Rating: 4.8

HotelId: 4
Name: Sublime Palace Hotel
Rating: 4.6


Query #3: Limit search to specific fields (pool in Tags field)...

HotelId: 2
Name: Old Century Hotel
Tags: [ pool, free wifi, concierge ]


Query #4: Facet on 'Category'...

HotelId: 3
Name: Gastronomic Landscape Hotel
Category: Suite

HotelId: 2
Name: Old Century Hotel
Category: Boutique

HotelId: 4
Name: Sublime Palace Hotel
Category: Boutique

HotelId: 1
Name: Stay-Kay City Hotel
Category: Boutique


Query #5: Look up a specific document...

3
Query #6: Call Autocomplete on HotelName...

san
sarasota

Complete. Press any key to end this program...

A kód ismertetése

Megjegyzés:

Előfordulhat, hogy az ebben a szakaszban szereplő kódrészletek az olvashatóság érdekében módosultak. A teljes munka példához tekintse meg a forráskódot.

Most, hogy futtatta a kódot, bontsuk le a legfontosabb lépéseket:

  1. Keresési ügyfél létrehozása
  2. Keresési index létrehozása
  3. Dokumentumok feltöltése az indexbe
  4. Az index lekérdezése

Keresési ügyfél létrehozása

Ebben a fájlban Program.cskét ügyfelet hoz létre:

Mindkét ügyfélnek szüksége van a szolgáltatásvégpontra és egy hitelesítő adatra a hitelesítéshez. Ebben a rövid útmutatóban a DefaultAzureCredential-t kulcsnélküli hitelesítéshez használod a Microsoft Entra ID-vel.

Keresési index létrehozása

Ez a rövid útmutató egy hotelindexet hoz létre, amelyet a szálloda adataival tölt be, és lekérdezéseket hajt végre. Ebben a lépésben definiálja az index mezőit. Minden meződefiníció tartalmaz egy nevet, adattípust és attribútumot, amely meghatározza a mező használatát.

Ez a példa a SearchIndexClient osztály szinkron metódusait használja az egyszerűség és az olvashatóság érdekében. Az éles forgatókönyvek esetén használjon aszinkron módszereket, hogy az alkalmazása skálázható és rugalmas maradjon. Használja például a CreateIndexAsync parancsota CreateIndex helyett.

A struktúrák meghatározása

Két segédosztályt hoz létre, Hotel.cs és Address.csmeghatározza egy szállodai dokumentum struktúráját és címét. Az Hotel osztály tartalmazza a szállodaazonosító, a név, a leírás, a kategória, a címkék, a parkolás, a felújítás dátuma, az értékelés és a cím mezőit. Az Address osztály tartalmazza a cím, a város, az állam/tartomány, az irányítószám és az ország/régió mezőit.

Az Azure.Search.Documents ügyfélkódtárban a SearchableField és a SimpleField használatával egyszerűsítheti a meződefiníciókat. Mindkettő segédosztály, amely létrehoz egy SearchFieldet , és potenciálisan egyszerűsítheti a kódot:

  • SimpleField bármilyen adattípus lehet, mindig nem kereshető (teljes szöveges keresési lekérdezések esetén figyelmen kívül hagyva), és lekérdezhető (nem rejtett). Más attribútumok alapértelmezés szerint ki vannak kapcsolva, de engedélyezhetők. A SimpleField használható dokumentumazonosítóként vagy olyan mezőkként, amelyeket csak szűrőkben, facettákban vagy pontozási profilokban használunk. Ha igen, alkalmazza a forgatókönyvhöz szükséges attribútumokat, például IsKey = true egy dokumentumazonosítót.

  • SearchableField karakterláncnak 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.

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 például explicit módon be kell állítani az előző mintában látható módon.

Keresési index létrehozása

Ebben Program.csa fájlban létrehoz egy SearchIndex-objektumot , majd meghívja a CreateOrUpdateIndex metódust az index kifejezéséhez a keresési szolgáltatásban. Az index tartalmaz egy SearchSuggestert is, amely engedélyezi az automatikus kiegészítést a megadott mezőkön.

// Create hotels-quickstart index
private static void CreateIndex(string indexName, SearchIndexClient searchIndexClient)
{
    FieldBuilder fieldBuilder = new FieldBuilder();
    var searchFields = fieldBuilder.Build(typeof(Hotel));

    var definition = new SearchIndex(indexName, searchFields);

    var suggester = new SearchSuggester("sg", new[] { "HotelName", "Category", "Address/City", "Address/StateProvince" });
    definition.Suggesters.Add(suggester);

    searchIndexClient.CreateOrUpdateIndex(definition);
}

Dokumentumok feltöltése az indexbe

Azure AI Keresés a szolgáltatásban tárolt tartalomra keres. Ebben a lépésben olyan JSON-dokumentumokat tölt be, amelyek megfelelnek a létrehozott szállodaindexnek.

A Azure AI Keresés a keresési dokumentumok olyan adatstruktúrák, amelyek egyaránt bemenetek az indexeléshez és a lekérdezések kimeneteihez. A külső adatforrásból származó dokumentumbemenetek lehetnek egy adatbázis sorai, a Azure Blob Storage blobjai vagy a lemezen lévő JSON-dokumentumok. Ebben a példában egy parancsikont követve közvetlenül beágyazhat JSON-dokumentumokat négy szállodába.

Dokumentumok feltöltésekor IndexDocumentsBatch objektumot kell használnia. Egy IndexDocumentsBatch objektum egy Actions gyűjteményt tartalmaz, melyek mindegyike tartalmaz egy dokumentumot és egy tulajdonságot, amely megmondja az Azure AI Keresés-nek, hogy milyen műveletet hajtson végre (feltöltés, összevonás, törlés vagy összevonás/feltöltés).

A Program.cs-ban dokumentumokból és indexműveletekből álló tömböt hoz létre, majd ezt a tömböt átadja a IndexDocumentsBatch metódusnak. Az alábbi dokumentumok megfelelnek a szállodai osztály által meghatározott, a hotels-quickstart indexnek.

// Upload documents in a single Upload request.
private static void UploadDocuments(SearchClient searchClient)
{
    IndexDocumentsBatch<Hotel> batch = IndexDocumentsBatch.Create(
        IndexDocumentsAction.Upload(
            new Hotel()
            {
                HotelId = "1",
                HotelName = "Stay-Kay City Hotel",
                Description = "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times 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.",
                Category = "Boutique",
                Tags = new[] { "view", "air conditioning", "concierge" },
                ParkingIncluded = false,
                LastRenovationDate = new DateTimeOffset(2022, 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"
                }
            }),
        // REDACTED FOR BREVITY
}

A UploadDocuments metódus létrehoz egy IndexDocumentsBatch fájlt, és meghívja az IndexDocumentst a SearchClienten a dokumentumok feltöltéséhez. Ez a gyorsindítás SearchClient-t szerez be SearchIndexClient-ból/ből a GetSearchClient segítségével, amely ugyanazokat a hitelesítő adatokat használja újra.

SearchClient ingesterClient = searchIndexClient.GetSearchClient(indexName);

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

Mivel ez a konzolalkalmazás egymás után futtatja az összes parancsot, a kód két másodperces várakozási időt ad hozzá az indexelés és a lekérdezések között.

// Wait 2 seconds for indexing to complete before starting queries (for demo and console-app purposes only)
Console.WriteLine("Waiting for indexing...\n");
System.Threading.Thread.Sleep(2000);

A két másodperces késés kompenzálja az indexelést, ami aszinkron, így az összes dokumentum indexelhető a lekérdezések végrehajtása előtt. A késésben történő kódolás általában csak demókban, tesztekben és mintaalkalmazásokban szükséges.

Az index lekérdezése

Az első dokumentum indexelése után azonnal lekérheti a lekérdezési eredményeket, de az index tényleges tesztelésének várnia kell, amíg az összes dokumentum indexel.

Ez a szakasz két funkciót ad hozzá: lekérdezési logikát és eredményeket. Lekérdezésekhez használja a Keresés metódust. Ez a metódus a keresési szöveget (a lekérdezési sztringet) és más beállításokat használja.

A SearchResults osztály az eredményeket jelöli.

Ebben Program.csa metódus a WriteDocuments keresési eredményeket a konzolon nyomtatja ki.

// Write search results to console
private static void WriteDocuments(SearchResults<Hotel> searchResults)
{
    foreach (SearchResult<Hotel> result in searchResults.GetResults())
    {
        Console.WriteLine(result.Document);
    }

    Console.WriteLine();
}

private static void WriteDocuments(AutocompleteResults autoResults)
{
    foreach (AutocompleteItem result in autoResults.Results)
    {
        Console.WriteLine(result.Text);
    }

    Console.WriteLine();
}

1. lekérdezési példa

A RunQueries metódus lekérdezéseket hajt végre, és eredményeket ad vissza. Az eredmények szállodaobjektumok. Ez a minta a metódus aláírását és az első lekérdezést mutatja be. Ez a lekérdezés bemutatja azt a Select paramétert, amely lehetővé teszi az eredmény megírását a dokumentum kijelölt mezőivel.

// Run queries, use WriteDocuments to print output
private static void RunQueries(SearchClient searchClient)
{
    SearchOptions options;
    SearchResults<Hotel> response;
    
    // Query 1
    Console.WriteLine("Query #1: Search on empty term '*' to return all documents, showing a subset of fields...\n");

    options = new SearchOptions()
    {
        IncludeTotalCount = true,
        Filter = "",
        OrderBy = { "" }
    };

    options.Select.Add("HotelId");
    options.Select.Add("HotelName");
    options.Select.Add("Rating");

    response = searchClient.Search<Hotel>("*", options);
    WriteDocuments(response);
    // REDACTED FOR BREVITY
}

2. lekérdezési példa

A második lekérdezésben keressen rá egy kifejezésre, adjon hozzá egy szűrőt, amely kiválasztja a 4-nél nagyobb dokumentumokat Rating , majd csökkenő sorrendben rendez Rating . A szűrő egy logikai kifejezés, amelyet egy index IsFilterable mezői alapján értékelnek ki. A szűrő lekérdezések tartalmazhatnak vagy kizárnak értékeket. Ezért nincs relevanciapont társítva egy szűrő lekérdezéshez.

// Query 2
Console.WriteLine("Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...\n");

options = new SearchOptions()
{
    Filter = "Rating gt 4",
    OrderBy = { "Rating desc" }
};

options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Rating");

response = searchClient.Search<Hotel>("hotels", options);
WriteDocuments(response);

3. lekérdezési példa

A harmadik lekérdezés egy teljes szöveges keresési művelet adott mezőkre való hatókörének bemutatását mutatja be searchFields.

// Query 3
Console.WriteLine("Query #3: Limit search to specific fields (pool in Tags field)...\n");

options = new SearchOptions()
{
    SearchFields = { "Tags" }
};

options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Tags");

response = searchClient.Search<Hotel>("pool", options);
WriteDocuments(response);

4. lekérdezési példa

A negyedik lekérdezés bemutatja facets, amely felhasználható egy összetett navigációs struktúra kialakítására.

// Query 4
Console.WriteLine("Query #4: Facet on 'Category'...\n");

options = new SearchOptions()
{
    Filter = ""
};

options.Facets.Add("Category");

options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Category");

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

5. lekérdezési példa

Az ötödik lekérdezésben adjon vissza egy adott dokumentumot. A dokumentumkeresés általában egy eredményhalmaz eseményére adott válasz OnClick .

// Query 5
Console.WriteLine("Query #5: Look up a specific document...\n");

Response<Hotel> lookupResponse;
lookupResponse = searchClient.GetDocument<Hotel>("3");

Console.WriteLine(lookupResponse.Value.HotelId);

6. lekérdezési példa

Az utolsó lekérdezés az automatikus kiegészítés szintaxisát jeleníti meg, szimulálva az sa részleges felhasználói bemenetét, amely két lehetséges egyezésre oldódik fel az sourceFields indexben definiált javaslathoz tartozóan.

// Query 6
Console.WriteLine("Query #6: Call Autocomplete on HotelName...\n");

var autoresponse = searchClient.Autocomplete("sa", "sg");
WriteDocuments(autoresponse);

Lekérdezések összegzése

Az előző lekérdezések több módon is egyeztetik a kifejezéseket a lekérdezésekben: teljes szöveges keresés, szűrők és automatikus kiegészítés.

A SearchClient.Search metódus teljes szöveges keresést és szűrőket végez. A searchText sztringben megadhat egy keresési lekérdezést, miközben a SearchOptions osztály Szűrő tulajdonságába egy szűrőkifejezést ad meg. Ha keresés nélkül szeretne szűrni, egyszerűen adja meg "*" a searchTextKeresési módszer paraméterét. Ha szűrés nélkül szeretne keresni, hagyja a Filter tulajdonságot beállítatlanul, vagy egyáltalán ne adja át a SearchOptions példányt.

Ebben a gyors útmutatóban az Azure AI Keresés Java-ügyfélkönyvtárát használja keresési index létrehozására, betöltésére és lekérdezésére teljes szöveges kereséshez, más néven kulcsszókereséshez.

A teljes szöveges keresés az Apache Lucene-t használja az indexeléshez és a lekérdezésekhez, valamint a BM25 rangsorolási algoritmust a pontozási eredményekhez. Ez a rövid útmutató a azure-search-sample-data GitHub adattár fiktív szállodai adatait használja az index feltöltéséhez.

Tipp.

Azonnal hozzá szeretne kezdeni? Töltse le a forráskódot GitHub.

Előfeltételek

Hozzáférés konfigurálása

Mielőtt hozzákezdene, győződjön meg arról, hogy rendelkezik hozzáféréssel a tartalomhoz és a műveletekhez a Azure AI Keresés. Ez a rövid útmutató a Microsoft Entra ID-t használja a hitelesítéshez és a szerepköralapú hozzáférés engedélyezéséhez. Szerepkörök hozzárendeléséhez tulajdonosnak vagy felhasználói hozzáférés-rendszergazdának kell lennie. Ha a szerepkörök nem megvalósíthatók, használja inkább a kulcsalapú hitelesítést .

Az ajánlott szerepköralapú hozzáférés konfigurálása:

  1. Engedélyezze a szerepköralapú hozzáférést a keresési szolgáltatáshoz.

  2. Rendelje hozzá a következő szerepköröket a felhasználói fiókjához.

    • Keresési szolgáltatás közreműködője

    • Keresési index adatszolgáltatója

    • Keresési index adatolvasó

Végpont lekérése

Minden Azure AI Keresés szolgáltatás rendelkezik egy endpoint, amely egy egyedi URL-cím, amely azonosítja és hálózati hozzáférést biztosít a szolgáltatáshoz. Egy későbbi szakaszban ezt a végpontot adja meg, hogy programozott módon csatlakozzon a keresési szolgáltatáshoz.

A végpont lekérése:

  1. Nyissa meg a keresési szolgáltatást az Azure Portalon.

  2. A bal oldali panelen válassza az Áttekintés lehetőséget.

  3. Jegyezze fel a végpontot, amelynek így kell kinéznie https://my-service.search.windows.net.

A környezet beállítása

  1. A Git használatával klónozza a mintaadattárat.

    git clone https://github.com/Azure-Samples/azure-search-java-samples
    
  2. Lépjen a gyors kezdés mappába.

    cd azure-search-java-samples/quickstart-keyword-search
    
  3. A src/main/java/azure/search/sample/App.java esetében cserélje le a searchServiceEndpoint helyőrző értékét a Get-végpontban beszerzett URL-címre.

  4. Telepítse a függőségeket.

    mvn clean dependency:copy-dependencies
    

    Ha a build befejeződött, ellenőrizze, hogy nem jelennek-e meg hibák a kimenetben.

  5. Microsoft Entra ID-vel történő kulcs nélküli hitelesítés esetén jelentkezzen be az Azure-fiókjába. Ha több előfizetéssel rendelkezik, válassza ki azt, amelyik a Azure AI Keresés szolgáltatást tartalmazza.

    az login
    

A kód futtatása

Állítsa össze és futtassa az alkalmazást.

javac -d target/classes -cp "target/dependency/*" src/main/java/azure/search/sample/*.java
java -cp "target/classes;target/dependency/*" azure.search.sample.App

Kimenet

A kimenetnek a következőhöz hasonlónak kell lennie:

Waiting for indexing...

Starting queries...

Query #1: Search on empty term '*' to return all documents, showing a subset of fields...

{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Address":{"City":"Atlanta"}}
{"HotelId":"2","HotelName":"Old Century Hotel","Address":{"City":"Sarasota"}}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Address":{"City":"San Antonio"}}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Address":{"City":"New York"}}

Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...

{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}

Query #3: Limit search to specific fields (pool in Tags field)...

{"HotelId":"2","HotelName":"Old Century Hotel","Tags":["pool","free wifi","concierge"]}

Query #4: Facet on 'Category'...

{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Category":"Suite"}
{"HotelId":"2","HotelName":"Old Century Hotel","Category":"Boutique"}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Category":"Boutique"}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Category":"Boutique"}

Query #5: Look up a specific document...

3

Query #6: Call Autocomplete on HotelName that starts with 's'...

stay
sublime

Complete.

A kód ismertetése

Megjegyzés:

Előfordulhat, hogy az ebben a szakaszban szereplő kódrészletek az olvashatóság érdekében módosultak. A teljes munka példához tekintse meg a forráskódot.

Most, hogy futtatta a kódot, bontsuk le a legfontosabb lépéseket:

  1. Keresési ügyfél létrehozása
  2. Keresési index létrehozása
  3. Dokumentumok feltöltése az indexbe
  4. Az index lekérdezése

Keresési ügyfél létrehozása

Ebben a fájlban App.javakét ügyfelet hoz létre:

Mindkét ügyfélnek szüksége van a szolgáltatásvégpontra és egy hitelesítő adatra a hitelesítéshez. Ebben a rövid útmutatóban a DefaultAzureCredential-t kulcsnélküli hitelesítéshez használod a Microsoft Entra ID-vel.

Keresési index létrehozása

Ez a rövid útmutató egy hotelindexet hoz létre, amelyet a szálloda adataival tölt be, és lekérdezéseket hajt végre. Ebben a lépésben definiálja az index mezőit. Minden meződefiníció tartalmaz egy nevet, adattípust és attribútumot, amely meghatározza a mező használatát.

Ez a példa a SearchIndexClient osztály szinkron metódusait használja az egyszerűség és az olvashatóság érdekében. Éles forgatókönyvek esetén azonban a SearchIndexAsyncClient osztály használatával skálázható és rugalmas maradjon az alkalmazás.

A struktúrák meghatározása

Két segédosztályt hoz létre, Hotel.java és Address.javameghatározza egy szállodai dokumentum struktúráját és címét. Az Hotel osztály tartalmazza a szállodaazonosító, a név, a leírás, a kategória, a címkék, a parkolás, a felújítás dátuma, az értékelés és a cím mezőit. Az Address osztály tartalmazza a cím, a város, az állam/tartomány, az irányítószám és az ország/régió mezőit.

Az azure-search-documents ügyfélkódtárban a SearchableField és a SimpleField használatával egyszerűsítheti a meződefiníciókat. Mindkettő olyan széljegyzet, amelyet mezőkre vagy metódusokra alkalmazhat a SearchField létrehozásához:

  • SimpleField bármilyen adattípus lehet, mindig nem kereshető (teljes szöveges keresési lekérdezések esetén figyelmen kívül hagyva), és lekérdezhető (nem rejtett). Más attribútumok alapértelmezés szerint ki vannak kapcsolva, de engedélyezhetők. A SimpleField használható dokumentumazonosítóként vagy olyan mezőkként, amelyeket csak szűrőkben, facettákban vagy pontozási profilokban használunk. Ha igen, alkalmazza a forgatókönyvhöz szükséges attribútumokat, például isKey = true egy dokumentumazonosítót.
  • SearchableField karakterláncnak 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.

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. Például az isFilterable, isSortable és isFacetable értéket explicit módon kell beállítani az előző mintában látható módon.

Keresési index létrehozása

Ebben App.javaa fájlban létrehoz egy SearchIndex-objektumot , majd meghívja a createOrUpdateIndex metódust az index kifejezéséhez a keresési szolgáltatásban. Az index tartalmaz egy SearchSuggestert is, amely engedélyezi az automatikus kiegészítést a megadott mezőkön.

// Create Search Index for Hotel model
searchIndexClient.createOrUpdateIndex(
    new SearchIndex(indexName, SearchIndexClient.buildSearchFields(Hotel.class, null))
    .setSuggesters(new SearchSuggester("sg", Arrays.asList("HotelName"))));

Dokumentumok feltöltése az indexbe

Azure AI Keresés a szolgáltatásban tárolt tartalomra keres. Ebben a lépésben olyan JSON-dokumentumokat tölt be, amelyek megfelelnek a létrehozott szállodaindexnek.

A Azure AI Keresés a keresési dokumentumok olyan adatstruktúrák, amelyek egyaránt bemenetek az indexeléshez és a lekérdezések kimeneteihez. A külső adatforrásból származó dokumentumbemenetek lehetnek egy adatbázis sorai, a Azure Blob Storage blobjai vagy a lemezen lévő JSON-dokumentumok. Ebben a példában egy parancsikont követve közvetlenül beágyazhat JSON-dokumentumokat négy szállodába.

Dokumentumok feltöltésekor IndexDocumentsBatch objektumot kell használnia. Az IndexDocumentsBatch objektumok az IndexActions gyűjteményét tartalmazzák, amelyek mindegyike tartalmaz egy dokumentumot és egy tulajdonságot, amely közli az Azure AI Keresés szolgáltatással, hogy milyen műveletet kell végrehajtania (feltöltés, egyesítés, törlés és mergeOrUpload).

A App.java-ban dokumentumokból és indexműveletekből álló tömböt hoz létre, majd ezt a tömböt átadja a IndexDocumentsBatch metódusnak. Az alábbi dokumentumok megfelelnek a szállodai osztály által meghatározott, a hotels-quickstart indexnek.

private static void uploadDocuments(SearchClient searchClient)
{
    var hotelList = new ArrayList<Hotel>();

    var hotel = new Hotel();
    hotel.hotelId = "1";
    hotel.hotelName = "Stay-Kay City Hotel";
    hotel.description = "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times 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.",
    hotel.category = "Boutique";
    hotel.tags = new String[] { "view", "air conditioning", "concierge" };
    hotel.parkingIncluded = false;
    hotel.lastRenovationDate = OffsetDateTime.of(LocalDateTime.of(LocalDate.of(2022, 1, 18), LocalTime.of(0, 0)), ZoneOffset.UTC);
    hotel.rating = 3.6;
    hotel.address = new Address();
    hotel.address.streetAddress = "677 5th Ave";
    hotel.address.city = "New York";
    hotel.address.stateProvince = "NY";
    hotel.address.postalCode = "10022";
    hotel.address.country = "USA";
    hotelList.add(hotel);
    
    // REDACTED FOR BREVITY

    var batch = new IndexDocumentsBatch<Hotel>();
    batch.addMergeOrUploadActions(hotelList);
    try
    {
        searchClient.indexDocuments(batch);
    }
    catch (Exception e)
    {
        e.printStackTrace();
        // If for some reason any documents are dropped during indexing, you can compensate by delaying and
        // retrying. This simple demo just logs failure and continues
        System.err.println("Failed to index some of the documents");
    }
}

A uploadDocuments metódus létrehoz egy IndexDocumentsBatch fájlt, és meghívja az indexDocuments parancsokat egy SearchClienten a dokumentumok feltöltéséhez. Ez a rövid útmutató a SearchClient elemet hozza létre önállóan a SearchClientBuilder használatával, amely külön beállítást igényel a végpont és a hitelesítő adatok számára.

uploadDocuments(searchClient);

Mivel ez a konzolalkalmazás egymás után futtatja az összes parancsot, a kód két másodperces várakozási időt ad hozzá az indexelés és a lekérdezések között.

// Wait 2 seconds for indexing to complete before starting queries (for demo and console-app purposes only)
System.out.println("Waiting for indexing...\n");
try
{
    Thread.sleep(2000);
}
catch (InterruptedException e)
{
}

A két másodperces késés kompenzálja az indexelést, ami aszinkron, így az összes dokumentum indexelhető a lekérdezések végrehajtása előtt. A késésben történő kódolás általában csak demókban, tesztekben és mintaalkalmazásokban szükséges.

Az index lekérdezése

Az első dokumentum indexelése után azonnal lekérheti a lekérdezési eredményeket, de az index tényleges tesztelésének várnia kell, amíg az összes dokumentum indexel.

Ez a szakasz két funkciót ad hozzá: lekérdezési logikát és eredményeket. Lekérdezésekhez használja a keresési módszert. Ez a metódus a keresési szöveget (a lekérdezési sztringet) és más beállításokat használja.

A SearchPagedIterable osztály az eredményeket jelöli.

Ebben App.javaa metódus a WriteDocuments keresési eredményeket a konzolon nyomtatja ki.

// Write search results to console
private static void WriteSearchResults(SearchPagedIterable searchResults)
{
    searchResults.iterator().forEachRemaining(result ->
    {
        Hotel hotel = result.getDocument(Hotel.class);
        System.out.println(hotel);
    });

    System.out.println();
}

// Write autocomplete results to console
private static void WriteAutocompleteResults(AutocompletePagedIterable autocompleteResults)
{
    autocompleteResults.iterator().forEachRemaining(result ->
    {
        String text = result.getText();
        System.out.println(text);
    });

    System.out.println();
}

1. lekérdezési példa

A RunQueries metódus lekérdezéseket hajt végre, és eredményeket ad vissza. Az eredmények szállodaobjektumok. Ez a minta a metódus aláírását és az első lekérdezést mutatja be. Ez a lekérdezés bemutatja azt a Select paramétert, amely lehetővé teszi az eredmény megírását a dokumentum kijelölt mezőivel.

// Run queries, use WriteDocuments to print output
private static void RunQueries(SearchClient searchClient)
{
    // Query 1
    System.out.println("Query #1: Search on empty term '*' to return all documents, showing a subset of fields...\n");

    SearchOptions options = new SearchOptions();
    options.setIncludeTotalCount(true);
    options.setFilter("");
    options.setOrderBy("");
    options.setSelect("HotelId", "HotelName", "Address/City");

    WriteSearchResults(searchClient.search("*", options, Context.NONE));
}

2. lekérdezési példa

A második lekérdezésben keressen rá egy kifejezésre, adjon hozzá egy szűrőt, amely kiválasztja a 4-nél nagyobb dokumentumokat Rating , majd csökkenő sorrendben rendez Rating . A szűrő egy olyan logikai kifejezés, amely az index szűrhető mezőire van kiértékelve. A szűrő lekérdezések tartalmazhatnak vagy kizárnak értékeket. Ezért nincs relevanciapont társítva egy szűrő lekérdezéshez.

// Query 2
System.out.println("Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...\n");

options = new SearchOptions();
options.setFilter("Rating gt 4");
options.setOrderBy("Rating desc");
options.setSelect("HotelId", "HotelName", "Rating");

WriteSearchResults(searchClient.search("hotels", options, Context.NONE));

3. lekérdezési példa

A harmadik lekérdezés egy teljes szöveges keresési művelet adott mezőkre való hatókörének bemutatását mutatja be searchFields.

// Query 3
System.out.println("Query #3: Limit search to specific fields (pool in Tags field)...\n");

options = new SearchOptions();
options.setSearchFields("Tags");

options.setSelect("HotelId", "HotelName", "Tags");

WriteSearchResults(searchClient.search("pool", options, Context.NONE));

4. lekérdezési példa

A negyedik lekérdezés bemutatja facets, amely felhasználható egy összetett navigációs struktúra kialakítására.

// Query 4
System.out.println("Query #4: Facet on 'Category'...\n");

options = new SearchOptions();
options.setFilter("");
options.setFacets("Category");
options.setSelect("HotelId", "HotelName", "Category");

WriteSearchResults(searchClient.search("*", options, Context.NONE));

5. lekérdezési példa

Az ötödik lekérdezésben adjon vissza egy adott dokumentumot. A dokumentumkeresés általában egy eredményhalmaz eseményére adott válasz OnClick .

// Query 5
System.out.println("Query #5: Look up a specific document...\n");

Hotel lookupResponse = searchClient.getDocument("3", Hotel.class);
System.out.println(lookupResponse.hotelId);
System.out.println();

6. lekérdezési példa

Az utolsó lekérdezés az automatikus kiegészítés szintaxisát mutatja be, ahol az s részleges felhasználói bemenet két lehetséges egyezésre vezet a javaslattevővel társított sourceFields indexben, amelyet definiáltál.

// Query 6
System.out.println("Query #6: Call Autocomplete on HotelName that starts with 's'...\n");

WriteAutocompleteResults(searchClient.autocomplete("s", "sg"));

Lekérdezések összegzése

Az előző lekérdezések több módon is egyeztetik a kifejezéseket a lekérdezésekben: teljes szöveges keresés, szűrők és automatikus kiegészítés.

A SearchClient.search metódus teljes szöveges keresést és szűrőket végez. A keresési lekérdezést a searchText sztringben, míg a SearchOptions osztály filter tulajdonságában egy szűrőkifejezést adhat át. Ha keresés nélkül szeretne szűrni, csak adja meg "*" a searchTextkeresési módszer paraméterét. Ha szűrés nélkül szeretne keresni, hagyja a filter tulajdonságot beállítatlanul, vagy egyáltalán ne adja át a SearchOptions példányt.

Ebben a rövid útmutatóban a JavaScripthez készült Azure AI Keresés ügyfélkönyvtárat használja a teljes szöveges keresés, más néven kulcsszókeresés keresési indexének létrehozására, betöltésére és lekérdezésére.

A teljes szöveges keresés az Apache Lucene-t használja az indexeléshez és a lekérdezésekhez, valamint a BM25 rangsorolási algoritmust a pontozási eredményekhez. Ez a rövid útmutató a azure-search-sample-data GitHub adattár fiktív szállodai adatait használja az index feltöltéséhez.

Tipp.

Azonnal hozzá szeretne kezdeni? Töltse le a forráskódot GitHub.

Előfeltételek

Hozzáférés konfigurálása

Mielőtt hozzákezdene, győződjön meg arról, hogy rendelkezik hozzáféréssel a tartalomhoz és a műveletekhez a Azure AI Keresés. Ez a rövid útmutató a Microsoft Entra ID-t használja a hitelesítéshez és a szerepköralapú hozzáférés engedélyezéséhez. Szerepkörök hozzárendeléséhez tulajdonosnak vagy felhasználói hozzáférés-rendszergazdának kell lennie. Ha a szerepkörök nem megvalósíthatók, használja inkább a kulcsalapú hitelesítést .

Az ajánlott szerepköralapú hozzáférés konfigurálása:

  1. Engedélyezze a szerepköralapú hozzáférést a keresési szolgáltatáshoz.

  2. Rendelje hozzá a következő szerepköröket a felhasználói fiókjához.

    • Keresési szolgáltatás közreműködője

    • Keresési index adatszolgáltatója

    • Keresési index adatolvasó

Végpont lekérése

Minden Azure AI Keresés szolgáltatás rendelkezik egy endpoint, amely egy egyedi URL-cím, amely azonosítja és hálózati hozzáférést biztosít a szolgáltatáshoz. Egy későbbi szakaszban ezt a végpontot adja meg, hogy programozott módon csatlakozzon a keresési szolgáltatáshoz.

A végpont lekérése:

  1. Nyissa meg a keresési szolgáltatást az Azure Portalon.

  2. A bal oldali panelen válassza az Áttekintés lehetőséget.

  3. Jegyezze fel a végpontot, amelynek így kell kinéznie https://my-service.search.windows.net.

A környezet beállítása

  1. A Git használatával klónozza a mintaadattárat.

    git clone https://github.com/Azure-Samples/azure-search-javascript-samples
    
  2. Lépjen a gyors kezdés mappába.

    cd azure-search-javascript-samples/quickstart-keyword-search
    
  3. A sample.env esetében cserélje le a SEARCH_API_ENDPOINT helyőrző értékét a Get-végpontban beszerzett URL-címre.

  4. Nevezze át sample.env erre: .env.

    mv sample.env .env
    
  5. Telepítse a függőségeket.

    npm install
    

    A telepítés befejezése után egy node_modules mappát kell látnia a project könyvtárban.

  6. Microsoft Entra ID-vel történő kulcs nélküli hitelesítés esetén jelentkezzen be az Azure-fiókjába. Ha több előfizetéssel rendelkezik, válassza ki azt, amelyik a Azure AI Keresés szolgáltatást tartalmazza.

    az login
    

A kód futtatása

Indítsa el az alkalmazást.

node index.js

Kimenet

A kimenetnek a következőhöz hasonlónak kell lennie:

Running Azure AI Search JavaScript quickstart...
Checking if index exists...
Deleting index...
Creating index...
Index named hotels-quickstart-js has been created.
Uploading documents...
Index operations succeeded: true
Querying the index...

Query #1 - search everything:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}
Result count: 4

Query #2 - search with filter, orderBy, and select:
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}

Query #3 - limit searchFields:
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}

Query #4 - limit searchFields and use facets:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}

Query #5 - Lookup document:
HotelId: 3; HotelName: Gastronomic Landscape Hotel

A kód ismertetése

Megjegyzés:

Előfordulhat, hogy az ebben a szakaszban szereplő kódrészletek az olvashatóság érdekében módosultak. A teljes munka példához tekintse meg a forráskódot.

Most, hogy futtatta a kódot, bontsuk le a legfontosabb lépéseket:

  1. Keresési ügyfél létrehozása
  2. Keresési index létrehozása
  3. Dokumentumok feltöltése az indexbe
  4. Az index lekérdezése

Keresési ügyfél létrehozása

Ebben a fájlban index.jskét ügyfelet hoz létre:

Mindkét ügyfélnek szüksége van a szolgáltatásvégpontra és egy hitelesítő adatra a hitelesítéshez. Ebben a rövid útmutatóban a DefaultAzureCredential-t kulcsnélküli hitelesítéshez használod a Microsoft Entra ID-vel.

const credential = new DefaultAzureCredential();
const indexClient = new SearchIndexClient(endpoint, credential);

Keresési index létrehozása

Ez a rövid útmutató egy hotelindexet hoz létre, amelyet a szálloda adataival tölt be, és lekérdezéseket hajt végre. Ebben a lépésben egy indexdefiníciót importál egy JSON-fájlból, és létrehozza az indexet a keresési szolgáltatásban.

A hotels_quickstart_index.json fájl meghatározza az indexsémát, beleértve a mezőket és azok attribútumait. Az egyes mezőket egy name azonosítja, és rendelkeznek egy meghatározott type-tel. Minden mező rendelkezik olyan indexattribútumok sorozatával, amelyek meghatározzák, hogy az Azure AI Keresés megkereshetők, megszűrhetők, rendezhetők és csoportosíthatók-e a mező alapján. A mezők többsége egyszerű adattípus, de néhány olyan Addressösszetett típus, amely lehetővé teszi, hogy gazdag adatstruktúrákat hozzon létre az indexben. A támogatott adattípusokról és indexattribútumokról az Index létrehozása (REST) című témakörben olvashat bővebben.

A következő kód importálja a hotels_quickstart_index.json-t, a index.js tetején, így a fő függvény hozzáférhet az index definícióhoz.

const indexDefinition = require('./hotels_quickstart_index.json');

Ez a gyorsindítás törli az indexet, ha már létezik, ami a tesztelési vagy demókódok szokásos gyakorlata. Az alábbi függvény megpróbálja törölni az indexet.

async function deleteIndexIfExists(indexClient, indexName) {
    try {
        await indexClient.deleteIndex(indexName);
        console.log('Deleting index...');
    } catch {
        console.log('Index does not exist yet.');
    }
}

Az alábbi kód kinyeri az index nevét az indexdefinícióból, és átadja a indexName-t, valamint a indexClient-t a deleteIndexIfExists() függvénynek.

const indexName = indexDefinition["name"];

console.log('Checking if index exists...');
await deleteIndexIfExists(indexClient, indexName);

Ezután a createIndex() függvénnyel hozza létre az indexet.

console.log('Creating index...');
let index = await indexClient.createIndex(indexDefinition);

console.log(`Index named ${index.name} has been created.`);

Dokumentumok feltöltése az indexbe

A Azure AI Keresés a dokumentumok olyan adatstruktúrák, amelyek egyaránt bemenetek az indexeléshez és a lekérdezésekből származó kimenetekhez. Ezeket az adatokat leküldheti az indexbe, vagy használhat indexelőt. Ebben a gyors kezdésben programozottan leküldi a dokumentumokat az indexbe.

A dokumentumbemenetek lehetnek egy adatbázis sorai, a Azure Blob Storage blobjai vagy a lemezen lévő JSON-dokumentumok, ahogyan ebben a rövid útmutatóban is látható. indexDefinition-hoz hasonlóan, importálja hotels.json-t a index.js tetején, hogy az adatok elérhetők legyenek a fő függvényben.

const hotelData = require('./hotels.json');

Ha adatokat szeretne indexelni a keresési indexbe, létre kell hoznia egy SearchClient-et. Miközben SearchIndexClient létrehoz és kezel egy indexet, feltölti a dokumentumokat, SearchClient és lekérdezi az indexet.

Ez a rövid útmutató a SearchClient megszerzéséhez a SearchIndexClient segítségével történik, a getSearchClient felhasználásával, amely újrahasználja ugyanazokat a hitelesítő adatokat.

const searchClient = indexClient.getSearchClient(indexName);

Az alábbi kód a metódus használatával tölti fel a dokumentumokat a mergeOrUploadDocuments() keresési indexbe, amely feltölti a dokumentumokat, vagy egyesíti őket egy meglévő dokumentummal, ha már létezik egy azonos kulccsal rendelkező dokumentum.

console.log('Uploading documents...');
let indexDocumentsResult = await searchClient.mergeOrUploadDocuments(hotelData['value']);

console.log(`Index operations succeeded: ${JSON.stringify(indexDocumentsResult.results[0].succeeded)}`);

Az index lekérdezése

Egy index létrehozásával és a feltöltött dokumentumokkal lekérdezéseket küldhet az indexnek. Ez a szakasz öt különböző lekérdezést küld a keresési indexnek, hogy bemutassa az Ön számára elérhető különböző lekérdezési funkciókat.

A lekérdezések a sendQueries() fő függvényben a következőképpen vannak megírva:

await sendQueries(searchClient);

A search() lekérdezések küldésének searchClient módja. Az első paraméter a keresési szöveg, a második pedig a keresési beállításokat adja meg.

1. lekérdezési példa

Az első lekérdezés minden *kereséssel egyenértékű, és az index három mezőjét választja ki. Ajánlott csak a szükséges mezőket használni select , mert a szükségtelen adatok visszakérése késést okozhat a lekérdezésekben.

A searchOptions lekérdezéshez tartozó includeTotalCounttrue értékre van állítva, ami a találatok számát adja vissza.

async function sendQueries(searchClient) {
    console.log('Query #1 - search everything:');
    let searchOptions = {
        includeTotalCount: true,
        select: ["HotelId", "HotelName", "Rating"]
    };

    let searchResults = await searchClient.search("*", searchOptions);
    for await (const result of searchResults.results) {
        console.log(`${JSON.stringify(result.document)}`);
    }
    console.log(`Result count: ${searchResults.count}`);

    // remaining queries go here
}

Az alább ismertetett többi lekérdezést is hozzá kell adni a sendQueries() függvényhez. Itt külön vannak elválasztva az olvashatóság érdekében.

2. lekérdezési példa

A következő lekérdezés megadja a keresési kifejezést "wifi" , és tartalmaz egy szűrőt, amely csak olyan eredményeket ad vissza, ahol az állapot egyenlő 'FL'. Az eredmények a szálloda Rating szerint vannak rendezve. A szűrő egy olyan logikai kifejezés, amelyet egy index szűrhető mezői értékelnek ki. A szűrő lekérdezések tartalmazhatnak vagy kizárnak értékeket. Ezért nincs relevanciapont társítva egy szűrő lekérdezéshez.

console.log('Query #2 - Search with filter, orderBy, and select:');
let state = 'FL';
searchOptions = {
    filter: odata`Address/StateProvince eq ${state}`,
    orderBy: ["Rating desc"],
    select: ["HotelId", "HotelName", "Rating"]
};

searchResults = await searchClient.search("wifi", searchOptions);
for await (const result of searchResults.results) {
    console.log(`${JSON.stringify(result.document)}`);
}

3. lekérdezési példa

A harmadik lekérdezés egyetlen kereshető mezőre korlátozza a keresést a searchFields paraméter használatával. Ez a megközelítés nagyszerű lehetőség arra, hogy hatékonyabbá tegye a lekérdezést, ha tudja, hogy csak bizonyos mezőkben lévő egyezések érdeklik.

console.log('Query #3 - Limit searchFields:');
searchOptions = {
    select: ["HotelId", "HotelName", "Rating"],
    searchFields: ["HotelName"]
};

searchResults = await searchClient.search("sublime cliff", searchOptions);
for await (const result of searchResults.results) {
    console.log(`${JSON.stringify(result.document)}`);
}

4. lekérdezési példa

Egy másik gyakori lehetőség, amit belefoglalhatunk a lekérdezésbe, az a facets. Az aspektusok segítségével szűrőket hozhat létre a felhasználói felületen, így a felhasználók könnyen megismerhetik, hogy milyen értékekre szűrhetnek le. Ez a lekérdezés a HotelName keresést is a mezőre korlátozza.

console.log('Query #4 - limit searchFields and use facets:');
searchOptions = {
    facets: ["Category"],
    select: ["HotelId", "HotelName", "Rating"],
    searchFields: ["HotelName"]
};

searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
    console.log(`${JSON.stringify(result.document)}`);
}

5. lekérdezési példa

A végső lekérdezés a getDocument() módszerét használja a searchClient. Így hatékonyan lekérhet egy dokumentumot a kulcsával.

console.log('Query #5 - Lookup document:');
let documentResult = await searchClient.getDocument(key='3')
console.log(`HotelId: ${documentResult.HotelId}; HotelName: ${documentResult.HotelName}`)

Lekérdezések összegzése

Az előző lekérdezések több módon is egyeztetik a kifejezéseket a lekérdezésekben: teljes szöveges keresés, szűrők és dokumentumkeresés.

A searchClient.search metódus teljes szöveges keresést és szűrőket végez. Egy keresési lekérdezést adhat meg a searchText sztringben, és szűrőkifejezést ad meg a(z) filter osztály SearchOptions tulajdonságában. Keresés nélküli szűréshez egyszerűen adja meg "*" a searchText metódus paraméterét search . Ha szűrés nélkül szeretne keresni, hagyja a filter tulajdonságot beállítatlanul, vagy egyáltalán ne adja át a SearchOptions példányt.

Ebben a rövid útmutatóban a Python Azure AI Keresés ügyfélkönyvtárát használja keresési index létrehozására, betöltésére és lekérdezésére teljes szöveges keresés, más néven kulcsszókeresés céljából.

A teljes szöveges keresés az Apache Lucene-t használja az indexeléshez és a lekérdezésekhez, valamint a BM25 rangsorolási algoritmust a pontozási eredményekhez. Ez a rövid útmutató a azure-search-sample-data GitHub adattár fiktív szállodai adatait használja az index feltöltéséhez.

Tipp.

Azonnal hozzá szeretne kezdeni? Töltse le a forráskódot GitHub.

Előfeltételek

Hozzáférés konfigurálása

Mielőtt hozzákezdene, győződjön meg arról, hogy rendelkezik hozzáféréssel a tartalomhoz és a műveletekhez a Azure AI Keresés. Ez a rövid útmutató a Microsoft Entra ID-t használja a hitelesítéshez és a szerepköralapú hozzáférés engedélyezéséhez. Szerepkörök hozzárendeléséhez tulajdonosnak vagy felhasználói hozzáférés-rendszergazdának kell lennie. Ha a szerepkörök nem megvalósíthatók, használja inkább a kulcsalapú hitelesítést .

Az ajánlott szerepköralapú hozzáférés konfigurálása:

  1. Engedélyezze a szerepköralapú hozzáférést a keresési szolgáltatáshoz.

  2. Rendelje hozzá a következő szerepköröket a felhasználói fiókjához.

    • Keresési szolgáltatás közreműködője

    • Keresési index adatszolgáltatója

    • Keresési index adatolvasó

Végpont lekérése

Minden Azure AI Keresés szolgáltatás rendelkezik egy endpoint, amely egy egyedi URL-cím, amely azonosítja és hálózati hozzáférést biztosít a szolgáltatáshoz. Egy későbbi szakaszban ezt a végpontot adja meg, hogy programozott módon csatlakozzon a keresési szolgáltatáshoz.

A végpont lekérése:

  1. Nyissa meg a keresési szolgáltatást az Azure Portalon.

  2. A bal oldali panelen válassza az Áttekintés lehetőséget.

  3. Jegyezze fel a végpontot, amelynek így kell kinéznie https://my-service.search.windows.net.

A környezet beállítása

  1. A Git használatával klónozza a mintaadattárat.

    git clone https://github.com/Azure-Samples/azure-search-python-samples
    
  2. Lépjen a gyorsindítási mappára, és nyissa meg a Visual Studio Code.

    cd azure-search-python-samples/Quickstart-Keyword-Search
    code .
    
  3. Nyisd meg azure-search-quickstart.ipynb.

  4. Nyomja le a Ctrl+Shift+P billentyűkombinációt, válassza a Jegyzetfüzet: Jegyzetfüzet kernel kiválasztása lehetőséget, és kövesse az utasításokat egy virtuális környezet létrehozásához.

    Ha elkészült, egy .venv mappát kell látnia a project könyvtárban.

  5. Futtassa az első kódcellát a szükséges csomagok telepítéséhez.

  6. A második kódcellában cserélje le a helyőrző értékét search_endpoint a Get végpontban beszerzett URL-címre, és futtassa a cellát.

  7. Microsoft Entra ID-vel történő kulcs nélküli hitelesítés esetén jelentkezzen be az Azure-fiókjába. Ha több előfizetéssel rendelkezik, válassza ki azt, amelyik a Azure AI Keresés szolgáltatást tartalmazza.

    az login
    

A kód futtatása

Futtassa a többi kódcellát egymás után egy index létrehozásához, dokumentumok feltöltéséhez és az index lekérdezéséhez.

Kimenet

Minden kódcella kinyomtatja a kimenetét a jegyzetfüzetbe. Az alábbi példa az első lekérdezés kimenete, egy üres keresés, amely az index összes dokumentumát visszaadja.

Total Documents Matching Query: 4
1.0
Gastronomic Landscape Hotel
['restaurant', 'bar', 'continental breakfast']
Description: The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.
1.0
Old Century Hotel
['pool', 'free wifi', 'concierge']
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. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.
1.0
Sublime Palace Hotel
['concierge', 'view', 'air conditioning']
Description: Sublime Palace 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 19th century resort, updated for every modern convenience.
1.0
Stay-Kay City Hotel
['view', 'air conditioning', 'concierge']
Description: This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times 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.

A kód ismertetése

Megjegyzés:

Előfordulhat, hogy az ebben a szakaszban szereplő kódrészletek az olvashatóság érdekében módosultak. A teljes munka példához tekintse meg a forráskódot.

Most, hogy futtatta a kódot, bontsuk le a legfontosabb lépéseket:

  1. Az ügyfelek létrehozása
  2. Keresési index létrehozása
  3. Dokumentumok feltöltése az indexbe
  4. Az index lekérdezése
  5. Az index eltávolítása

Az ügyfelek létrehozása

A jegyzetfüzet két ügyfelet hoz létre:

Mindkét ügyfélnek szüksége van a szolgáltatásvégpontra és a hitelesítő adatokra. Ebben a rövid útmutatóban a DefaultAzureCredential-t kulcsnélküli hitelesítéshez használod a Microsoft Entra ID-vel.

Keresési index létrehozása

Ez a rövid útmutató létrehoz egy szállodai indexet, amelyet betölt a szállodák adataival, és lekérdezéseket futtat rajta. Ebben a lépésben definiálja az index mezőit. Minden meződefiníció tartalmaz egy nevet, adattípust és attribútumot, amely meghatározza a mező használatát.

A jegyzetfüzet a SimpleField vett SearchableField, ComplexField és elemeket használja a séma meghatározásához. A támogatott adattípusokról és indexattribútumokról az Index létrehozása (REST) című témakörben olvashat bővebben.

# Create a search schema
index_client = SearchIndexClient(
    endpoint=search_endpoint, credential=credential)
fields = [
        SimpleField(name="HotelId", type=SearchFieldDataType.String, key=True),
        SearchableField(name="HotelName", type=SearchFieldDataType.String, sortable=True),
        SearchableField(name="Description", type=SearchFieldDataType.String, analyzer_name="en.lucene"),
        SearchableField(name="Category", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),

        SearchableField(name="Tags", collection=True, type=SearchFieldDataType.String, facetable=True, filterable=True),

        SimpleField(name="ParkingIncluded", type=SearchFieldDataType.Boolean, facetable=True, filterable=True, sortable=True),
        SimpleField(name="LastRenovationDate", type=SearchFieldDataType.DateTimeOffset, facetable=True, filterable=True, sortable=True),
        SimpleField(name="Rating", type=SearchFieldDataType.Double, facetable=True, filterable=True, sortable=True),

        ComplexField(name="Address", fields=[
            SearchableField(name="StreetAddress", type=SearchFieldDataType.String),
            SearchableField(name="City", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
            SearchableField(name="StateProvince", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
            SearchableField(name="PostalCode", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
            SearchableField(name="Country", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
        ])
    ]

scoring_profiles = []
suggester = [{'name': 'sg', 'source_fields': ['Tags', 'Address/City', 'Address/Country']}]

# Create the search index=
index = SearchIndex(name=index_name, fields=fields, suggesters=suggester, scoring_profiles=scoring_profiles)
result = index_client.create_or_update_index(index)
print(f' {result.name} created')

Dokumentumok feltöltése az indexbe

Azure AI Keresés a szolgáltatásban tárolt tartalomra keres. Ebben a lépésben olyan JSON-dokumentumokat tölt be, amelyek megfelelnek a létrehozott szállodaindexnek.

A Azure AI Keresés a dokumentumok olyan adatstruktúrák, amelyek egyaránt bemenetek az indexeléshez és a lekérdezésekből származó kimenetekhez. A jegyzetfüzet egy hasznos dokumentumot a szállodai adatokat tartalmazó szótárak listájaként definiál.

# Create a documents payload
documents = [
    {
    "@search.action": "upload",
    "HotelId": "1",
    "HotelName": "Stay-Kay City Hotel",
    "Description": "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times 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.",
    "Category": "Boutique",
    "Tags": [ "view", "air conditioning", "concierge" ],
    "ParkingIncluded": "false",
    "LastRenovationDate": "2020-01-18T00:00:00Z",
    "Rating": 3.60,
    "Address": {
        "StreetAddress": "677 5th Ave",
        "City": "New York",
        "StateProvince": "NY",
        "PostalCode": "10022",
        "Country": "USA"
        }
    },
    {
    "@search.action": "upload",
    "HotelId": "2",
    "HotelName": "Old Century Hotel",
    "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. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.",
    "Category": "Boutique",
    "Tags": [ "pool", "free wifi", "concierge" ],
    "ParkingIncluded": "false",
    "LastRenovationDate": "2019-02-18T00:00:00Z",
    "Rating": 3.60,
    "Address": {
        "StreetAddress": "140 University Town Center Dr",
        "City": "Sarasota",
        "StateProvince": "FL",
        "PostalCode": "34243",
        "Country": "USA"
        }
    },
    {
    "@search.action": "upload",
    "HotelId": "3",
    "HotelName": "Gastronomic Landscape Hotel",
    "Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
    "Category": "Suite",
    "Tags": [ "restaurant", "bar", "continental breakfast" ],
    "ParkingIncluded": "true",
    "LastRenovationDate": "2015-09-20T00:00:00Z",
    "Rating": 4.80,
    "Address": {
        "StreetAddress": "3393 Peachtree Rd",
        "City": "Atlanta",
        "StateProvince": "GA",
        "PostalCode": "30326",
        "Country": "USA"
        }
    },
    {
    "@search.action": "upload",
    "HotelId": "4",
    "HotelName": "Sublime Palace Hotel",
    "Description": "Sublime Palace 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 19th century resort, updated for every modern convenience.",
    "Category": "Boutique",
    "Tags": [ "concierge", "view", "air conditioning" ],
    "ParkingIncluded": "true",
    "LastRenovationDate": "2020-02-06T00:00:00Z",
    "Rating": 4.60,
    "Address": {
        "StreetAddress": "7400 San Pedro Ave",
        "City": "San Antonio",
        "StateProvince": "TX",
        "PostalCode": "78216",
        "Country": "USA"
        }
    }
]

A upload_documents metódus dokumentumokat ad hozzá az indexhez; létrehozza őket, ha nem léteznek, vagy frissíti őket, ha igen.

search_client = SearchClient(endpoint=search_endpoint,
                      index_name=index_name,
                      credential=credential)

try:
    result = search_client.upload_documents(documents=documents)
    print("Upload of new document succeeded: {}".format(result[0].succeeded))
except Exception as ex:
    print (ex.message)

Az index lekérdezése

Az első dokumentum indexelése után azonnal lekérheti a lekérdezési eredményeket, de az index tényleges tesztelésének várnia kell, amíg az összes dokumentum indexel.

Lekérdezések futtatásához használja a searchSearchClient metódust.

A jegyzetfüzetben található minta lekérdezések a gyakori mintákat mutatják be:

  • Üres keresés: Üres keresést hajt végre (search_text="*"a keresési pontszám = 1,0) tetszőleges dokumentumokból álló üres listát ad vissza. Mivel nincsenek feltételek, minden dokumentum szerepel az eredmények között.

  • Kifejezéskeresés: Egész kifejezéseket ad hozzá a keresési kifejezéshez (search_text="wifi"). Ez a lekérdezés azt határozza meg, hogy az eredmények csak azokat a mezőket tartalmazzák a select paraméterben. A visszaküldött mezők korlátozása minimálisra csökkenti a vezetéken visszaküldött adatok mennyiségét, és csökkenti a keresési késést.

  • Szűrt keresés: Szűrőkifejezést ad hozzá, amely csak a négynél nagyobb minősítésű szállodákat adja vissza csökkenő sorrendbe rendezve.

  • Mezős keresés: search_fields hozzáadása a lekérdezés végrehajtásának hatókörének adott mezőkre korlátozásához.

  • Faceted search: A keresési eredményekben talált pozitív találatok aspektusait hozza létre. Nincsenek nulla egyezések. Ha a keresési eredmények nem tartalmazzák a "wifi" kifejezést, akkor a "wifi" nem jelenik meg a strukturált navigációs struktúrában.

  • Dokumentumkeresés: A kulcs alapján visszaad egy dokumentumot. Ez a művelet akkor hasznos, ha részletezéseket szeretne megadni, amikor egy felhasználó kiválaszt egy elemet egy keresési eredményben.

  • Automatikus kiegészítés: Lehetséges találatokat biztosít, miközben a felhasználó a keresőmezőbe gépel. Az automatikus kiegészítés egy javaslatot (sg) használ annak megismerésére, hogy mely mezők tartalmaznak lehetséges egyezéseket a javaslattevő kérésekhez. Ebben a gyors útmutatóban ezek a mezők a Tags, Address/City, és Address/Country. Az automatikus kiegészítés szimulálásához az "sa" betűket részleges karakterláncként kell megadni. A autocomplete módszere visszaküldi a lehetséges kifejezési egyezéseket SearchClient alapján.

Az index eltávolítása

Ha befejezte ezt az indexet, törölheti azt a Clean up kódcella futtatásával. A szükségtelen indexek törlése helyet szabadít fel a gyorsútmutatók és oktatóanyagok végiglépéséhez.

try:
    result = index_client.delete_index(index_name)
    print ('Index', index_name, 'Deleted')
except Exception as ex:
    print (ex)

Ebben a gyorsútmutatóban az Azure AI Keresés JavaScript ügyfélkönyvtárát (amely kompatibilis a TypeScript-tel) használja keresési index létrehozására, betöltésére és lekérdezésére teljes szöveges kereséshez, más néven kulcsszó kereséshez.

A teljes szöveges keresés az Apache Lucene-t használja az indexeléshez és a lekérdezésekhez, valamint a BM25 rangsorolási algoritmust a pontozási eredményekhez. Ez a rövid útmutató a azure-search-sample-data GitHub adattár fiktív szállodai adatait használja az index feltöltéséhez.

Tipp.

Azonnal hozzá szeretne kezdeni? Töltse le a forráskódot GitHub.

Előfeltételek

Hozzáférés konfigurálása

Mielőtt hozzákezdene, győződjön meg arról, hogy rendelkezik hozzáféréssel a tartalomhoz és a műveletekhez a Azure AI Keresés. Ez a rövid útmutató a Microsoft Entra ID-t használja a hitelesítéshez és a szerepköralapú hozzáférés engedélyezéséhez. Szerepkörök hozzárendeléséhez tulajdonosnak vagy felhasználói hozzáférés-rendszergazdának kell lennie. Ha a szerepkörök nem megvalósíthatók, használja inkább a kulcsalapú hitelesítést .

Az ajánlott szerepköralapú hozzáférés konfigurálása:

  1. Engedélyezze a szerepköralapú hozzáférést a keresési szolgáltatáshoz.

  2. Rendelje hozzá a következő szerepköröket a felhasználói fiókjához.

    • Keresési szolgáltatás közreműködője

    • Keresési index adatszolgáltatója

    • Keresési index adatolvasó

Végpont lekérése

Minden Azure AI Keresés szolgáltatás rendelkezik egy endpoint, amely egy egyedi URL-cím, amely azonosítja és hálózati hozzáférést biztosít a szolgáltatáshoz. Egy későbbi szakaszban ezt a végpontot adja meg, hogy programozott módon csatlakozzon a keresési szolgáltatáshoz.

A végpont lekérése:

  1. Nyissa meg a keresési szolgáltatást az Azure Portalon.

  2. A bal oldali panelen válassza az Áttekintés lehetőséget.

  3. Jegyezze fel a végpontot, amelynek így kell kinéznie https://my-service.search.windows.net.

A környezet beállítása

  1. A Git használatával klónozza a mintaadattárat.

    git clone https://github.com/Azure-Samples/azure-search-javascript-samples
    
  2. Lépjen a gyors kezdés mappába.

    cd azure-search-javascript-samples/quickstart-keyword-search
    
  3. A sample.env esetében cserélje le a SEARCH_API_ENDPOINT helyőrző értékét a Get-végpontban beszerzett URL-címre.

  4. Nevezze át sample.env erre: .env.

    mv sample.env .env
    
  5. Telepítse a függőségeket.

    npm install
    npm install typescript @types/node --save-dev
    npm pkg set type=module
    

    A telepítés befejezése után egy node_modules mappát kell látnia a project könyvtárban.

  6. Microsoft Entra ID-vel történő kulcs nélküli hitelesítés esetén jelentkezzen be az Azure-fiókjába. Ha több előfizetéssel rendelkezik, válassza ki azt, amelyik a Azure AI Keresés szolgáltatást tartalmazza.

    az login
    

A kód futtatása

A mintakód alapértelmezés szerint JavaScriptet használ. A kód TypeScripttel való futtatásához:

  1. Hozzon létre egy nevű tsconfig.jsonfájlt, majd illessze be a következő kódot.

    {
      "compilerOptions": {
        "module": "NodeNext",
        "target": "ES2022",
        "moduleResolution": "NodeNext",
        "skipLibCheck": true,
        "strict": true,
        "resolveJsonModule": true
      },
      "include": ["*.ts"],
      "exclude": ["node_modules"]
    }
    
  2. Nevezze át a index.js fájlt index.ts-re, majd cserélje ki a tartalmát a következő kódra. Ez a kód a CommonJS szintaxist ES-modulimportálássá alakítja, amely a TypeScript-fordításhoz szükséges.

    // Import from the @azure/search-documents library
    import {
        SearchIndexClient,
        SearchClient,
        SearchFieldDataType,
        odata,
        SearchIndex
    } from "@azure/search-documents";
    
    // Import from the Azure Identity library
    import { DefaultAzureCredential } from "@azure/identity";
    
    // Importing the hotels sample data
    import hotelData from './hotels.json' with { type: "json" };
    
    // Load the .env file if it exists
    import "dotenv/config";
    
    // Defining the index definition
    const indexDefinition: SearchIndex = {
    	"name": "hotels-quickstart",
    	"fields": [
    		{
    			"name": "HotelId",
    			"type": "Edm.String" as SearchFieldDataType,
    			"key": true,
    			"filterable": true
    		},
    		{
    			"name": "HotelName",
    			"type": "Edm.String" as SearchFieldDataType,
    			"searchable": true,
    			"filterable": false,
    			"sortable": true,
    			"facetable": false
    		},
    		{
    			"name": "Description",
    			"type": "Edm.String" as SearchFieldDataType,
    			"searchable": true,
    			"filterable": false,
    			"sortable": false,
    			"facetable": false,
    			"analyzerName": "en.lucene"
    		},
    		{
    			"name": "Category",
    			"type": "Edm.String" as SearchFieldDataType,
    			"searchable": true,
    			"filterable": true,
    			"sortable": true,
    			"facetable": true
    		},
    		{
    			"name": "Tags",
    			"type": "Collection(Edm.String)",
    			"searchable": true,
    			"filterable": true,
    			"sortable": false,
    			"facetable": true
    		},
    		{
    			"name": "ParkingIncluded",
    			"type": "Edm.Boolean",
    			"filterable": true,
    			"sortable": true,
    			"facetable": true
    		},
    		{
    			"name": "LastRenovationDate",
    			"type": "Edm.DateTimeOffset",
    			"filterable": true,
    			"sortable": true,
    			"facetable": true
    		},
    		{
    			"name": "Rating",
    			"type": "Edm.Double",
    			"filterable": true,
    			"sortable": true,
    			"facetable": true
    		},
    		{
    			"name": "Address",
    			"type": "Edm.ComplexType",
    			"fields": [
    				{
    					"name": "StreetAddress",
    					"type": "Edm.String" as SearchFieldDataType,
    					"filterable": false,
    					"sortable": false,
    					"facetable": false,
    					"searchable": true
    				},
    				{
    					"name": "City",
    					"type": "Edm.String" as SearchFieldDataType,
    					"searchable": true,
    					"filterable": true,
    					"sortable": true,
    					"facetable": true
    				},
    				{
    					"name": "StateProvince",
    					"type": "Edm.String" as SearchFieldDataType,
    					"searchable": true,
    					"filterable": true,
    					"sortable": true,
    					"facetable": true
    				},
    				{
    					"name": "PostalCode",
    					"type": "Edm.String" as SearchFieldDataType,
    					"searchable": true,
    					"filterable": true,
    					"sortable": true,
    					"facetable": true
    				},
    				{
    					"name": "Country",
    					"type": "Edm.String" as SearchFieldDataType,
    					"searchable": true,
    					"filterable": true,
    					"sortable": true,
    					"facetable": true
    				}
    			]
    		}
    	],
    	"suggesters": [
    		{
    			"name": "sg",
    			"searchMode": "analyzingInfixMatching",
    			"sourceFields": [
    				"HotelName"
    			]
    		}
    	]
    };
    
    async function main() {
    
    	// Your search service endpoint (from .env file)
    	const searchServiceEndpoint = process.env.SEARCH_API_ENDPOINT || "";
    
    	// Use the recommended keyless credential instead of the AzureKeyCredential credential.
    	const credential = new DefaultAzureCredential();
    	//const credential = new AzureKeyCredential(Your search service admin key);
    
    	// Create a SearchIndexClient to send create/delete index commands
    	const searchIndexClient: SearchIndexClient = new SearchIndexClient(
    		searchServiceEndpoint,
    		credential
    	);
    
    	// Creating a search client to upload documents and issue queries
    	const indexName: string  = "hotels-quickstart";
        const searchClient: SearchClient<any> = searchIndexClient.getSearchClient(indexName);
    
        console.log('Checking if index exists...');
        await deleteIndexIfExists(searchIndexClient, indexName);
    
        console.log('Creating index...');
        let index: SearchIndex = await searchIndexClient.createIndex(indexDefinition);
        console.log(`Index named ${index.name} has been created.`);
    
        console.log('Uploading documents...');
        let indexDocumentsResult = await searchClient.mergeOrUploadDocuments(hotelData['value']);
        console.log(`Index operations succeeded: ${JSON.stringify(indexDocumentsResult.results[0].succeeded)} `);
    
        // waiting one second for indexing to complete (for demo purposes only)
        await sleep(1000);
    
        console.log('Querying the index...');
        console.log();
        await sendQueries(searchClient);
    }
    
    async function deleteIndexIfExists(searchIndexClient: SearchIndexClient, indexName: string) {
        try {
            await searchIndexClient.deleteIndex(indexName);
            console.log('Deleting index...');
        } catch {
            console.log('Index does not exist yet.');
        }
    }
    
    async function sendQueries(searchClient: SearchClient<any>) {
        // Query 1
        console.log('Query #1 - search everything:');
        let searchOptions: any = {
            includeTotalCount: true,
            select: ["HotelId", "HotelName", "Rating"]
        };
    
        let searchResults = await searchClient.search("*", searchOptions);
        for await (const result of searchResults.results) {
            console.log(`${JSON.stringify(result.document)}`);
        }
        console.log(`Result count: ${searchResults.count}`);
        console.log();
    
    
        // Query 2
        console.log('Query #2 - search with filter, orderBy, and select:');
        let state = 'FL';
        searchOptions = {
            filter: odata`Address/StateProvince eq ${state}`,
            orderBy: ["Rating desc"],
            select: ["HotelId", "HotelName", "Rating"]
        };
    
        searchResults = await searchClient.search("wifi", searchOptions);
        for await (const result of searchResults.results) {
            console.log(`${JSON.stringify(result.document)}`);
        }
        console.log();
    
        // Query 3
        console.log('Query #3 - limit searchFields:');
        searchOptions = {
            select: ["HotelId", "HotelName", "Rating"],
            searchFields: ["HotelName"]
        };
    
        searchResults = await searchClient.search("sublime palace", searchOptions);
        for await (const result of searchResults.results) {
            console.log(`${JSON.stringify(result.document)}`);
        }
        console.log();
    
        // Query 4
        console.log('Query #4 - limit searchFields and use facets:');
        searchOptions = {
            facets: ["Category"],
            select: ["HotelId", "HotelName", "Rating"],
            searchFields: ["HotelName"]
        };
    
        searchResults = await searchClient.search("*", searchOptions);
        for await (const result of searchResults.results) {
            console.log(`${JSON.stringify(result.document)}`);
        }
        console.log();
    
        // Query 5
        console.log('Query #5 - Lookup document:');
        let documentResult = await searchClient.getDocument('3');
        console.log(`HotelId: ${documentResult.HotelId}; HotelName: ${documentResult.HotelName}`);
        console.log();
    }
    
    function sleep(ms: number) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
    
    main().catch((err) => {
        console.error("The sample encountered an error:", err);
    });
    
  3. TypeScript átalakítása JavaScriptté.

    npx tsc
    
  4. Indítsa el az alkalmazást.

    node index.js
    

Kimenet

A kimenetnek a következőhöz hasonlónak kell lennie:

Checking if index exists...
Deleting index...
Creating index...
Index named hotels-quickstart has been created.
Uploading documents...
Index operations succeeded: true 
Querying the index...

Query #1 - search everything:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}
Result count: 4

Query #2 - search with filter, orderBy, and select:
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}

Query #3 - limit searchFields:
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}

Query #4 - limit searchFields and use facets:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}

Query #5 - Lookup document:
HotelId: 3; HotelName: Gastronomic Landscape Hotel

A kód ismertetése

Megjegyzés:

Előfordulhat, hogy az ebben a szakaszban szereplő kódrészletek az olvashatóság érdekében módosultak. A teljes munka példához tekintse meg a forráskódot.

Most, hogy futtatta a kódot, bontsuk le a legfontosabb lépéseket:

  1. Keresési ügyfél létrehozása
  2. Keresési index létrehozása
  3. Dokumentumok feltöltése az indexbe
  4. Az index lekérdezése

Keresési ügyfél létrehozása

Ebben a fájlban index.tskét ügyfelet hoz létre:

Mindkét ügyfélnek szüksége van a szolgáltatásvégpontra és egy hitelesítő adatra a hitelesítéshez. Ebben a rövid útmutatóban a DefaultAzureCredential-t kulcsnélküli hitelesítéshez használod a Microsoft Entra ID-vel.

const credential = new DefaultAzureCredential();
const searchIndexClient: SearchIndexClient = new SearchIndexClient(
    searchServiceEndpoint,
    credential
);

Keresési index létrehozása

Ez a rövid útmutató egy hotelindexet hoz létre, amelyet a szálloda adataival tölt be, és lekérdezéseket hajt végre. Ebben a lépésben definiálja az index mezőit.

A indexDefinition objektum határozza meg, hogyan működik Azure AI Keresés a következő lépésben betöltődő dokumentumokkal. Az egyes mezőket egy name azonosítja, és rendelkeznek egy meghatározott type-tel. Minden mező rendelkezik olyan indexattribútumok sorozatával, amelyek meghatározzák, hogy az Azure AI Keresés megkereshetők, megszűrhetők, rendezhetők és csoportosíthatók-e a mező alapján. A mezők többsége egyszerű adattípus, de néhány olyan Addressösszetett típus, amely lehetővé teszi, hogy gazdag adatstruktúrákat hozzon létre az indexben. A támogatott adattípusokról és indexattribútumokról az Index létrehozása (REST) című témakörben olvashat bővebben.

const indexDefinition: SearchIndex = {
    "name": "hotels-quickstart",
    "fields": [
        {
            "name": "HotelId",
            "type": "Edm.String" as SearchFieldDataType,
            "key": true,
            "filterable": true
        },
        {
            "name": "HotelName",
            "type": "Edm.String" as SearchFieldDataType,
            "searchable": true,
            "filterable": false,
            "sortable": true,
            "facetable": false
        },
        // REDACTED FOR BREVITY
    ],
    "suggesters": [
        {
            "name": "sg",
            "searchMode": "analyzingInfixMatching",
            "sourceFields": ["HotelName"]
        }
    ]
};

Ez a gyorsindítás törli az indexet, ha már létezik, ami a tesztelési vagy demókódok szokásos gyakorlata.

async function deleteIndexIfExists(searchIndexClient: SearchIndexClient, indexName: string) {
    try {
        await searchIndexClient.deleteIndex(indexName);
        console.log('Deleting index...');
    } catch {
        console.log('Index does not exist yet.');
    }
}

Ezután a metódussal létrejön az createIndex() index.

let index: SearchIndex = await searchIndexClient.createIndex(indexDefinition);

Dokumentumok feltöltése az indexbe

A Azure AI Keresés a dokumentumok olyan adatstruktúrák, amelyek egyaránt bemenetek az indexeléshez és a lekérdezésekből származó kimenetekhez. Ezeket az adatokat leküldheti az indexbe, vagy használhat indexelőt. Ebben a gyors kezdésben programozottan leküldi a dokumentumokat az indexbe.

A dokumentumbemenetek lehetnek egy adatbázis sorai, a Azure Blob Storage blobjai vagy a lemezen lévő JSON-dokumentumok, ahogyan ebben a rövid útmutatóban is látható. A szálloda adatai a fájl tetején lesznek importálva.

import hotelData from './hotels.json' with { type: "json" };

Ha adatokat szeretne indexelni a keresési indexbe, létre kell hoznia egy SearchClient-et. Miközben SearchIndexClient létrehoz és kezel egy indexet, feltölti a dokumentumokat, SearchClient és lekérdezi az indexet.

Ez a rövid útmutató a SearchClient megszerzéséhez a SearchIndexClient segítségével történik, a getSearchClient felhasználásával, amely újrahasználja ugyanazokat a hitelesítő adatokat.

const searchClient: SearchClient<any> = searchIndexClient.getSearchClient(indexName);

A mergeOrUploadDocuments() metódus feltölti a dokumentumokat, vagy egyesíti őket egy meglévő dokumentummal, ha már létezik ugyanazzal a kulccsal rendelkező dokumentum.

let indexDocumentsResult = await searchClient.mergeOrUploadDocuments(hotelData['value']);

Az index lekérdezése

Egy index létrehozásával és a feltöltött dokumentumokkal lekérdezéseket küldhet az indexnek. Ez a szakasz öt különböző lekérdezést küld a keresési indexnek, hogy bemutassa az Ön számára elérhető különböző lekérdezési funkciókat.

A lekérdezések a sendQueries() fő függvényben meghívott függvényben vannak megírva.

await sendQueries(searchClient);

A lekérdezéseket a rendszer a search() módszerével küldi el searchClient. Az első paraméter a keresési szöveg, a második pedig a keresési beállításokat adja meg.

1. lekérdezési példa

Az első lekérdezés minden kereséssel egyenértékű keresést végez *, és az index három mezőjét választja ki. Ajánlott csak a szükséges mezőket használni select , mert a szükségtelen adatok visszakérése késést okozhat a lekérdezésekben.

A searchOptions lekérdezéshez tartozó includeTotalCounttrue értékre van állítva, ami a találatok számát adja vissza.

console.log('Query #1 - search everything:');
let searchOptions: any = {
    includeTotalCount: true,
    select: ["HotelId", "HotelName", "Rating"]
};

let searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
    console.log(`${JSON.stringify(result.document)}`);
}
console.log(`Result count: ${searchResults.count}`);

2. lekérdezési példa

A következő lekérdezésben a keresési kifejezés "wifi" egy szűrővel van megadva, amely csak olyan eredményeket ad vissza, ahol az állapot egyenlő 'FL'. Az eredmények a szálloda Rating szerint vannak rendezve.

console.log('Query #2 - search with filter, orderBy, and select:');
let state = 'FL';
searchOptions = {
    filter: odata`Address/StateProvince eq ${state}`,
    orderBy: ["Rating desc"],
    select: ["HotelId", "HotelName", "Rating"]
};

searchResults = await searchClient.search("wifi", searchOptions);
for await (const result of searchResults.results) {
    console.log(`${JSON.stringify(result.document)}`);
}

3. lekérdezési példa

A keresés egyetlen kereshető mezőre korlátozódik a searchFields paraméter használatával. Ez a megközelítés nagyszerű lehetőség arra, hogy hatékonyabbá tegye a lekérdezést, ha tudja, hogy csak bizonyos mezőkben lévő egyezések érdeklik.

console.log('Query #3 - limit searchFields:');
searchOptions = {
    select: ["HotelId", "HotelName", "Rating"],
    searchFields: ["HotelName"]
};

searchResults = await searchClient.search("sublime palace", searchOptions);
for await (const result of searchResults.results) {
    console.log(`${JSON.stringify(result.document)}`);
}

4. lekérdezési példa

Egy másik gyakori lehetőség, amit belefoglalhatunk a lekérdezésbe, az a facets. Az aspektusok lehetővé teszik, hogy ön által irányított részletezéseket biztosítson a felhasználói felületen található eredményekből. A facetták eredményei az eredménypanelen jelölőnégyzetekké alakíthatók.

console.log('Query #4 - limit searchFields and use facets:');
searchOptions = {
    facets: ["Category"],
    select: ["HotelId", "HotelName", "Rating"],
    searchFields: ["HotelName"]
};

searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
    console.log(`${JSON.stringify(result.document)}`);
}

5. lekérdezési példa

A végső lekérdezés a getDocument() módszerét használja a searchClient. Így hatékonyan lekérhet egy dokumentumot a kulcsával.

console.log('Query #5 - Lookup document:');
let documentResult = await searchClient.getDocument('3');
console.log(`HotelId: ${documentResult.HotelId}; HotelName: ${documentResult.HotelName}`);

Lekérdezések összegzése

Az előző lekérdezések több módon is egyeztetik a kifejezéseket a lekérdezésekben: teljes szöveges keresés, szűrők és dokumentumkeresés.

A searchClient.search metódus teljes szöveges keresést és szűrőket végez. Egy keresési lekérdezést adhat meg a searchText sztringben, és szűrőkifejezést ad meg a(z) filter osztály SearchOptions tulajdonságában. Keresés nélküli szűréshez egyszerűen adja meg "*" a searchText metódus paraméterét search . Ha szűrés nélkül szeretne keresni, hagyja a filter tulajdonságot beállítatlanul, vagy egyáltalán ne adja át a SearchOptions példányt.

Ebben a rövid útmutatóban a Azure AI Keresés REST API-k használatával hozhat létre, tölthet be és kérdezhet le keresési indexet full-text search, más néven kulcsszókereséshez.

A teljes szöveges keresés az Apache Lucene-t használja az indexeléshez és a lekérdezésekhez, valamint a BM25 rangsorolási algoritmust a pontozási eredményekhez. Ez a rövid útmutató a azure-search-sample-data GitHub adattár fiktív szállodai adatait használja az index feltöltéséhez.

Tipp.

Azonnal hozzá szeretne kezdeni? Töltse le a forráskódot GitHub.

Előfeltételek

Hozzáférés konfigurálása

Mielőtt hozzákezdene, győződjön meg arról, hogy rendelkezik hozzáféréssel a tartalomhoz és a műveletekhez a Azure AI Keresés. Ez a rövid útmutató a Microsoft Entra ID-t használja a hitelesítéshez és a szerepköralapú hozzáférés engedélyezéséhez. Szerepkörök hozzárendeléséhez tulajdonosnak vagy felhasználói hozzáférés-rendszergazdának kell lennie. Ha a szerepkörök nem megvalósíthatók, használja inkább a kulcsalapú hitelesítést .

Az ajánlott szerepköralapú hozzáférés konfigurálása:

  1. Engedélyezze a szerepköralapú hozzáférést a keresési szolgáltatáshoz.

  2. Rendelje hozzá a következő szerepköröket a felhasználói fiókjához.

    • Keresési szolgáltatás közreműködője

    • Keresési index adatszolgáltatója

    • Keresési index adatolvasó

Végpont lekérése

Minden Azure AI Keresés szolgáltatás rendelkezik egy endpoint, amely egy egyedi URL-cím, amely azonosítja és hálózati hozzáférést biztosít a szolgáltatáshoz. Egy későbbi szakaszban ezt a végpontot adja meg, hogy programozott módon csatlakozzon a keresési szolgáltatáshoz.

A végpont lekérése:

  1. Nyissa meg a keresési szolgáltatást az Azure Portalon.

  2. A bal oldali panelen válassza az Áttekintés lehetőséget.

  3. Jegyezze fel a végpontot, amelynek így kell kinéznie https://my-service.search.windows.net.

A környezet beállítása

  1. A Git használatával klónozza a mintaadattárat.

    git clone https://github.com/Azure-Samples/azure-search-rest-samples
    
  2. Lépjen a gyorsindítási mappára, és nyissa meg a Visual Studio Code.

    cd azure-search-rest-samples/Quickstart-keyword-search
    code .
    
  3. A az-search-quickstart.rest esetében cserélje le a @baseUrl helyőrző értékét a Get-végpontban beszerzett URL-címre.

  4. Microsoft Entra ID-vel történő kulcs nélküli hitelesítés esetén jelentkezzen be az Azure-fiókjába. Ha több előfizetéssel rendelkezik, válassza ki azt, amelyik a Azure AI Keresés szolgáltatást tartalmazza.

    az login
    
  5. A Microsoft Entra ID kulcs nélküli hitelesítéséhez hozzon létre egy hozzáférési jogkivonatot.

    az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsv
    
  6. Cserélje le a helyőrző értékét @token az előző lépésből származó tokenre.

A kód futtatása

  1. A kapcsolat ### List existing indexes by nameellenőrzéséhez válassza a Kérés küldése lehetőséget.

    A válasznak egy szomszédos panelen kell megjelennie. Ha már rendelkezik meglévő indexel, azok szerepelnek a listában. Ellenkező esetben a lista üres. Ha a HTTP-kód az 200 OK, készen áll a folytatásra.

  2. A fennmaradó kéréseket egymás után elküldve hozzon létre egy indexet, töltsön fel dokumentumokat, és kérdezhesse le az indexet.

Kimenet

Minden kérés különböző JSON-t ad vissza a művelet alapján. A kulcs kimenete a ### Run a query esetében a következőképpen kell kinéznie:

{
  "value": [
    {
      "@search.score": 0.5575875,
      "HotelId": "3",
      "HotelName": "Gastronomic Landscape Hotel",
      "Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel's restaurant services.",
      "Tags": [
        "restaurant",
        "bar",
        "continental breakfast"
      ]
    }
  ]
}

A kód ismertetése

Megjegyzés:

Előfordulhat, hogy az ebben a szakaszban szereplő kódrészletek az olvashatóság érdekében módosultak. A teljes munka példához tekintse meg a forráskódot.

Most, hogy futtatta a kódot, bontsuk le a legfontosabb lépéseket:

  1. Keresési index létrehozása
  2. Dokumentumok feltöltése az indexbe
  3. Az index lekérdezése

Keresési index létrehozása

Mielőtt tartalmat ad hozzá Azure AI Keresés, létre kell hoznia egy indexet a tartalom tárolási és strukturált módjának meghatározásához. Az index elméletileg hasonló a relációs adatbázisok tábláihoz, de kifejezetten keresési műveletekhez, például teljes szöveges kereséshez lett kialakítva.

Ez a rövid útmutató meghívja a Indexes – Create (REST API) szolgáltatást, hogy létrehozza a(z) hotels-quickstart nevű keresési indexet és annak fizikai adatstruktúráit a keresési szolgáltatásban.

Az indexsémán belül a fields gyűjtemény meghatározza a szállodai dokumentumok struktúráját. Minden mező rendelkezik name adatokkal, type és attribútumokkal, amelyek meghatározóak a viselkedésére az indexelés és a lekérdezések során. A HotelId mező kulcsként van megjelölve, amelyhez Azure AI Keresés minden egyes dokumentum egyedi azonosítására van szükség egy indexben.

### Create a new index
POST {{baseUrl}}/indexes?api-version={{api-version}}  HTTP/1.1
Content-Type: application/json
Authorization: Bearer {{token}}

{
    "name": "hotels-quickstart",  
    "fields": [
        {"name": "HotelId", "type": "Edm.String", "key": true, "filterable": true},
        {"name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": true, "facetable": false},
        {"name": "Description", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzer": "en.lucene"},
        {"name": "Category", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
        {"name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "sortable": false, "facetable": true},
        {"name": "ParkingIncluded", "type": "Edm.Boolean", "filterable": true, "sortable": true, "facetable": true},
        {"name": "LastRenovationDate", "type": "Edm.DateTimeOffset", "filterable": true, "sortable": true, "facetable": true},
        {"name": "Rating", "type": "Edm.Double", "filterable": true, "sortable": true, "facetable": true},
        {"name": "Address", "type": "Edm.ComplexType", 
            "fields": [
            {"name": "StreetAddress", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "searchable": true},
            {"name": "City", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
            {"name": "StateProvince", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
            {"name": "PostalCode", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
            {"name": "Country", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true}
            ]
        }
    ]
}

Az indexséma főbb pontjai:

  • Sztring mezők alkalmazása révén a numerikus adatokat teljes szövegként kereshetővé teheti. Más támogatott adattípusok, például Edm.Int32a szűrhető, rendezhető, facetable és lekérdezhető adattípusok, de nem kereshetők.

  • A mezők többsége egyszerű adattípus, de összetett típusokat is definiálhat a beágyazott adatok, például a Address mező megjelenítéséhez.

  • A mezőattribútumok határozzák meg az engedélyezett műveleteket. A REST API-k alapértelmezés szerint számos műveletet engedélyeznek. Az összes sztring például kereshető és lekérdezhető. A REST API-k használata esetén előfordulhat, hogy csak akkor használ attribútumokat, ha le kell tiltania egy viselkedést.

Dokumentumok feltöltése az indexbe

Az újonnan létrehozott indexek üresek. Az index feltöltéséhez és kereséséhez fel kell töltenie az indexsémának megfelelő JSON-dokumentumokat.

A Azure AI Keresés a dokumentumok mind az indexelés, mind a lekérdezések kimenetei bemeneteként szolgálnak. Az egyszerűség kedvéért ez a rövid útmutató minta szállodai dokumentumokat tartalmaz beágyazott JSON-ként. Éles helyzetekben azonban a tartalmat gyakran lehívják a csatlakoztatott adatforrásokból, és indexelők használatával JSON formátumra alakítják.

Ez a rövid útmutató meghívja a Dokumentumok – Index (REST API) alkalmazást, hogy négy minta szállodai dokumentumot vegyen fel az indexbe. Az előző kéréshez képest az URI ki van terjesztve a docs gyűjteménnyel és a index művelettel.

A tömb minden dokumentuma value egy szállodát jelöl, és az indexsémának megfelelő mezőket tartalmaz. A @search.action paraméter meghatározza az egyes dokumentumokhoz végrehajtandó műveletet. Ez a példa azt használja upload, amely hozzáadja a dokumentumot, ha nem létezik, vagy frissíti a dokumentumot, ha létezik.

### Upload documents
POST {{baseUrl}}/indexes/hotels-quickstart/docs/index?api-version={{api-version}}  HTTP/1.1
Content-Type: application/json
Authorization: Bearer {{token}}

{
    "value": [
        {
            "@search.action": "upload",
            "HotelId": "1",
            "HotelName": "Stay-Kay City Hotel",
            "Description": "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times 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.",
            "Category": "Boutique",
            "Tags": [ "view", "air conditioning", "concierge" ],
            "ParkingIncluded": false,
            "LastRenovationDate": "2022-01-18T00:00:00Z",
            "Rating": 3.60,
            "Address": 
            {
                "StreetAddress": "677 5th Ave",
                "City": "New York",
                "StateProvince": "NY",
                "PostalCode": "10022",
                "Country": "USA"
            } 
        },
        {
            "@search.action": "upload",
            "HotelId": "2",
            "HotelName": "Old Century Hotel",
            "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. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.",
            "Category": "Boutique",
            "Tags": [ "pool", "free wifi", "concierge" ],
            "ParkingIncluded": false,
            "LastRenovationDate": "2019-02-18T00:00:00Z",
            "Rating": 3.60,
            "Address": 
            {
                "StreetAddress": "140 University Town Center Dr",
                "City": "Sarasota",
                "StateProvince": "FL",
                "PostalCode": "34243",
                "Country": "USA"
            } 
        },
        {
            "@search.action": "upload",
            "HotelId": "3",
            "HotelName": "Gastronomic Landscape Hotel",
            "Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
            "Category": "Suite",
            "Tags": [ "restaurant", "bar", "continental breakfast" ],
            "ParkingIncluded": true,
            "LastRenovationDate": "2015-09-20T00:00:00Z",
            "Rating": 4.80,
            "Address": 
            {
                "StreetAddress": "3393 Peachtree Rd",
                "City": "Atlanta",
                "StateProvince": "GA",
                "PostalCode": "30326",
                "Country": "USA"
            } 
        },
        {
            "@search.action": "upload",
            "HotelId": "4",
            "HotelName": "Sublime Palace Hotel",
            "Description": "Sublime Palace 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 19th century resort, updated for every modern convenience.",
            "Tags": [ "concierge", "view", "air conditioning" ],
            "ParkingIncluded": true,
            "LastRenovationDate": "2020-02-06T00:00:00Z",
            "Rating": 4.60,
            "Address": 
            {
                "StreetAddress": "7400 San Pedro Ave",
                "City": "San Antonio",
                "StateProvince": "TX",
                "PostalCode": "78216",
                "Country": "USA"
            }
        }
    ]
}

Az index lekérdezése

Most, hogy a dokumentumok betöltődnek az indexbe, teljes szöveges kereséssel megkereshet bizonyos kifejezéseket vagy kifejezéseket a mezőiken belül.

Ez a rövid útmutató meghívja a Dokumentumok – Search Post (REST API) szolgáltatást a keresési feltételeknek megfelelő szállodai dokumentumok megkereséséhez. Az URI mostantól a /docs/search műveletet célozza meg.

A teljes szöveges keresési kérelmek mindig tartalmaznak egy paramétert search , amely tartalmazza a lekérdezés szövegét. A lekérdezés szövege tartalmazhat egy vagy több kifejezést, kifejezést vagy operátort. searchEmellett más paramétereket is megadhat a keresési viselkedés és a találatok pontosításához.

A lekérdezés az egyes szállodai dokumentumokban és Description mezőkben Tags a "csatolt étterem" kifejezéseket keresi. A select paraméter korlátozza a válaszban visszaadott mezőket a következőre HotelId: , HotelName, Tagsés Description. A count paraméter az egyező dokumentumok teljes számát kéri le.

### Run a query
POST {{baseUrl}}/indexes/hotels-quickstart/docs/search?api-version={{api-version}}  HTTP/1.1
Content-Type: application/json
Authorization: Bearer {{token}}

{
    "search": "attached restaurant",
    "select": "HotelId, HotelName, Tags, Description",
    "searchFields": "Description, Tags",
    "count": true
}

Ebben a rövid útmutatóban a PowerShell és a Azure AI Keresés REST API-k használatával hozhat létre, tölthet be és kérdezhet le keresési indexet a full-text search kulcsszókereséshez.

A teljes szöveges keresés az Apache Lucene-t használja az indexeléshez és a lekérdezésekhez, valamint a BM25 rangsorolási algoritmust a pontozási eredményekhez. Ez a rövid útmutató a azure-search-sample-data GitHub adattár fiktív szállodai adatait használja az index feltöltéséhez.

Tipp.

Azonnal hozzá szeretne kezdeni? Töltse le a forráskódot GitHub.

Előfeltételek

Hozzáférés konfigurálása

Mielőtt hozzákezdene, győződjön meg arról, hogy rendelkezik hozzáféréssel a tartalomhoz és a műveletekhez a Azure AI Keresés. Ez a rövid útmutató a Microsoft Entra ID-t használja a hitelesítéshez és a szerepköralapú hozzáférés engedélyezéséhez. Szerepkörök hozzárendeléséhez tulajdonosnak vagy felhasználói hozzáférés-rendszergazdának kell lennie. Ha a szerepkörök nem megvalósíthatók, használja inkább a kulcsalapú hitelesítést .

Az ajánlott szerepköralapú hozzáférés konfigurálása:

  1. Engedélyezze a szerepköralapú hozzáférést a keresési szolgáltatáshoz.

  2. Rendelje hozzá a következő szerepköröket a felhasználói fiókjához.

    • Keresési szolgáltatás közreműködője

    • Keresési index adatszolgáltatója

    • Keresési index adatolvasó

Végpont lekérése

Minden Azure AI Keresés szolgáltatás rendelkezik egy endpoint, amely egy egyedi URL-cím, amely azonosítja és hálózati hozzáférést biztosít a szolgáltatáshoz. Egy későbbi szakaszban ezt a végpontot adja meg, hogy programozott módon csatlakozzon a keresési szolgáltatáshoz.

A végpont lekérése:

  1. Nyissa meg a keresési szolgáltatást az Azure Portalon.

  2. A bal oldali panelen válassza az Áttekintés lehetőséget.

  3. Jegyezze fel a végpontot, amelynek így kell kinéznie https://my-service.search.windows.net.

A környezet beállítása

  1. A Git használatával klónozza a mintaadattárat.

    git clone https://github.com/Azure-Samples/azure-search-powershell-samples
    
  2. Lépjen a gyors kezdés mappába.

    cd azure-search-powershell-samples/Quickstart
    
  3. Microsoft Entra ID-vel történő kulcs nélküli hitelesítés esetén jelentkezzen be az Azure-fiókjába. Ha több előfizetéssel rendelkezik, válassza ki azt, amelyik a Azure AI Keresés szolgáltatást tartalmazza.

    az login
    
  4. A azure-search-quickstart.ps1 esetében cserélje le a $baseUrl helyőrző értékét a Get-végpontban beszerzett URL-címre.

A kód futtatása

Ugyanazon a terminálon futtassa a következő PowerShell-szkriptet a gyorsindítás végrehajtásához.

.\azure-search-quickstart.ps1

Kimenet

A szkript törli a meglévő indexeket, létrehoz egy új indexet, feltölti a dokumentumokat, és több teljes szöveges keresési lekérdezést futtat. A kimenet az egyes műveletekhez tartozó teljes HTTP-kéréseket és válaszokat jeleníti meg. Az alábbi példa az "étterem wifije" kifejezés keresésekor adott választ mutatja be.

{
  "value": [
    {
      "@search.score": 0.6931472,
      "HotelName": "Old Century Hotel",
      "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. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.",
      "Tags": ["pool", "free wifi", "concierge"]
    },
    {
      "@search.score": 0.5575875,
      "HotelName": "Gastronomic Landscape Hotel",
      "Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel's restaurant services.",
      "Tags": ["restaurant", "bar", "continental breakfast"]
    }
  ]
}

A kód ismertetése

Megjegyzés:

Előfordulhat, hogy az ebben a szakaszban szereplő kódrészletek az olvashatóság érdekében módosultak. A teljes munka példához tekintse meg a forráskódot.

Most, hogy futtatta a kódot, bontsuk le a legfontosabb lépéseket:

  1. Keresési index létrehozása
  2. Dokumentumok feltöltése az indexbe
  3. Az index lekérdezése

Keresési index létrehozása

Mielőtt tartalmat ad hozzá Azure AI Keresés, létre kell hoznia egy indexet a tartalom tárolási és strukturált módjának meghatározásához. Az index elméletileg hasonló a relációs adatbázisok tábláihoz, de kifejezetten keresési műveletekhez, például teljes szöveges kereséshez lett kialakítva.

Ez a rövid útmutató először törli az azonos nevű meglévő indexeket, ami gyakori gyakorlat az ismétlődően futó tesztelési/bemutatókódok esetében.

Send-Request DELETE "$baseUrl/indexes/hotels-quickstart?api-version=2026-04-01" $headers

Ez a rövid útmutató ezután meghívja az Indexek – Létrehozás (REST API) szolgáltatást, hogy létrehozhasson egy névvel ellátott hotels-quickstart keresési indexet és annak fizikai adatstruktúráit a keresési szolgáltatásban.

$body = @"
{
    "name": "hotels-quickstart",
    "fields": [
        {"name": "HotelId", "type": "Edm.String", "key": true, "filterable": true},
        {"name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": true, "facetable": false},
        {"name": "Description", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzer": "en.lucene"},
        ...
    ]
}
"@

Send-RequestWithBody POST "$baseUrl/indexes?api-version=2026-04-01" $headers $body

Az indexsémán belül a fields gyűjtemény meghatározza a szállodai dokumentumok struktúráját. Minden mező rendelkezik name adatokkal, type és attribútumokkal, amelyek meghatározóak a viselkedésére az indexelés és a lekérdezések során. A HotelId mező kulcsként van megjelölve, amelyhez Azure AI Keresés minden egyes dokumentum egyedi azonosítására van szükség egy indexben.

Az indexséma főbb pontjai:

  • Sztring mezők alkalmazása révén a numerikus adatokat teljes szövegként kereshetővé teheti. Más támogatott adattípusok, például Edm.Int32a szűrhető, rendezhető, facetable és lekérdezhető adattípusok, de nem kereshetők.

  • A mezők többsége egyszerű adattípus, de összetett típusokat is definiálhat a beágyazott adatok, például a Address mező megjelenítéséhez.

  • A mezőattribútumok határozzák meg az engedélyezett műveleteket. A REST API-k alapértelmezés szerint számos műveletet engedélyeznek. Az összes sztring például kereshető és lekérdezhető. A REST API-k használata esetén előfordulhat, hogy csak akkor használ attribútumokat, ha le kell tiltania egy viselkedést.

Dokumentumok feltöltése az indexbe

Az újonnan létrehozott indexek üresek. Az index feltöltéséhez és kereséséhez fel kell töltenie az indexsémának megfelelő JSON-dokumentumokat.

A Azure AI Keresés a dokumentumok mind az indexelés, mind a lekérdezések kimenetei bemeneteként szolgálnak. Az egyszerűség kedvéért ez a rövid útmutató minta szállodai dokumentumokat tartalmaz beágyazott JSON-ként. Éles helyzetekben azonban a tartalmat gyakran lehívják a csatlakoztatott adatforrásokból, és indexelők használatával JSON formátumra alakítják.

Ez a rövid útmutató meghívja a Dokumentumok – Index (REST API) alkalmazást, hogy négy minta szállodai dokumentumot vegyen fel az indexbe. Az előző kéréshez képest az URI ki van terjesztve a docs gyűjteménnyel és a index művelettel.

$body = @"
{
    "value": [
        {
            "@search.action": "upload",
            "HotelId": "1",
            "HotelName": "Stay-Kay City Hotel",
            "Description": "This classic hotel is...",
            ...
        },
        ...
    ]
}
"@

Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/index?api-version=2026-04-01" $headers $body

A tömb minden dokumentuma value egy szállodát jelöl, és az indexsémának megfelelő mezőket tartalmaz. A @search.action paraméter meghatározza az egyes dokumentumokhoz végrehajtandó műveletet. Ez a példa azt használja upload, amely hozzáadja a dokumentumot, ha nem létezik, vagy frissíti a dokumentumot, ha létezik.

Az index lekérdezése

Most, hogy a dokumentumok betöltődnek az indexbe, teljes szöveges kereséssel megkereshet bizonyos kifejezéseket vagy kifejezéseket a mezőiken belül.

Ez a rövid útmutató meghívja a Dokumentumok – Search Post (REST API) szolgáltatást a keresési feltételeknek megfelelő szállodai dokumentumok megkereséséhez. Az URI a /docs/search műveletet célozza meg.

A teljes szöveges keresési kérelmek tartalmazzák search a lekérdezés szövegét tartalmazó paramétert, amely kifejezéseket, kifejezéseket vagy operátorokat tartalmazhat. A lekérdezés az egyes dokumentumok összes kereshető mezőjében keres. Az alábbi példák a gyakori lekérdezési mintákat mutatják be.

1. lekérdezési példa

Az alábbi lekérdezés az "étterem wifi" kifejezéseket keresi az összes kereshető mezőben. Alapértelmezés szerint Azure AI Keresés a keresési feltételeknek megfelelő dokumentumokat adja vissza.

$body = @"
{
    "search": "restaurant wifi",
    "select": "HotelName, Description, Tags"
}
"@

Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2026-04-01" $headers $body

A select paraméter korlátozza a válaszban visszaadott mezőket a következőre HotelName: , Descriptionés Tags.

2. lekérdezési példa

Az alábbi lekérdezés kifejezéssel filter csak a 4-nél nagyobb minősítésű szállodákat adja vissza.

$body = @"
{
    "search": "*",
    "filter": "Rating gt 4",
    "select": "HotelName,Rating"
}
"@

Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2026-04-01" $headers $body

A search paraméter az összes dokumentumnak megfelelő értékre *van állítva. A filter paraméter logikai feltételt alkalmaz az eredmények szűkítéséhez.

3. lekérdezési példa

Az alábbi lekérdezés a "butik" kifejezésre keres, és csak az első két találatot adja top vissza.

$body = @"
{
    "search": "boutique",
    "select": "HotelName,Category",
    "top": 2
}
"@

Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2026-04-01" $headers $body

4. lekérdezési példa

Az alábbi lekérdezés a "medence" kifejezésre keres, és a találatokat orderby csökkenő sorrendbe rendezi Rating alapján.

$body = @"
{
    "search": "pool",
    "select": "HotelName,Description,Tags,Rating",
    "orderby": "Rating desc"
}
"@

Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2026-04-01" $headers $body

Erőforrások tisztítása

Ha a saját előfizetésében dolgozik, érdemes befejezni egy projektet a már nem szükséges erőforrások eltávolításával. A meghagyott működő erőforrások pénzbe kerülhetnek.

Az Azure portálon válassza az Összes erőforrás vagy az Erőforráscsoportok lehetőséget a bal oldali panelen az erőforrások megkereséséhez és kezeléséhez. Az erőforrásokat egyenként törölheti, vagy törölheti az erőforráscsoportot az összes erőforrás egyidejű eltávolításához.

Ha ingyenes keresési szolgáltatást használ, ne feledje, hogy három indexre, indexelőre és adatforrásra korlátozódik. A portálon törölheti az egyes elemeket , hogy a korlát alatt maradjon.