Válasszon egy programozási nyelvet a következő lépéshez. Az Azure.Search.Documents ügyfélkódtárak az Azure SDK-kban érhetők el .NET, Python, Java és JavaScript/Typescript nyelven.
Hozzon létre egy konzolalkalmazást az Azure.Search.Documents ügyfélkódtár használatával a keresési indexek létrehozásához, betöltéséhez és lekérdezéséhez.
Másik lehetőségként letöltheti a forráskódot, hogy egy kész projekttel kezdjen, vagy kövesse az alábbi lépéseket a saját létrehozásához.
Saját környezet beállítása
Indítsa el a Visual Studiót, és hozzon létre egy új projektet egy konzolalkalmazáshoz.
A NuGet-Csomagkezelő eszközökben >válassza a Megoldáshoz készült NuGet-csomagok kezelése... lehetőséget.
Válassza a Tallózás lehetőséget.
Keressen rá az Azure.Search.Documents csomagra, és válassza a 11.0-s vagy újabb verziót.
Válassza a Telepítés lehetőséget a szerelvény projekthez és megoldáshoz való hozzáadásához.
Keresési ügyfél létrehozása
A Program.cs módosítsa a névteret AzureSearch.SDK.Quickstart.v11
a következőre, majd adja hozzá a következő using
irányelveket.
using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.Models;
Másolja a következő kódot két ügyfél létrehozásához. A SearchIndexClient létrehozza az indexet, és a SearchClient betölt és lekérdez egy meglévő indexet. Mindkettőnek szüksége van a szolgáltatásvégpontra és egy rendszergazdai API-kulcsra a létrehozási/törlési jogosultságokkal való hitelesítéshez.
Mivel a kód létrehozza az URI-t, csak a keresési szolgáltatás nevét adja meg a serviceName
tulajdonságban.
static void Main(string[] args)
{
string serviceName = "<your-search-service-name>";
string apiKey = "<your-search-service-admin-api-key>";
string indexName = "hotels-quickstart";
// Create a SearchIndexClient to send create/delete index commands
Uri serviceEndpoint = new Uri($"https://{serviceName}.search.windows.net/");
AzureKeyCredential credential = new AzureKeyCredential(apiKey);
SearchIndexClient adminClient = new SearchIndexClient(serviceEndpoint, credential);
// Create a SearchClient to load and query documents
SearchClient srchclient = new SearchClient(serviceEndpoint, indexName, credential);
. . .
}
Index létrehozása
Ez a rövid útmutató létrehoz egy hotelindexet, amelyet betölt a szálloda adataival, és lekérdezéseket hajt végre. Ebben a lépésben határozza meg az index mezőit. Minden meződefiníció tartalmaz egy nevet, adattípust és attribútumot, amely meghatározza a mező használatát.
Ebben a példában az Azure.Search.Documents kódtár szinkron metódusait használjuk az egyszerűség és az olvashatóság érdekében. Éles forgatókönyvek esetén azonban aszinkron módszereket kell használnia az alkalmazás skálázható és rugalmas állapotának megőrzéséhez. Például a CreateIndexAsyncet használná a CreateIndex helyett.
Üres osztálydefiníció hozzáadása a projekthez: Hotel.cs
Másolja a következő kódot a Hotel.cs egy szállodai dokumentum szerkezetének meghatározásához. A mező attribútumai határozzák meg, hogyan használják azt egy alkalmazásban. Az attribútumot például minden olyan mezőhöz hozzá kell rendelni, IsFilterable
amely egy szűrőkifejezést támogat.
using System;
using System.Text.Json.Serialization;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
namespace AzureSearch.Quickstart
{
public partial class Hotel
{
[SimpleField(IsKey = true, IsFilterable = true)]
public string HotelId { get; set; }
[SearchableField(IsSortable = true)]
public string HotelName { get; set; }
[SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnLucene)]
public string Description { get; set; }
[SearchableField(AnalyzerName = LexicalAnalyzerName.Values.FrLucene)]
[JsonPropertyName("Description_fr")]
public string DescriptionFr { get; set; }
[SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public string Category { get; set; }
[SearchableField(IsFilterable = true, IsFacetable = true)]
public string[] Tags { get; set; }
[SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public bool? ParkingIncluded { get; set; }
[SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public DateTimeOffset? LastRenovationDate { get; set; }
[SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public double? Rating { get; set; }
[SearchableField]
public Address Address { get; set; }
}
}
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ő a SearchField származéka, és potenciálisan egyszerűsítheti a kódot:
SimpleField
bármilyen adattípus lehet, mindig nem kereshető (a teljes szöveges keresési lekérdezések figyelmen kívül hagyják), és lekérdezhető (nem rejtett). Más attribútumok alapértelmezés szerint ki vannak kapcsolva, de engedélyezhetők. Használhat SimpleField
dokumentumazonosítókat vagy mezőket, amelyeket csak szűrőkben, aspektusokban vagy pontozási profilokban használ. Ha igen, mindenképpen alkalmazza a forgatókönyvhöz szükséges attribútumokat, például IsKey = true
egy dokumentumazonosítót. További információ: SimpleFieldAttribute.cs a forráskódban.
SearchableField
sztringnek kell lennie, és mindig kereshető és lekérdezhető. Más attribútumok alapértelmezés szerint ki vannak kapcsolva, de engedélyezhetők. Mivel ez a mezőtípus kereshető, támogatja a szinonimákat és az elemző tulajdonságainak teljes kiegészítését. További információ: SearchableFieldAttribute.cs a forráskódban.
Akár az alapszintű SearchField
API-t, akár az egyik segédmodellt használja, explicit módon engedélyeznie kell a szűrési, aspektus- és rendezési attribútumokat. Az IsFilterable, az IsSortable és az IsFacetable attribútumot például explicit módon kell hozzárendelni az előző mintában látható módon.
Adjon hozzá egy második üres osztálydefiníciót a projekthez: Address.cs. Másolja a következő kódot az osztályba.
using Azure.Search.Documents.Indexes;
namespace AzureSearch.Quickstart
{
public partial class Address
{
[SearchableField(IsFilterable = true)]
public string StreetAddress { get; set; }
[SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public string City { get; set; }
[SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public string StateProvince { get; set; }
[SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public string PostalCode { get; set; }
[SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public string Country { get; set; }
}
}
Hozzon létre még két osztályt: Hotel.Methods.cs és Address.Methods.cs felülbírálásokhoz ToString()
. Ezek az osztályok a keresési eredmények megjelenítésére szolgálnak a konzol kimenetében. Ezeknek az osztályoknak a tartalmát ebben a cikkben nem találja meg, de a kódot a GitHub fájljaiból másolhatja.
A Program.cs hozzon létre egy SearchIndex-objektumot , majd hívja meg a CreateIndex 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 adminClient)
{
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);
adminClient.CreateOrUpdateIndex(definition);
}
Dokumentumok betöltése
Az Azure AI Search a szolgáltatásban tárolt tartalmakon keres. Ebben a lépésben olyan JSON-dokumentumokat fog betölteni, amelyek megfelelnek az imént létrehozott szállodaindexnek.
Az Azure AI Searchben a keresési dokumentumok olyan adatstruktúrák, amelyek egyaránt bemenetek az indexeléshez és a lekérdezésekből származó kimenetekhez. A külső adatforrásból származó dokumentumbemenetek lehetnek egy adatbázis sorai, blobok a Blob Storage-ban vagy a lemezen lévő JSON-dokumentumok. Ebben a példában egy parancsikont hozunk létre, és négy szállodához ágyazunk be JSON-dokumentumokat magában a kódban.
Dokumentumok feltöltésekor IndexDocumentsBatch objektumot kell használnia. Az IndexDocumentsBatch
objektumok műveletek gyűjteményét tartalmazzák, amelyek mindegyike tartalmaz egy dokumentumot és egy tulajdonságot, amely közli az Azure AI Search szolgáltatással, hogy milyen műveletet kell végrehajtania (feltöltés, egyesítés, törlés és mergeOrUpload).
A Program.cs hozzon létre egy dokumentum- és indexműveleteket tartalmazó tömböt, majd adja át a tömböt a következőnek IndexDocumentsBatch
: . 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 = "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
DescriptionFr = "L'hôtel est idéalement situé sur la principale artère commerciale de la ville en plein cœur de New York. A quelques minutes se trouve la place du temps et le centre historique de la ville, ainsi que d'autres lieux d'intérêt qui font de New York l'une des villes les plus attractives et cosmopolites de l'Amérique.",
Category = "Boutique",
Tags = new[] { "pool", "air conditioning", "concierge" },
ParkingIncluded = false,
LastRenovationDate = new DateTimeOffset(1970, 1, 18, 0, 0, 0, TimeSpan.Zero),
Rating = 3.6,
Address = new Address()
{
StreetAddress = "677 5th Ave",
City = "New York",
StateProvince = "NY",
PostalCode = "10022",
Country = "USA"
}
}),
IndexDocumentsAction.Upload(
new Hotel()
{
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.",
DescriptionFr = "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
Category = "Boutique",
Tags = new[] { "pool", "free wifi", "concierge" },
ParkingIncluded = false,
LastRenovationDate = new DateTimeOffset(1979, 2, 18, 0, 0, 0, TimeSpan.Zero),
Rating = 3.60,
Address = new Address()
{
StreetAddress = "140 University Town Center Dr",
City = "Sarasota",
StateProvince = "FL",
PostalCode = "34243",
Country = "USA"
}
}),
IndexDocumentsAction.Upload(
new Hotel()
{
HotelId = "3",
HotelName = "Gastronomic Landscape Hotel",
Description = "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
DescriptionFr = "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
Category = "Resort and Spa",
Tags = new[] { "air conditioning", "bar", "continental breakfast" },
ParkingIncluded = true,
LastRenovationDate = new DateTimeOffset(2015, 9, 20, 0, 0, 0, TimeSpan.Zero),
Rating = 4.80,
Address = new Address()
{
StreetAddress = "3393 Peachtree Rd",
City = "Atlanta",
StateProvince = "GA",
PostalCode = "30326",
Country = "USA"
}
}),
IndexDocumentsAction.Upload(
new Hotel()
{
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 Palace is part of a lovingly restored 1800 palace.",
DescriptionFr = "Le Sublime Palace Hotel est situé au coeur du centre historique de sublime dans un quartier extrêmement animé et vivant, à courte distance de marche des sites et monuments de la ville et est entouré par l'extraordinaire beauté des églises, des bâtiments, des commerces et Monuments. Sublime Palace fait partie d'un Palace 1800 restauré avec amour.",
Category = "Boutique",
Tags = new[] { "concierge", "view", "24-hour front desk service" },
ParkingIncluded = true,
LastRenovationDate = new DateTimeOffset(1960, 2, 06, 0, 0, 0, TimeSpan.Zero),
Rating = 4.60,
Address = new Address()
{
StreetAddress = "7400 San Pedro Ave",
City = "San Antonio",
StateProvince = "TX",
PostalCode = "78216",
Country = "USA"
}
})
);
try
{
IndexDocumentsResult result = searchClient.IndexDocuments(batch);
}
catch (Exception)
{
// If for some reason any documents are dropped during indexing, you can compensate by delaying and
// retrying. This simple demo just logs the failed document keys and continues.
Console.WriteLine("Failed to index some of the documents: {0}");
}
}
Az IndexDocumentsBatch objektum inicializálása után elküldheti azt az indexbe a SearchClient objektum IndexDocuments meghívásával.
Adja hozzá a következő sorokat a következőhöz Main()
: A dokumentumok betöltése a SearchClient használatával történik, de a művelethez rendszergazdai jogosultságok is szükségesek a szolgáltatáson, amely általában a SearchIndexClienthez van társítva. A művelet beállításának egyik módja a SearchClient beolvasása SearchIndexClient
(adminClient
ebben a példában).
SearchClient ingesterClient = adminClient.GetSearchClient(indexName);
// Load documents
Console.WriteLine("{0}", "Uploading documents...\n");
UploadDocuments(ingesterClient);
Mivel ez egy konzolalkalmazás, amely az összes parancsot egymás után futtatja, adjon hozzá 2 másodperces várakozási időt 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 2 másodperces késleltetés kompenzálja az indexelést, amely 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.
Keresés az indexekben
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.
A Program.cs hozzon létre egy metódust WriteDocuments
, amely kinyomtatja a keresési eredményeket a konzolon.
// 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();
}
Hozzon létre egy metódust RunQueries
a lekérdezések végrehajtásához és az eredmények visszaadásához. Az eredmények hotelobjektumok. Ez a minta a metódus aláírását és az első lekérdezést mutatja be. Ez a lekérdezés bemutatja 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 srchclient)
{
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("Address/City");
response = srchclient.Search<Hotel>("*", options);
WriteDocuments(response);
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 minősítést tartalmazó dokumentumokat, majd csökkenő sorrendben rendezi az értékelés szerint. A szűrő egy logikai kifejezés, amelyet egy index IsFilterable mezőinek alapján értékel ki a program. 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 = srchclient.Search<Hotel>("hotels", options);
WriteDocuments(response);
A harmadik lekérdezés egy teljes szöveges keresési művelet adott mezőkre való hatóköré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 = srchclient.Search<Hotel>("pool", options);
WriteDocuments(response);
A negyedik lekérdezés bemutatja facets
, hogy milyen strukturált navigációs szerkezetek hozhatók létre.
// 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 = srchclient.Search<Hotel>("*", options);
WriteDocuments(response);
Az ötödik lekérdezésben adjon vissza egy adott dokumentumot. A dokumentumkeresés általában egy eredményhalmaz eseményére OnClick
adott válasz.
// Query 5
Console.WriteLine("Query #5: Look up a specific document...\n");
Response<Hotel> lookupResponse;
lookupResponse = srchclient.GetDocument<Hotel>("3");
Console.WriteLine(lookupResponse.Value.HotelId);
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 az indexben definiált javaslathoz társított forrásmezőkben két lehetséges egyezésre oldható fel.
// Query 6
Console.WriteLine("Query #6: Call Autocomplete on HotelName that starts with 'sa'...\n");
var autoresponse = srchclient.Autocomplete("sa", "sg");
WriteDocuments(autoresponse);
Hozzáadás RunQueries
a fájlhoz Main()
// Call the RunQueries method to invoke a series of queries
Console.WriteLine("Starting queries...\n");
RunQueries(srchclient);
// End the program
Console.WriteLine("{0}", "Complete. Press any key to end this program...\n");
Console.ReadKey();
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 teljes szöveges keresést és a szűrőket a SearchClient.Search metódussal hajtja végre. A keresési lekérdezések átadhatók a sztringbensearchText
, míg egy szűrőkifejezés átadható a SearchOptions osztály Szűrő tulajdonságában. Ha keresés nélkül szeretne szűrni, egyszerűen adja meg "*"
a searchText
Keresési módszer paraméterét. Ha szűrés nélkül szeretne keresni, hagyja meg a Filter
tulajdonságot, vagy egyáltalán ne adja át a példányt SearchOptions
.
A program futtatása
Nyomja le az F5 billentyűt az alkalmazás újraépítéséhez és a program teljes futtatásához.
A kimenet tartalmazza a Console.WriteLine üzeneteit, a lekérdezési információk és eredmények hozzáadásával.
A Pythonhoz készült Azure SDK-ban jupyter-jegyzetfüzet és azure-search-documents kódtár használata keresési indexek létrehozásához, betöltéséhez és lekérdezéséhez.
Másik lehetőségként letöltheti és futtathatja a kész jegyzetfüzetet.
Saját környezet beállítása
Használja a Visual Studio Code-ot a Python-bővítménnyel vagy azzal egyenértékű IDE-vel a Python 3.10 vagy újabb verziójával.
Ebben a rövid útmutatóban egy virtuális környezetet ajánlunk:
Indítsa el a Visual Studio Code-ot.
Nyissa meg a parancskatalógust (Ctrl+Shift+P).
Python keresése : Környezet létrehozása.
A következők szerint válasszon: Venv.
Válasszon egy Python-értelmezőt. Válassza a 3.10-es vagy újabb verziót.
A beállítás eltarthat egy percig. Ha problémákba ütközik, tekintse meg a Python-környezeteket a VS Code-ban.
Csomagok telepítése és változók beállítása
Telepítse a csomagokat, beleértve az azure-search-documentst is.
! pip install azure-search-documents==11.6.0b1 --quiet
! pip install azure-identity --quiet
! pip install python-dotenv --quiet
Adja meg a szolgáltatás végpontját és API-kulcsát:
search_endpoint: str = "PUT-YOUR-SEARCH-SERVICE-ENDPOINT-HERE"
search_api_key: str = "PUT-YOUR-SEARCH-SERVICE-ADMIN-API-KEY-HERE"
index_name: str = "hotels-quickstart"
Index létrehozása
from azure.core.credentials import AzureKeyCredential
credential = AzureKeyCredential(search_api_key)
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents import SearchClient
from azure.search.documents.indexes.models import (
ComplexField,
SimpleField,
SearchFieldDataType,
SearchableField,
SearchIndex
)
# 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="Description_fr", type=SearchFieldDataType.String, analyzer_name="fr.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')
Hasznos dokumentumok létrehozása
A művelettípushoz használjon indexműveletet, például feltöltést vagy egyesítést és feltöltést. A dokumentumok a GitHub HotelsData-mintájából származnak.
# Create a documents payload
documents = [
{
"@search.action": "upload",
"HotelId": "1",
"HotelName": "Stay-Kay City Hotel",
"Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
"Description_fr": "L'hôtel est idéalement situé sur la principale artère commerciale de la ville en plein cœur de New York. A quelques minutes se trouve la place du temps et le centre historique de la ville, ainsi que d'autres lieux d'intérêt qui font de New York l'une des villes les plus attractives et cosmopolites de l'Amérique.",
"Category": "Boutique",
"Tags": [ "pool", "air conditioning", "concierge" ],
"ParkingIncluded": "false",
"LastRenovationDate": "1970-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.",
"Description_fr": "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
"Category": "Boutique",
"Tags": [ "pool", "free wifi", "concierge" ],
"ParkingIncluded": "false",
"LastRenovationDate": "1979-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 Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel's restaurant services.",
"Description_fr": "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
"Category": "Resort and Spa",
"Tags": [ "air conditioning", "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 Palace is part of a lovingly restored 1800 palace.",
"Description_fr": "Le Sublime Palace Hotel est situé au coeur du centre historique de sublime dans un quartier extrêmement animé et vivant, à courte distance de marche des sites et monuments de la ville et est entouré par l'extraordinaire beauté des églises, des bâtiments, des commerces et Monuments. Sublime Palace fait partie d'un Palace 1800 restauré avec amour.",
"Category": "Boutique",
"Tags": [ "concierge", "view", "24-hour front desk service" ],
"ParkingIncluded": "true",
"LastRenovationDate": "1960-02-06T00:00:00Z",
"Rating": 4.60,
"Address": {
"StreetAddress": "7400 San Pedro Ave",
"City": "San Antonio",
"StateProvince": "TX",
"PostalCode": "78216",
"Country": "USA"
}
}
]
Dokumentumok feltöltése
# Upload documents to the index
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)
index_client = SearchIndexClient(
endpoint=search_endpoint, credential=credential)
Az első lekérdezés futtatása
Használja a search.client osztály keresési módszerét.
Ez a példa egy üres keresést (search=*
) hajt végre, amely tetszőleges dokumentumokból álló üres listát (keresési pontszám = 1,0) ad vissza. Mivel nincsenek feltételek, minden dokumentum szerepel az eredmények között.
# Run an empty query (returns selected fields, all documents)
results = search_client.search(query_type='simple',
search_text="*" ,
select='HotelName,Description',
include_total_count=True)
print ('Total Documents Matching Query:', results.get_count())
for result in results:
print(result["@search.score"])
print(result["HotelName"])
print(f"Description: {result['Description']}")
Kifejezés lekérdezésének futtatása
A következő lekérdezés teljes kifejezéseket ad hozzá a keresési kifejezéshez ("wifi"). Ez a lekérdezés azt határozza meg, hogy az eredmények csak azokat a mezőket tartalmazzák az select
utasításban. 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.
results = search_client.search(query_type='simple',
search_text="wifi" ,
select='HotelName,Description,Tags',
include_total_count=True)
print ('Total Documents Matching Query:', results.get_count())
for result in results:
print(result["@search.score"])
print(result["HotelName"])
print(f"Description: {result['Description']}")
Szűrő hozzáadása
Adjon hozzá egy szűrőkifejezést, amely csak a négynél nagyobb minősítésű szállodákat adja vissza csökkenő sorrendbe rendezve.
# Add a filter
results = search_client.search(
search_text="hotels",
select='HotelId,HotelName,Rating',
filter='Rating gt 4',
order_by='Rating desc')
for result in results:
print("{}: {} - {} rating".format(result["HotelId"], result["HotelName"], result["Rating"]))
Mező hatókörének hozzáadása
Hozzáadás search_fields
a hatókör-lekérdezés végrehajtásához adott mezőkhöz.
# Add search_fields to scope query matching to the HotelName field
results = search_client.search(
search_text="sublime",
search_fields=['HotelName'],
select='HotelId,HotelName')
for result in results:
print("{}: {}".format(result["HotelId"], result["HotelName"]))
Aspektusok hozzáadása
A keresési eredményekben található pozitív találatok esetében a rendszer aspektusokat hoz 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 az arculati navigációs struktúrában.
# Return facets
results = search_client.search(search_text="*", facets=["Category"])
facets = results.get_facets()
for facet in facets["Category"]:
print(" {}".format(facet))
Dokumentum keresése
Egy dokumentum visszaadása a kulcs alapján. Ez a művelet akkor hasznos, ha részletezni szeretné, ha egy felhasználó kiválaszt egy elemet egy keresési eredményben.
# Look up a specific document by ID
result = search_client.get_document(key="3")
print("Details for hotel '3' are:")
print("Name: {}".format(result["HotelName"]))
print("Rating: {}".format(result["Rating"]))
print("Category: {}".format(result["Category"]))
Automatikus kiegészítés hozzáadása
Az automatikus kiegészítés lehetséges egyezéseket biztosíthat a felhasználó által a keresőmezőbe típusok szerint.
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 rövid útmutatóban ezek a mezők a következőkTags
: , Address/City
Address/Country
.
Az automatikus kiegészítés szimulálásához adja meg az sa betűket részleges sztringként. A SearchClient automatikus kiegészítési metódusa visszaküldi a lehetséges kifejezés-egyezéseket.
# Autocomplete a query
search_suggestion = 'sa'
results = search_client.autocomplete(
search_text=search_suggestion,
suggester_name="sg",
mode='twoTerms')
print("Autocomplete for:", search_suggestion)
for result in results:
print (result['text'])
Java-konzolalkalmazás létrehozása az Azure.Search.Documents kódtár használatával keresési index létrehozásához, betöltéséhez és lekérdezéséhez.
Másik lehetőségként letöltheti a forráskódot, hogy egy kész projekttel kezdjen, vagy kövesse az alábbi lépéseket a saját létrehozásához.
Saját környezet beállítása
A rövid útmutató létrehozásához használja az alábbi eszközöket.
A projekt létrehozása
Indítsa el a Visual Studio Code-ot.
Nyissa meg a parancskatalógust a Ctrl+Shift+P billentyűkombinációval. Keresse meg a Java-projekt létrehozását.
Válassza a Maven lehetőséget.
Válassza a maven-archetype-quickstart lehetőséget.
Válassza ki a legújabb, jelenleg 1.4-es verziót.
Csoportazonosítóként adja meg az azure.search.sample értéket .
Adja meg az azuresearchquickstart értéket az összetevő azonosítójaként.
Jelölje ki azt a mappát, amelyben létre szeretné hozni a projektet.
Fejezze be a projekt létrehozását az integrált terminálban. Nyomja le az Enter billentyűt az "1.0-SNAPSHOT" alapértelmezett értékének elfogadásához, majd írja be az "y" szót a projekt tulajdonságainak megerősítéséhez.
Nyissa meg a projektet létrehozó mappát.
Maven-függőségek megadása
Nyissa meg a pom.xml fájlt, és adja hozzá a következő függőségeket.
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-search-documents</artifactId>
<version>11.7.3</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-core</artifactId>
<version>1.53.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
Módosítsa a fordító Java-verzióját 11-esre.
<maven.compiler.source>1.11</maven.compiler.source>
<maven.compiler.target>1.11</maven.compiler.target>
Keresési ügyfél létrehozása
Nyissa meg az osztályt az App
src, main, java, azure, search, sample alatt. Adja hozzá a következő importálási irányelveket.
import java.util.Arrays;
import java.util.ArrayList;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.LocalDateTime;
import java.time.LocalDate;
import java.time.LocalTime;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.Context;
import com.azure.search.documents.SearchClient;
import com.azure.search.documents.SearchClientBuilder;
import com.azure.search.documents.models.SearchOptions;
import com.azure.search.documents.indexes.SearchIndexClient;
import com.azure.search.documents.indexes.SearchIndexClientBuilder;
import com.azure.search.documents.indexes.models.IndexDocumentsBatch;
import com.azure.search.documents.indexes.models.SearchIndex;
import com.azure.search.documents.indexes.models.SearchSuggester;
import com.azure.search.documents.util.AutocompletePagedIterable;
import com.azure.search.documents.util.SearchPagedIterable;
Az alábbi példa a keresési szolgáltatás nevének helyőrzőit, a létrehozási és törlési engedélyeket biztosító rendszergazdai API-kulcsot, valamint az index nevét tartalmazza. Cserélje le az érvényes értékeket mindhárom helyőrzőre. Hozzon létre két ügyfelet: a SearchIndexClient létrehozza az indexet, a SearchClient pedig betölt és lekérdez egy meglévő indexet. Mindkettőnek szüksége van a szolgáltatásvégpontra és egy rendszergazdai API-kulcsra a létrehozási és törlési jogosultságokkal történő hitelesítéshez.
public static void main(String[] args) {
var searchServiceEndpoint = "<YOUR-SEARCH-SERVICE-URL>";
var adminKey = new AzureKeyCredential("<YOUR-SEARCH-SERVICE-ADMIN-KEY>");
String indexName = "<YOUR-SEARCH-INDEX-NAME>";
SearchIndexClient searchIndexClient = new SearchIndexClientBuilder()
.endpoint(searchServiceEndpoint)
.credential(adminKey)
.buildClient();
SearchClient searchClient = new SearchClientBuilder()
.endpoint(searchServiceEndpoint)
.credential(adminKey)
.indexName(indexName)
.buildClient();
}
Index létrehozása
Ez a rövid útmutató létrehoz egy hotelindexet, amelyet betölt a szálloda adataival, és lekérdezéseket hajt végre. Ebben a lépésben határozza meg az index mezőit. Minden meződefiníció tartalmaz egy nevet, adattípust és attribútumot, amely meghatározza a mező használatát.
Ebben a példában az azure-search-documents kódtár szinkron metódusait használjuk az egyszerűség és az olvashatóság érdekében. Éles forgatókönyvek esetén azonban aszinkron módszereket kell használnia az alkalmazás skálázható és rugalmas állapotának megőrzéséhez. A SearchClient helyett például a SearchAsyncClientet használná.
Adjon hozzá egy üres osztálydefiníciót a projekthez: Hotel.java
Másolja a következő kódot Hotel.java
egy szállodai dokumentum szerkezetének meghatározásához. A mező attribútumai határozzák meg, hogyan használják azt egy alkalmazásban. Az IsFilterable széljegyzetet például minden olyan mezőhöz hozzá kell rendelni, amely támogatja a szűrőkifejezést
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package azure.search.sample;
import com.azure.search.documents.indexes.SearchableField;
import com.azure.search.documents.indexes.SimpleField;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import java.time.OffsetDateTime;
/**
* Model class representing a hotel.
*/
@JsonInclude(Include.NON_NULL)
public class Hotel {
/**
* Hotel ID
*/
@JsonProperty("HotelId")
@SimpleField(isKey = true)
public String hotelId;
/**
* Hotel name
*/
@JsonProperty("HotelName")
@SearchableField(isSortable = true)
public String hotelName;
/**
* Description
*/
@JsonProperty("Description")
@SearchableField(analyzerName = "en.microsoft")
public String description;
/**
* French description
*/
@JsonProperty("DescriptionFr")
@SearchableField(analyzerName = "fr.lucene")
public String descriptionFr;
/**
* Category
*/
@JsonProperty("Category")
@SearchableField(isFilterable = true, isSortable = true, isFacetable = true)
public String category;
/**
* Tags
*/
@JsonProperty("Tags")
@SearchableField(isFilterable = true, isFacetable = true)
public String[] tags;
/**
* Whether parking is included
*/
@JsonProperty("ParkingIncluded")
@SimpleField(isFilterable = true, isSortable = true, isFacetable = true)
public Boolean parkingIncluded;
/**
* Last renovation time
*/
@JsonProperty("LastRenovationDate")
@SimpleField(isFilterable = true, isSortable = true, isFacetable = true)
public OffsetDateTime lastRenovationDate;
/**
* Rating
*/
@JsonProperty("Rating")
@SimpleField(isFilterable = true, isSortable = true, isFacetable = true)
public Double rating;
/**
* Address
*/
@JsonProperty("Address")
public Address address;
@Override
public String toString()
{
try
{
return new ObjectMapper().writeValueAsString(this);
}
catch (JsonProcessingException e)
{
e.printStackTrace();
return "";
}
}
}
Az Azure.Search.Documents ügyfélkódtárban a SearchableField és a SimpleField használatával egyszerűsítheti a meződefiníciókat.
SimpleField
bármilyen adattípus lehet, mindig nem kereshető (a teljes szöveges keresési lekérdezések figyelmen kívül hagyják), és lekérdezhető (nem rejtett). Más attribútumok alapértelmezés szerint ki vannak kapcsolva, de engedélyezhetők. Előfordulhat, hogy a SimpleFieldet csak szűrőkben, aspektusokban vagy pontozási profilokban használt dokumentumazonosítókhoz vagy mezőkhöz használja. Ha igen, mindenképpen alkalmazzon minden olyan attribútumot, amely a forgatókönyvhöz szükséges, például isKey = igaz a dokumentumazonosítóhoz.
SearchableField
sztringnek kell lennie, és mindig kereshető és lekérdezhető. Más attribútumok alapértelmezés szerint ki vannak kapcsolva, de engedélyezhetők. Mivel ez a mezőtípus kereshető, támogatja a szinonimákat és az elemző tulajdonságainak teljes kiegészítését.
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, isFilterable
, isSortable
és isFacetable
explicit módon kell hozzárendelni, ahogy az előző példában is látható.
Adjon hozzá egy második üres osztálydefiníciót a projekthez: Address.java
. Másolja a következő kódot az osztályba.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package azure.search.sample;
import com.azure.search.documents.indexes.SearchableField;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
/**
* Model class representing an address.
*/
@JsonInclude(Include.NON_NULL)
public class Address {
/**
* Street address
*/
@JsonProperty("StreetAddress")
@SearchableField
public String streetAddress;
/**
* City
*/
@JsonProperty("City")
@SearchableField(isFilterable = true, isSortable = true, isFacetable = true)
public String city;
/**
* State or province
*/
@JsonProperty("StateProvince")
@SearchableField(isFilterable = true, isSortable = true, isFacetable = true)
public String stateProvince;
/**
* Postal code
*/
@JsonProperty("PostalCode")
@SearchableField(isFilterable = true, isSortable = true, isFacetable = true)
public String postalCode;
/**
* Country
*/
@JsonProperty("Country")
@SearchableField(isFilterable = true, isSortable = true, isFacetable = true)
public String country;
}
Ebben App.java
az esetben hozzon létre egy SearchIndex
objektumot a main
metódusban, majd hívja meg a createOrUpdateIndex
metódust az index létrehozásához a keresési szolgáltatásban. Az index tartalmaz egy SearchSuggester
automatikus kiegészítést is 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 betöltése
Az Azure AI Search a szolgáltatásban tárolt tartalmakon keres. Ebben a lépésben olyan JSON-dokumentumokat fog betölteni, amelyek megfelelnek az imént létrehozott szállodaindexnek.
Az Azure AI Searchben a keresési dokumentumok olyan adatstruktúrák, amelyek egyaránt bemenetek az indexeléshez és a lekérdezésekből származó kimenetekhez. A külső adatforrásból származó dokumentumbemenetek lehetnek egy adatbázis sorai, blobok a Blob Storage-ban vagy a lemezen lévő JSON-dokumentumok. Ebben a példában egy parancsikont hozunk létre, és négy szállodához ágyazunk be JSON-dokumentumokat magában a kódban.
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 Search szolgáltatással, hogy milyen műveletet kell végrehajtania (feltöltés, egyesítés, törlés és mergeOrUpload).
Ebben a fájlban App.java
hozzon létre dokumentumokat és indexműveleteket, majd adja át őket a következőnek IndexDocumentsBatch
: 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)
{
var hotelList = new ArrayList<Hotel>();
var hotel = new Hotel();
hotel.hotelId = "1";
hotel.hotelName = "Stay-Kay City Hotel";
hotel.description = "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.";
hotel.descriptionFr = "L'hôtel est idéalement situé sur la principale artère commerciale de la ville en plein cœur de New York. A quelques minutes se trouve la place du temps et le centre historique de la ville, ainsi que d'autres lieux d'intérêt qui font de New York l'une des villes les plus attractives et cosmopolites de l'Amérique.";
hotel.category = "Boutique";
hotel.tags = new String[] { "pool", "air conditioning", "concierge" };
hotel.parkingIncluded = false;
hotel.lastRenovationDate = OffsetDateTime.of(LocalDateTime.of(LocalDate.of(1970, 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);
hotel = new Hotel();
hotel.hotelId = "2";
hotel.hotelName = "Old Century Hotel";
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.";
hotel.descriptionFr = "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.";
hotel.category = "Boutique";
hotel.tags = new String[] { "pool", "free wifi", "concierge" };
hotel.parkingIncluded = false;
hotel.lastRenovationDate = OffsetDateTime.of(LocalDateTime.of(LocalDate.of(1979, 2, 18), LocalTime.of(0, 0)), ZoneOffset.UTC);
hotel.rating = 3.60;
hotel.address = new Address();
hotel.address.streetAddress = "140 University Town Center Dr";
hotel.address.city = "Sarasota";
hotel.address.stateProvince = "FL";
hotel.address.postalCode = "34243";
hotel.address.country = "USA";
hotelList.add(hotel);
hotel = new Hotel();
hotel.hotelId = "3";
hotel.hotelName = "Gastronomic Landscape Hotel";
hotel.description = "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.";
hotel.descriptionFr = "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.";
hotel.category = "Resort and Spa";
hotel.tags = new String[] { "air conditioning", "bar", "continental breakfast" };
hotel.parkingIncluded = true;
hotel.lastRenovationDate = OffsetDateTime.of(LocalDateTime.of(LocalDate.of(2015, 9, 20), LocalTime.of(0, 0)), ZoneOffset.UTC);
hotel.rating = 4.80;
hotel.address = new Address();
hotel.address.streetAddress = "3393 Peachtree Rd";
hotel.address.city = "Atlanta";
hotel.address.stateProvince = "GA";
hotel.address.postalCode = "30326";
hotel.address.country = "USA";
hotelList.add(hotel);
hotel = new Hotel();
hotel.hotelId = "4";
hotel.hotelName = "Sublime Palace Hotel";
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 Palace is part of a lovingly restored 1800 palace.";
hotel.descriptionFr = "Le Sublime Palace Hotel est situé au coeur du centre historique de sublime dans un quartier extrêmement animé et vivant, à courte distance de marche des sites et monuments de la ville et est entouré par l'extraordinaire beauté des églises, des bâtiments, des commerces et Monuments. Sublime Palace fait partie d'un Palace 1800 restauré avec amour.";
hotel.category = "Boutique";
hotel.tags = new String[] { "concierge", "view", "24-hour front desk service" };
hotel.parkingIncluded = true;
hotel.lastRenovationDate = OffsetDateTime.of(LocalDateTime.of(LocalDate.of(1960, 2, 06), LocalTime.of(0, 0)), ZoneOffset.UTC);
hotel.rating = 4.60;
hotel.address = new Address();
hotel.address.streetAddress = "7400 San Pedro Ave";
hotel.address.city = "San Antonio";
hotel.address.stateProvince = "TX";
hotel.address.postalCode = "78216";
hotel.address.country = "USA";
hotelList.add(hotel);
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");
}
}
Az objektum inicializálása IndexDocumentsBatch
után elküldheti azt az indexbe az objektum indexdokuments SearchClient
meghívásával.
Adja hozzá a következő sorokat a következőhöz Main()
: A dokumentumok betöltése a következővel SearchClient
történik: .
// Upload sample hotel documents to the Search Index
uploadDocuments(searchClient);
Mivel ez egy konzolalkalmazás, amely az összes parancsot egymás után futtatja, adjon hozzá 2 másodperces várakozási időt 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 2 másodperces késleltetés kompenzálja az indexelést, amely 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.
Keresés az indexekben
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.
Ebben App.java
a fájlban hozzon létre egy metódust WriteDocuments
, amely a keresési eredményeket a konzolra nyomtatja.
// 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();
}
Hozzon létre egy metódust RunQueries
a lekérdezések végrehajtásához és az eredmények visszaadásához. Hotel
Az eredmények objektumok. 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));
}
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 minősítést tartalmazó dokumentumokat, majd csökkenő sorrendben rendezi az értékelés szerint. A szűrő egy logikai kifejezés, amelyet egy index mezői értékelnek isFilterable
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
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));
A harmadik lekérdezés egy teljes szöveges keresési művelet adott mezőkre való hatóköré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));
A negyedik lekérdezés bemutatja facets
, hogy milyen strukturált navigációs szerkezetek hozhatók létre.
// 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));
Az ötödik lekérdezésben adjon vissza egy adott dokumentumot.
// 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();
Az utolsó lekérdezés az automatikus kiegészítés szintaxisát jeleníti meg, szimulálva az s részleges felhasználói bemenetét, amely két lehetséges egyezésre oldódik fel az sourceFields
indexben definiált javaslatotevőhöz társítva.
// Query 6
System.out.println("Query #6: Call Autocomplete on HotelName that starts with 's'...\n");
WriteAutocompleteResults(searchClient.autocomplete("s", "sg"));
Hozzáadás RunQueries
a fájlhoz Main()
// Call the RunQueries method to invoke a series of queries
System.out.println("Starting queries...\n");
RunQueries(searchClient);
// End the program
System.out.println("Complete.\n");
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 teljes szöveges keresés és a szűrők a SearchClient.search metódussal hajthatók végre. A keresési lekérdezések átadhatók a sztringben searchText
, míg egy szűrőkifejezés átadható a filter
SearchOptions osztály tulajdonságában. Keresés nélküli szűréshez egyszerűen adja meg a "*" értéket a searchText
search
metódus paraméteréhez. Ha szűrés nélkül szeretne keresni, hagyja meg a filter
tulajdonságot, vagy egyáltalán ne adja át a példányt SearchOptions
.
A program futtatása
Nyomja le az F5 billentyűt az alkalmazás újraépítéséhez és a program teljes futtatásához.
A kimenet a lekérdezési információk és eredmények hozzáadásával a feladótól érkező System.out.println
üzeneteket is tartalmazza.
Node.js-alkalmazás létrehozása a @azure/search-documents kódtár használatával keresési index létrehozásához, betöltéséhez és lekérdezéséhez.
Másik lehetőségként letöltheti a forráskódot, hogy egy kész projekttel kezdjen, vagy kövesse az alábbi lépéseket a saját létrehozásához.
Saját környezet beállítása
Ezt a rövid útmutatót az alábbi eszközökkel hoztuk létre.
A projekt létrehozása
Indítsa el a Visual Studio Code-ot.
Nyissa meg a parancskatalógust a Ctrl+Shift+P billentyűkombinációval, és nyissa meg az integrált terminált.
Hozzon létre egy fejlesztési könyvtárat, amely rövid útmutatót ad a névnek:
mkdir quickstart
cd quickstart
Inicializáljon egy üres projektet az npm használatával az alábbi parancs futtatásával. A projekt teljes inicializálásához nyomja le többször az Enter billentyűt az alapértelmezett értékek elfogadásához, kivéve a licencet, amelyet az MIT-nek kell beállítania.
npm init
Telepítse @azure/search-documents
a JavaScript/TypeScript SDK-t az Azure AI Searchhöz.
npm install @azure/search-documents
Telepítse dotenv
, amely a környezeti változók, például a keresési szolgáltatás neve és az API-kulcs importálására szolgál.
npm install dotenv
Lépjen a rövid útmutató könyvtárára, majd ellenőrizze, hogy konfigurálta-e a projektet és annak függőségeit, ha ellenőrzi, hogy a package.json fájl az alábbi jsonhoz hasonlóan néz-e ki:
{
"name": "quickstart",
"version": "1.0.0",
"description": "Azure AI Search Quickstart",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"Azure",
"Search"
],
"author": "Your Name",
"license": "MIT",
"dependencies": {
"@azure/search-documents": "^11.3.0",
"dotenv": "^16.0.2"
}
}
Hozzon létre egy .env fájlt a keresési szolgáltatás paramétereinek tárolásához:
SEARCH_API_KEY=<YOUR-SEARCH-ADMIN-API-KEY>
SEARCH_API_ENDPOINT=<YOUR-SEARCH-SERVICE-URL>
Cserélje le az YOUR-SEARCH-SERVICE-URL
értéket a keresési szolgáltatás végpontjának URL-címére. Cserélje le <YOUR-SEARCH-ADMIN-API-KEY>
a korábban rögzített rendszergazdai kulccsal.
Index.js fájl létrehozása
Ezután létrehozunk egy index.js fájlt, amely a kód fő fájlja.
A fájl tetején importáljuk a tárat @azure/search-documents
:
const { SearchIndexClient, SearchClient, AzureKeyCredential, odata } = require("@azure/search-documents");
A következő lépésben a dotenv
csomagnak be kell olvasnia a paramétereket az .env fájlból az alábbiak szerint:
// Load the .env file if it exists
require("dotenv").config();
// Getting endpoint and apiKey from .env file
const endpoint = process.env.SEARCH_API_ENDPOINT || "";
const apiKey = process.env.SEARCH_API_KEY || "";
Az importálási és környezeti változóink be vannak adva, készen állunk a fő függvény meghatározására.
Az SDK funkcióinak többsége aszinkron, ezért a fő függvényünk async
. Az alábbi fő függvényt is befoglaljuk main().catch()
és naplózzuk az esetlegesen előforduló hibákat:
async function main() {
console.log(`Running Azure AI Search JavaScript quickstart...`);
if (!endpoint || !apiKey) {
console.log("Make sure to set valid values for endpoint and apiKey with proper authorization.");
return;
}
// remaining quickstart code will go here
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Ezzel készen állunk egy index létrehozására.
Index létrehozása
Hozzon létre egy fájl hotels_quickstart_index.json. Ez a fájl határozza meg, hogyan működik az Azure AI Search a következő lépésben betöltendő dokumentumokkal. Az egyes mezőket egy name
adott mező azonosítja, és rendelkezik egy megadott type
mezővel. Minden mező indexattribútumok sorozatával is rendelkezik, amelyek meghatározzák, hogy az Azure AI Search képes-e keresni, szűrni, rendezni és kezelni a mezőt. A mezők többsége egyszerű adattípus, de néhány olyan összetett típus, amely AddressType
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.
Adja hozzá a következő tartalmat a fájl hotels_quickstart_index.json vagy letöltéséhez.
{
"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,
"analyzerName": "en.lucene"
},
{
"name": "Description_fr",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"analyzerName": "fr.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
}
]
}
],
"suggesters": [
{
"name": "sg",
"searchMode": "analyzingInfixMatching",
"sourceFields": [
"HotelName"
]
}
]
}
Az indexdefinícióval a index.js tetején szeretnénk importálni hotels_quickstart_index.json, hogy a fő függvény hozzáférhessen az indexdefinícióhoz.
const indexDefinition = require('./hotels_quickstart_index.json');
A fő függvényen belül létrehozunk egy SearchIndexClient
, az Azure AI Search indexeinek létrehozására és kezelésére szolgáló parancsot.
const indexClient = new SearchIndexClient(endpoint, new AzureKeyCredential(apiKey));
Ezután törölni szeretnénk az indexet, ha már létezik. Ez a művelet a tesztelési/demókódok gyakori gyakorlata.
Ehhez definiálunk egy egyszerű függvényt, amely 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.');
}
}
A függvény futtatásához kinyerjük az index nevét az indexdefinícióból, és átadjuk a indexName
függvénynekdeleteIndexIfExists()
.indexClient
const indexName = indexDefinition["name"];
console.log('Checking if index exists...');
await deleteIndexIfExists(indexClient, indexName);
Ezután készen állunk az index metódussal való létrehozására createIndex()
.
console.log('Creating index...');
let index = await indexClient.createIndex(indexDefinition);
console.log(`Index named ${index.name} has been created.`);
Minta futtatása
Ezen a ponton készen áll a minta futtatására. A következő parancs futtatásához használjon terminálablakot:
node index.js
Ha letöltötte a forráskódot , és még nem telepítette a szükséges csomagokat, futtassa npm install
először.
A program által végrehajtott műveleteket leíró üzenetsorozatnak kell megjelennie.
Nyissa meg a keresési szolgáltatás áttekintését az Azure Portalon. Válassza az Indexek lapot. A következő példához hasonlót kell látnia:
A következő lépésben adatokat fog hozzáadni az indexhez.
Dokumentumok betöltése
Az Azure AI Searchben 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 az esetben programozott módon leküldjük a dokumentumokat az indexbe.
A dokumentumbemenetek lehetnek egy adatbázis sorai, blobok a Blob Storage-ban, vagy a mintában szereplő JSON-dokumentumok a lemezen. Letöltheti hotels.json , vagy létrehozhat saját hotels.json fájlt a következő tartalommal:
{
"value": [
{
"HotelId": "1",
"HotelName": "Stay-Kay City Hotel",
"Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
"Description_fr": "L'hôtel est idéalement situé sur la principale artère commerciale de la ville en plein cœur de New York. A quelques minutes se trouve la place du temps et le centre historique de la ville, ainsi que d'autres lieux d'intérêt qui font de New York l'une des villes les plus attractives et cosmopolites de l'Amérique.",
"Category": "Boutique",
"Tags": ["pool", "air conditioning", "concierge"],
"ParkingIncluded": false,
"LastRenovationDate": "1970-01-18T00:00:00Z",
"Rating": 3.6,
"Address": {
"StreetAddress": "677 5th Ave",
"City": "New York",
"StateProvince": "NY",
"PostalCode": "10022"
}
},
{
"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.",
"Description_fr": "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
"Category": "Boutique",
"Tags": ["pool", "free wifi", "concierge"],
"ParkingIncluded": "false",
"LastRenovationDate": "1979-02-18T00:00:00Z",
"Rating": 3.6,
"Address": {
"StreetAddress": "140 University Town Center Dr",
"City": "Sarasota",
"StateProvince": "FL",
"PostalCode": "34243"
}
},
{
"HotelId": "3",
"HotelName": "Gastronomic Landscape Hotel",
"Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
"Description_fr": "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
"Category": "Resort and Spa",
"Tags": ["air conditioning", "bar", "continental breakfast"],
"ParkingIncluded": "true",
"LastRenovationDate": "2015-09-20T00:00:00Z",
"Rating": 4.8,
"Address": {
"StreetAddress": "3393 Peachtree Rd",
"City": "Atlanta",
"StateProvince": "GA",
"PostalCode": "30326"
}
},
{
"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 Palace is part of a lovingly restored 1800 palace.",
"Description_fr": "Le Sublime Palace Hotel est situé au coeur du centre historique de sublime dans un quartier extrêmement animé et vivant, à courte distance de marche des sites et monuments de la ville et est entouré par l'extraordinaire beauté des églises, des bâtiments, des commerces et Monuments. Sublime Palace fait partie d'un Palace 1800 restauré avec amour.",
"Category": "Boutique",
"Tags": ["concierge", "view", "24-hour front desk service"],
"ParkingIncluded": true,
"LastRenovationDate": "1960-02-06T00:00:00Z",
"Rating": 4.6,
"Address": {
"StreetAddress": "7400 San Pedro Ave",
"City": "San Antonio",
"StateProvince": "TX",
"PostalCode": "78216"
}
}
]
}
A művelethez hasonlóan a indexDefinition
index.js tetején is importálnunk hotels.json
kell, hogy az adatok elérhetők legyenek a fő függvényünkben.
const hotelData = require('./hotels.json');
Ha adatokat szeretne indexelni a keresési indexbe, létre kell hoznunk egy SearchClient
. Bár az SearchIndexClient
indexek létrehozására és kezelésére szolgál, a SearchClient
dokumentumok feltöltésére és az index lekérdezésére szolgál.
Kétféleképpen hozhat létre .SearchClient
Az első lehetőség a nulláról történő létrehozás SearchClient
:
const searchClient = new SearchClient(endpoint, indexName, new AzureKeyCredential(apiKey));
Másik lehetőségként a getSearchClient()
következő metódus SearchIndexClient
használatával is létrehozhatja a következőt SearchClient
:
const searchClient = indexClient.getSearchClient(indexName);
Az ügyfél definiálása után töltse fel a dokumentumokat a keresési indexbe. Ebben az esetben a metódust mergeOrUploadDocuments()
használjuk, amely feltölti a dokumentumokat, vagy egyesíti őket egy meglévő dokumentummal, ha már létezik ugyanazzal a 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)}`);
Futtassa újra a programot a következővel node index.js
: . Az 1. lépésben látottaktól kissé eltérő üzenetkészletnek kell megjelennie. Ezúttal az index létezik , és látnia kell egy, a törlésről szóló üzenetet, mielőtt az alkalmazás létrehozza az új indexet, és közzétennénk az adatokat.
Mielőtt a következő lépésben futtatnánk a lekérdezéseket, definiáljon egy függvényt, hogy a program egy másodpercig várakozzon. Ez csak tesztelési/demó céljából történik, hogy az indexelés befejeződjön, és hogy a dokumentumok elérhetők legyenek az indexben a lekérdezéseinkhez.
function sleep(ms) {
var d = new Date();
var d2 = null;
do {
d2 = new Date();
} while (d2 - d < ms);
}
Ha azt szeretné, hogy a program egy másodpercig várjon, hívja meg a függvényt az sleep
alábbihoz hasonlóan:
sleep(1000);
Keresés az indexekben
Egy index létrehozásával és a feltöltött dokumentumokkal lekérdezéseket küldhet az indexnek. Ebben a szakaszban öt különböző lekérdezést küldünk a keresési indexbe, hogy bemutassuk az Ön számára elérhető különböző lekérdezési funkciókat.
A lekérdezések egy sendQueries()
függvényben vannak megírva, amelyet a fő függvényben hívunk meg az alábbiak szerint:
await sendQueries(searchClient);
A rendszer a lekérdezéseket a search()
következő módszerrel küldi searchClient
el: . Az első paraméter a keresési szöveg, a második pedig a keresési beállításokat adja meg.
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és értéke is a következőre true
van includeTotalCount
állítva, amely a talált 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.
A következő lekérdezésben megadjuk a keresési kifejezést "wifi"
, és egy szűrőt is belefoglalunk, amely csak olyan eredményeket ad vissza, ahol az állapot egyenlő 'FL'
. Az eredményeket a szálloda is rendezi Rating
.
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)}`);
}
Ezután 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)}`);
}
console.log();
Egy másik gyakori lehetőség a lekérdezésbe való belefoglalás.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.
console.log('Query #4 - 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)}`);
}
A végső lekérdezés a getDocument()
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}`)
Minta futtatása
Futtassa a programot a következővel node index.js
: . Most az előző lépéseken kívül a rendszer elküldi a lekérdezéseket, és az eredményeket a konzolra írja.
Node.js-alkalmazás létrehozása a @azure/search-documents kódtár használatával keresési index létrehozásához, betöltéséhez és lekérdezéséhez.
Másik lehetőségként letöltheti a forráskódot, hogy egy kész projekttel kezdjen, vagy kövesse az alábbi lépéseket a saját létrehozásához.
Saját környezet beállítása
Ezt a rövid útmutatót az alábbi eszközökkel hoztuk létre.
A projekt létrehozása
Indítsa el a Visual Studio Code-ot.
Nyissa meg a parancskatalógust a Ctrl+Shift+P billentyűkombinációval, és nyissa meg az integrált terminált.
Hozzon létre egy fejlesztési könyvtárat, amely rövid útmutatót ad a névnek:
mkdir quickstart
cd quickstart
Inicializáljon egy üres projektet az npm használatával az alábbi parancs futtatásával. A projekt teljes inicializálásához nyomja le többször az Enter billentyűt az alapértelmezett értékek elfogadásához, kivéve a licencet, amelyet az MIT-nek kell beállítania.
npm init
Telepítse @azure/search-documents
a JavaScript/TypeScript SDK-t az Azure AI Searchhöz.
npm install @azure/search-documents
Telepítse dotenv
, amely a környezeti változók, például a keresési szolgáltatás neve és az API-kulcs importálására szolgál.
npm install dotenv
Lépjen a rövid útmutató könyvtárára, majd ellenőrizze, hogy konfigurálta-e a projektet és annak függőségeit, ha ellenőrzi, hogy a package.json fájl az alábbi jsonhoz hasonlóan néz-e ki:
{
"name": "quickstart",
"version": "1.0.0",
"description": "Azure AI Search Quickstart",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"Azure",
"Search"
],
"author": "Your Name",
"license": "MIT",
"dependencies": {
"@azure/search-documents": "^12.1.0",
"dotenv": "^16.4.5"
}
}
Hozzon létre egy .env fájlt a keresési szolgáltatás paramétereinek tárolásához:
SEARCH_API_KEY=<YOUR-SEARCH-ADMIN-API-KEY>
SEARCH_API_ENDPOINT=<YOUR-SEARCH-SERVICE-URL>
Cserélje le az YOUR-SEARCH-SERVICE-URL
értéket a keresési szolgáltatás végpontjának URL-címére. Cserélje le <YOUR-SEARCH-ADMIN-API-KEY>
a korábban rögzített rendszergazdai kulccsal.
Index.ts fájl létrehozása
Ezután létrehozunk egy index.ts fájlt, amely a kód fő fájlja.
A fájl tetején importáljuk a tárat @azure/search-documents
:
import {
AzureKeyCredential,
ComplexField,
odata,
SearchClient,
SearchFieldArray,
SearchIndex,
SearchIndexClient,
SearchSuggester,
SimpleField
} from "@azure/search-documents";
A következő lépésben a dotenv
csomagnak be kell olvasnia a paramétereket az .env fájlból az alábbiak szerint:
// Load the .env file if it exists
import dotenv from 'dotenv';
dotenv.config();
// Getting endpoint and apiKey from .env file
const endpoint = process.env.SEARCH_API_ENDPOINT || "";
const apiKey = process.env.SEARCH_API_KEY || "";
Az importálási és környezeti változóink be vannak adva, készen állunk a fő függvény meghatározására.
Az SDK funkcióinak többsége aszinkron, ezért a fő függvényünk async
. Az alábbi fő függvényt is befoglaljuk main().catch()
és naplózzuk az esetlegesen előforduló hibákat:
async function main() {
console.log(`Running Azure AI Search JavaScript quickstart...`);
if (!endpoint || !apiKey) {
console.log("Make sure to set valid values for endpoint and apiKey with proper authorization.");
return;
}
// remaining quickstart code will go here
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Ezzel készen állunk egy index létrehozására.
Index létrehozása
Hozzon létre egy fájl hotels_quickstart_index.json. Ez a fájl határozza meg, hogyan működik az Azure AI Search a következő lépésben betöltendő dokumentumokkal. Az egyes mezőket egy name
adott mező azonosítja, és rendelkezik egy megadott type
mezővel. Minden mező indexattribútumok sorozatával is rendelkezik, amelyek meghatározzák, hogy az Azure AI Search képes-e keresni, szűrni, rendezni és kezelni a mezőt. A mezők többsége egyszerű adattípus, de néhány olyan összetett típus, amely AddressType
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.
Adja hozzá a következő tartalmat a fájl hotels_quickstart_index.json vagy letöltéséhez.
{
"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,
"analyzerName": "en.lucene"
},
{
"name": "Description_fr",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"analyzerName": "fr.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
}
]
}
],
"suggesters": [
{
"name": "sg",
"searchMode": "analyzingInfixMatching",
"sourceFields": [
"HotelName"
]
}
]
}
Az indexdefinícióval a index.ts tetején szeretnénk importálni hotels_quickstart_index.json, hogy a fő függvény hozzáférhessen az indexdefinícióhoz.
// Importing the index definition and sample data
import indexDefinition from './hotels_quickstart_index.json';
interface HotelIndexDefinition {
name: string;
fields: SimpleField[] | ComplexField[];
suggesters: SearchSuggester[];
};
const hotelIndexDefinition: HotelIndexDefinition = indexDefinition as HotelIndexDefinition;
A fő függvényen belül létrehozunk egy SearchIndexClient
, az Azure AI Search indexeinek létrehozására és kezelésére szolgáló parancsot.
const indexClient = new SearchIndexClient(endpoint, new AzureKeyCredential(apiKey));
Ezután törölni szeretnénk az indexet, ha már létezik. Ez a művelet a tesztelési/demókódok gyakori gyakorlata.
Ehhez definiálunk egy egyszerű függvényt, amely megpróbálja törölni az indexet.
async function deleteIndexIfExists(indexClient: SearchIndexClient, indexName: string): Promise<void> {
try {
await indexClient.deleteIndex(indexName);
console.log('Deleting index...');
} catch {
console.log('Index does not exist yet.');
}
}
A függvény futtatásához kinyerjük az index nevét az indexdefinícióból, és átadjuk a indexName
függvénynekdeleteIndexIfExists()
.indexClient
// Getting the name of the index from the index definition
const indexName: string = hotelIndexDefinition.name;
console.log('Checking if index exists...');
await deleteIndexIfExists(indexClient, indexName);
Ezután készen állunk az index metódussal való létrehozására createIndex()
.
console.log('Creating index...');
let index = await indexClient.createIndex(hotelIndexDefinition);
console.log(`Index named ${index.name} has been created.`);
Minta futtatása
Ezen a ponton készen áll a minta létrehozására és futtatására. A következő parancsok futtatásához használjon terminálablakot a forrás tsc
létrehozásához, majd futtassa a forrást a következővel node
:
tsc
node index.ts
Ha letöltötte a forráskódot , és még nem telepítette a szükséges csomagokat, futtassa npm install
először.
A program által végrehajtott műveleteket leíró üzenetsorozatnak kell megjelennie.
Nyissa meg a keresési szolgáltatás áttekintését az Azure Portalon. Válassza az Indexek lapot. A következő példához hasonlót kell látnia:
A következő lépésben adatokat fog hozzáadni az indexhez.
Dokumentumok betöltése
Az Azure AI Searchben 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 az esetben programozott módon leküldjük a dokumentumokat az indexbe.
A dokumentumbemenetek lehetnek egy adatbázis sorai, blobok a Blob Storage-ban, vagy a mintában szereplő JSON-dokumentumok a lemezen. Letöltheti hotels.json , vagy létrehozhat saját hotels.json fájlt a következő tartalommal:
{
"value": [
{
"HotelId": "1",
"HotelName": "Stay-Kay City Hotel",
"Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
"Description_fr": "L'hôtel est idéalement situé sur la principale artère commerciale de la ville en plein cœur de New York. A quelques minutes se trouve la place du temps et le centre historique de la ville, ainsi que d'autres lieux d'intérêt qui font de New York l'une des villes les plus attractives et cosmopolites de l'Amérique.",
"Category": "Boutique",
"Tags": ["pool", "air conditioning", "concierge"],
"ParkingIncluded": false,
"LastRenovationDate": "1970-01-18T00:00:00Z",
"Rating": 3.6,
"Address": {
"StreetAddress": "677 5th Ave",
"City": "New York",
"StateProvince": "NY",
"PostalCode": "10022"
}
},
{
"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.",
"Description_fr": "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
"Category": "Boutique",
"Tags": ["pool", "free wifi", "concierge"],
"ParkingIncluded": "false",
"LastRenovationDate": "1979-02-18T00:00:00Z",
"Rating": 3.6,
"Address": {
"StreetAddress": "140 University Town Center Dr",
"City": "Sarasota",
"StateProvince": "FL",
"PostalCode": "34243"
}
},
{
"HotelId": "3",
"HotelName": "Gastronomic Landscape Hotel",
"Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
"Description_fr": "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
"Category": "Resort and Spa",
"Tags": ["air conditioning", "bar", "continental breakfast"],
"ParkingIncluded": "true",
"LastRenovationDate": "2015-09-20T00:00:00Z",
"Rating": 4.8,
"Address": {
"StreetAddress": "3393 Peachtree Rd",
"City": "Atlanta",
"StateProvince": "GA",
"PostalCode": "30326"
}
},
{
"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 Palace is part of a lovingly restored 1800 palace.",
"Description_fr": "Le Sublime Palace Hotel est situé au coeur du centre historique de sublime dans un quartier extrêmement animé et vivant, à courte distance de marche des sites et monuments de la ville et est entouré par l'extraordinaire beauté des églises, des bâtiments, des commerces et Monuments. Sublime Palace fait partie d'un Palace 1800 restauré avec amour.",
"Category": "Boutique",
"Tags": ["concierge", "view", "24-hour front desk service"],
"ParkingIncluded": true,
"LastRenovationDate": "1960-02-06T00:00:00Z",
"Rating": 4.6,
"Address": {
"StreetAddress": "7400 San Pedro Ave",
"City": "San Antonio",
"StateProvince": "TX",
"PostalCode": "78216"
}
}
]
}
Az indexDefinitionhez hasonlóan a index.ts tetején is importálnunk hotels.json
kell, hogy az adatok elérhetők legyenek a fő függvényünkben.
import hotelData from './hotels.json';
interface Hotel {
HotelId: string;
HotelName: string;
Description: string;
Description_fr: string;
Category: string;
Tags: string[];
ParkingIncluded: string | boolean;
LastRenovationDate: string;
Rating: number;
Address: {
StreetAddress: string;
City: string;
StateProvince: string;
PostalCode: string;
};
};
const hotels: Hotel[] = hotelData["value"];
Ha adatokat szeretne indexelni a keresési indexbe, létre kell hoznunk egy SearchClient
. Bár az SearchIndexClient
indexek létrehozására és kezelésére szolgál, a SearchClient
dokumentumok feltöltésére és az index lekérdezésére szolgál.
Kétféleképpen hozhat létre .SearchClient
Az első lehetőség a nulláról történő létrehozás SearchClient
:
const searchClient = new SearchClient<Hotel>(endpoint, indexName, new AzureKeyCredential(apiKey));
Másik lehetőségként a getSearchClient()
következő metódus SearchIndexClient
használatával is létrehozhatja a következőt SearchClient
:
const searchClient = indexClient.getSearchClient<Hotel>(indexName);
Az ügyfél definiálása után töltse fel a dokumentumokat a keresési indexbe. Ebben az esetben a metódust mergeOrUploadDocuments()
használjuk, amely feltölti a dokumentumokat, vagy egyesíti őket egy meglévő dokumentummal, ha már létezik ugyanazzal a kulccsal rendelkező dokumentum. Ezután ellenőrizze, hogy a művelet sikeres volt-e, mert legalább az első dokumentum létezik.
console.log("Uploading documents...");
const indexDocumentsResult = await searchClient.mergeOrUploadDocuments(hotels);
console.log(`Index operations succeeded: ${JSON.stringify(indexDocumentsResult.results[0].succeeded)}`);
Futtassa újra a programot a következővel tsc && node index.ts
: . Az 1. lépésben látottaktól kissé eltérő üzenetkészletnek kell megjelennie. Ezúttal az index létezik , és látnia kell egy, a törlésről szóló üzenetet, mielőtt az alkalmazás létrehozza az új indexet, és közzétennénk az adatokat.
Mielőtt a következő lépésben futtatnánk a lekérdezéseket, definiáljon egy függvényt, hogy a program egy másodpercig várakozzon. Ez csak tesztelési/demó céljából történik, hogy az indexelés befejeződjön, és hogy a dokumentumok elérhetők legyenek az indexben a lekérdezéseinkhez.
function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}
Ha azt szeretné, hogy a program egy másodpercig várjon, hívja meg a függvényt sleep
:
sleep(1000);
Keresés az indexekben
Egy index létrehozásával és a feltöltött dokumentumokkal lekérdezéseket küldhet az indexnek. Ebben a szakaszban öt különböző lekérdezést küldünk a keresési indexbe, hogy bemutassuk az Ön számára elérhető különböző lekérdezési funkciókat.
A lekérdezések egy sendQueries()
függvényben vannak megírva, amelyet a fő függvényben hívunk meg az alábbiak szerint:
await sendQueries(searchClient);
A rendszer a lekérdezéseket a search()
következő módszerrel küldi searchClient
el: . Az első paraméter a keresési szöveg, a második pedig a keresési beállításokat adja meg.
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.
Ennek searchOptions
a lekérdezésnek a értéke is be van includeTotalCount
állítva true
, amely a talált találatok számát adja vissza.
async function sendQueries(
searchClient: SearchClient<Hotel>
): Promise<void> {
// Query 1
console.log('Query #1 - search everything:');
const selectFields: SearchFieldArray<Hotel> = [
"HotelId",
"HotelName",
"Rating",
];
const searchOptions1 = {
includeTotalCount: true,
select: selectFields
};
let searchResults = await searchClient.search("*", searchOptions1);
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.
A következő lekérdezésben megadjuk a keresési kifejezést "wifi"
, és egy szűrőt is belefoglalunk, amely csak olyan eredményeket ad vissza, ahol az állapot egyenlő 'FL'
. Az eredményeket a szálloda is rendezi Rating
.
console.log('Query #2 - search with filter, orderBy, and select:');
let state = 'FL';
const searchOptions2 = {
filter: odata`Address/StateProvince eq ${state}`,
orderBy: ["Rating desc"],
select: selectFields
};
searchResults = await searchClient.search("wifi", searchOptions2);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
Ezután 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:');
const searchOptions3 = {
select: selectFields,
searchFields: ["HotelName"] as const
};
searchResults = await searchClient.search("Sublime Palace", searchOptions3);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
Egy másik gyakori lehetőség a lekérdezésbe való belefoglalás.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. Az eredmények az eredménypanelen jelölőnégyzetekké alakíthatók.
console.log('Query #4 - limit searchFields and use facets:');
const searchOptions4 = {
facets: ["Category"],
select: selectFields,
searchFields: ["HotelName"] as const
};
searchResults = await searchClient.search("*", searchOptions4);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
A végső lekérdezés a getDocument()
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}`)
A minta újrafuttatása
Hozza létre és futtassa a programot a következővel tsc && node index.ts
: . Most az előző lépéseken kívül a rendszer elküldi a lekérdezéseket, és az eredményeket a konzolra írja.
Ha a saját előfizetésében dolgozik, érdemes az egyes projektek végén eldöntenie, hogy szüksége lesz-e még a létrehozott erőforrásokra. A továbbra is futó erőforrások költségekkel járhatnak. Az erőforrásokat törölheti egyesével, vagy az erőforráscsoport törlésével eltávolíthatja a benne lévő összes erőforrást is.
Ha ingyenes 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.
Ebben a rövid útmutatóban feladatokat dolgozott ki egy index létrehozásához, dokumentumokba való betöltéséhez és lekérdezések futtatásához. Különböző szakaszokban billentyűparancsokkal egyszerűsítettük a kódot az olvashatóság és a megértés érdekében. Most, hogy megismerte az alapfogalmakat, próbáljon ki egy oktatóanyagot, amely meghívja az Azure AI Search API-kat egy webalkalmazásban.