Eredmények alakítása az Azure AI Searchben
Ez a cikk bemutatja, hogyan használható lekérdezési válasz az Azure AI Searchben. A válasz struktúráját a lekérdezésben szereplő paraméterek határozzák meg, a Keresési dokumentumok (REST) vagy a SearchResults osztály (Azure for .NET) szerint.
A lekérdezés paraméterei a következőt határozzák meg:
- Mező kijelölése
- A lekérdezés indexében található egyezések száma
- Lapozás
- A válaszban szereplő eredmények száma (alapértelmezés szerint legfeljebb 50)
- Sorrend
- Az eredményen belüli kifejezések kiemelése, egyezés a teljes vagy részleges kifejezésre a törzsben
Eredményösszeállítás
Az eredmények táblázatosak, az összes "lekérdezhető" mező mezőiből állnak, vagy csak a $select
paraméterekben megadott mezőkre korlátozódnak. A sorok az egyező dokumentumok.
Kiválaszthatja, hogy mely mezők szerepelnek a keresési eredmények között. Bár a keresődokumentumok sok mezővel rendelkezhetnek, általában csak néhányra van szükség az egyes dokumentumok eredményben való megjelenítéséhez. Egy lekérdezési kérelemhez fűzze hozzá $select=<field list>
, hogy megadja, mely "lekérhető" mezők jelenjenek meg a válaszban.
Válasszon olyan mezőket, amelyek kontrasztot és különbséget kínálnak a dokumentumok között, és elegendő információt nyújtanak a felhasználó átkattintási válaszának meghívásához. Egy e-kereskedelmi webhelyen ez lehet egy terméknév, leírás, márka, szín, méret, ár és értékelés. A beépített szállodák mintául szolgáló index esetében a következő példában a "kiválasztás" mezők lehetnek:
POST /indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
"search": "sandy beaches",
"select": "HotelId, HotelName, Description, Rating, Address/City",
"count": true
}
Tippek váratlan eredményekhez
Időnként a lekérdezés kimenete nem az, amire számít. Előfordulhat például, hogy egyes találatok duplikáltnak tűnnek, vagy a felső rész közelében megjelenő találatok az eredményekben alacsonyabban vannak elhelyezve. Ha a lekérdezés eredménye váratlan, megpróbálhatja ezeket a lekérdezésmódosításokat, hogy lássa, javulnak-e az eredmények:
Módosítsa
searchMode=any
(alapértelmezés szerint) úgy, hogysearchMode=all
a feltételek helyett az összes feltételre vonatkozó egyezéseket követeljen meg. Ez különösen igaz, ha logikai operátorok szerepelnek a lekérdezésben.Kísérletezzen különböző lexikális elemzőkkel vagy egyéni elemzőkkel annak ellenőrzéséhez, hogy módosítja-e a lekérdezés eredményét. Az alapértelmezett elemző megszakítja az elválasztott szavakat, és gyökéralakokra csökkenti a szavakat, ami általában javítja a lekérdezési válaszok robusztusságát. Ha azonban meg kell őriznie a kötőjeleket, vagy ha a sztringek speciális karaktereket tartalmaznak, előfordulhat, hogy egyéni elemzőket kell konfigurálnia, hogy az index a megfelelő formátumú jogkivonatokat tartalmazzon. További információ: Részleges kifejezéskeresés és speciális karakterekkel (kötőjelek, helyettesítő karakterek, regex, minták) rendelkező minták.
Egyezések számlálása
A count paraméter az index azon dokumentumainak számát adja vissza, amelyek egyezésnek minősülnek a lekérdezéshez. A szám visszaadásához adja hozzá $count=true
a lekérdezési kérelemhez. A keresési szolgáltatás nem ír elő maximális értéket. A lekérdezéstől és a dokumentumok tartalmától függően a szám olyan magas lehet, mint az index összes dokumentuma.
A darabszám akkor pontos, ha az index stabil. Ha a rendszer aktívan ad hozzá, frissít vagy töröl dokumentumokat, a szám hozzávetőleges, kivéve a nem teljes indexelt dokumentumokat.
A keresési szolgáltatás rutinszerű karbantartása és egyéb számítási feladatai nem befolyásolják a számokat. Ha azonban több partícióval és egyetlen replikával rendelkezik, rövid távú ingadozásokat tapasztalhat a dokumentumszámban (néhány perc), amikor a partíciók újraindulnak.
Tipp.
Az indexelési műveletek ellenőrzéséhez egy üres keresési search=*
lekérdezés hozzáadásával $count=true
ellenőrizheti, hogy az index tartalmazza-e a várt számú dokumentumot. Az eredmény az indexben lévő dokumentumok teljes száma.
A lekérdezés szintaxisának tesztelése során gyorsan megállapíthatja, $count=true
hogy a módosítások nagyobb vagy kevesebb eredményt adnak-e vissza, ami hasznos visszajelzés lehet.
Lapozás eredményei
Alapértelmezés szerint a keresőmotor legfeljebb az első 50 találatot adja vissza. Az első 50-et a keresési pontszám határozza meg, feltéve, hogy a lekérdezés teljes szöveges keresés vagy szemantikai. Ellenkező esetben az első 50 egy tetszőleges sorrend a pontos egyezéses lekérdezésekhez (ahol az egységes "@searchScore=1,0" tetszőleges rangsorolást jelez).
A felső korlát 1000 dokumentumot ad vissza a keresési eredmények lapjánként, így a felső érték legfeljebb 1000 dokumentumot adhat vissza az első találatban. Az újabb előzetes verziójú API-kban, ha hibrid lekérdezést használ, legfeljebb 10 000 dokumentum visszaadásához megadhatja a maxTextRecallSize értéket.
Az eredményhalmazban visszaadott összes dokumentum lapszámozásának szabályozásához adjon hozzá $top
és $skip
paramétereket egy GET kérelemhez vagy top
skip
egy POST-kérelemhez. Az alábbi lista ismerteti a logikát.
Adja vissza az első 15 egyező dokumentumot, valamint a teljes egyezések számát:
GET /indexes/<INDEX-NAME>/docs?search=<QUERY STRING>&$top=15&$skip=0&$count=true
Adja vissza a második készletet, és kihagyja az első 15-öt a következő 15 lekéréséhez:
$top=15&$skip=15
. Ismételje meg a 15-ös harmadik készletet:$top=15&$skip=30
A lapszámozott lekérdezések eredményei nem garantáltan stabilak, ha a mögöttes index megváltozik. A lapozás megváltoztatja $skip
az egyes lapok értékét, de minden lekérdezés független, és az adatok aktuális nézetén működik, mivel az a lekérdezéskor az indexben található (vagyis nincs gyorsítótárazás vagy pillanatkép az eredményekről, például egy általános célú adatbázisban találhatók).
Az alábbiakban egy példát mutatunk be arra, hogyan szerezheti be az ismétlődéseket. Tegyük fel, hogy egy index négy dokumentummal rendelkezik:
{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
{ "id": "4", "rating": 1 }
Most tegyük fel, hogy az eredményeket egyszerre kettővel szeretné visszaadni, értékelés szerint rendezve. Ezt a lekérdezést az eredmények első oldalának lekéréséhez hajtja végre: $top=2&$skip=0&$orderby=rating desc
a következő eredményeket hozva létre:
{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
A szolgáltatásban tegyük fel, hogy egy ötödik dokumentumot ad hozzá az indexhez a lekérdezéshívások között: { "id": "5", "rating": 4 }
. Röviddel ezután végrehajt egy lekérdezést a második oldal lekéréséhez, $top=2&$skip=2&$orderby=rating desc
és lekéri az alábbi eredményeket:
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
Figyelje meg, hogy a 2. dokumentum kétszer lesz beolvasva. Ennek az az oka, hogy az új 5. dokumentum nagyobb értékkel rendelkezik az értékeléshez, ezért a 2. dokumentum előtt rendez, és az első oldalra kerül. Bár ez a viselkedés váratlan lehet, jellemző, hogy a keresőmotor hogyan viselkedik.
Sok találat lapozása
$skip
A keresési lekérdezések $top
100 000 találaton keresztüli lapozását teszik lehetővé, de mi a teendő, ha a találatok nagyobbak 100 000-nél? Ha ilyen nagy válaszon szeretne átlapozást végezni, használjon rendezési sorrendet és tartományszűrőt kerülő megoldásként a következőhöz $skip
: .
Ebben a kerülő megoldásban a rendezés és a szűrés egy dokumentumazonosító mezőre vagy az egyes dokumentumokhoz egyedi mezőre lesz alkalmazva. Az egyedi mezőnek rendelkeznie filterable
kell a sortable
keresési indexben és a hozzárendeléssel.
Adjon ki egy lekérdezést a rendezett eredmények teljes oldalának visszaadásához.
POST /indexes/good-books/docs/search?api-version=2024-07-01 { "search": "divine secrets", "top": 50, "orderby": "id asc" }
Válassza ki a keresési lekérdezés által visszaadott utolsó eredményt. Itt egy csak azonosító értékkel rendelkező példaeredmény jelenik meg.
{ "id": "50" }
Használja ezt az azonosítóértéket egy tartománylekérdezésben a következő találatoldal lekéréséhez. Ennek az azonosítómezőnek egyedi értékekkel kell rendelkeznie, ellenkező esetben a lapozás ismétlődő eredményeket tartalmazhat.
POST /indexes/good-books/docs/search?api-version=2024-07-01 { "search": "divine secrets", "top": 50, "orderby": "id asc", "filter": "id ge 50" }
A lapozás akkor fejeződik be, amikor a lekérdezés nulla eredményt ad vissza.
Feljegyzés
A "szűrhető" és a "rendezhető" attribútumok csak akkor engedélyezhetők, ha egy mezőt először adnak hozzá egy indexhez, és nem engedélyezhetők meglévő mezőben.
Az eredmények rendezése
Egy teljes szöveges keresési lekérdezésben a találatok a következő sorrendben rangsorolhatók:
- keresési pontszám
- szemantikai reranker-pontszám
- rendezési sorrend egy "rendezhető" mezőben
Az adott mezőkben található találatokat pontozási profil hozzáadásával is növelheti.
Sorrend keresési pontszám szerint
A teljes szöveges keresési lekérdezések esetében a találatokat automatikusan egy keresési pontszám rangsorolja, amely a kifejezés gyakorisága és közelsége alapján van kiszámítva egy dokumentumban (TF-IDF-ből származik), és magasabb pontszámok jelennek meg a keresési kifejezésben több vagy erősebb találatot tartalmazó dokumentumokban.
A "@search.score" tartomány vagy kötetlen, vagy a régebbi szolgáltatások 0-1,00-ig (de nem beleértve) az 1,00-ig terjedő tartományt.
Bármelyik algoritmus esetében az 1,00-nak megfelelő "@search.score" egy nem rögzített vagy nem rögzített eredményhalmazt jelöl, ahol az 1.0 pontszám minden eredményben egységes. A nem rögzített eredmények akkor fordulnak elő, ha a lekérdezési űrlap zavaros keresés, helyettesítő vagy regex lekérdezés, vagy üres keresés (search=*
). Ha rangsorolási struktúrát kell előírnia a nem rögzített eredményekhez képest, fontolja meg ezt a célt elérő $orderby
kifejezést.
Rendelés a szemantikai reranker szerint
Szemantikai rangsoroló használata esetén a "@search.rerankerScore" határozza meg az eredmények rendezési sorrendjét.
A "@search.rerankerScore" tartomány 1 és 4,00 között van, ahol a magasabb pontszám erősebb szemantikai egyezést jelez.
Rendelés $orderby
Ha a konzisztens rendezés alkalmazáskövetelmény, definiálhat egy $orderby
kifejezést egy mezőben. Az eredmények rendezéséhez csak az indexelhetőként indexelt mezők használhatók.
A gyakran használt mezők közé tartozik a $orderby
minősítés, a dátum és a hely. A hely szerinti szűréshez a szűrőkifejezés a mezőnév mellett a geo.distance()
függvényt is meghívja.
A numerikus mezők (Edm.Double
, Edm.Int32
, ) Edm.Int64
numerikus sorrendbe vannak rendezve (például 1, 2, 10, 11, 20).
A sztringmezők (Edm.String
almezőkEdm.ComplexType
) a nyelvtől függően ASCII rendezési sorrendben vagy Unicode rendezési sorrendben vannak rendezve.
A sztringmezők numerikus tartalma betűrendbe van rendezve (1, 10, 11, 2, 20).
A nagybetűs sztringek kisbetűk előtt vannak rendezve (APPLE, Apple, BANÁN, Banán, alma, banán). A rendezés előtt hozzárendelhet egy szöveg normalizálót a szöveg előfeldolgozásához a viselkedés módosításához. A kisbetűs tokenizer mezőn való használata nincs hatással a rendezési viselkedésre, mivel az Azure AI Search a mező nem elemezett példányán rendez.
A mellékjelekkel rendelkező sztringek utolsóként jelennek meg (Äpfel, Öffnen, Üben)
Relevancia növelése pontozási profillal
A rendeléskonzisztenciát előmozdító másik módszer az egyéni pontozási profil használata. A pontozási profilok nagyobb mértékben szabályozják a keresési eredményekben szereplő elemek rangsorolását, így az adott mezőkben található találatok is növelhetők. A többletpontozási logika segíthet felülbírálni a replikák közötti kisebb különbségeket, mivel az egyes dokumentumok keresési pontszámai távolabb vannak egymástól. Ehhez a megközelítéshez a rangsorolási algoritmust javasoljuk.
Találatok kiemelése
A találatkiemelés szövegformázást (például félkövér vagy sárga kiemelést) jelent, amelyet az eredményben szereplő egyező kifejezésekre alkalmaztak, így könnyen észreveheti az egyezést. A kiemelés olyan hosszabb tartalommezők esetén hasznos, mint például egy leírásmező, ahol az egyezés nem egyértelmű azonnal.
Figyelje meg, hogy a kiemelés az egyes kifejezésekre vonatkozik. A teljes mező tartalma nem emel ki kiemelési képességet. Ha egy kifejezés fölé szeretne emelni, egy idézőjelbe foglalt lekérdezési sztringben meg kell adnia az egyező kifejezéseket (vagy kifejezéseket). Ezt a technikát részletesebben ebben a szakaszban ismertetjük.
A találatkiemelési utasításokat a lekérdezési kérelem tartalmazza. A lekérdezésbővítést a motorban aktiváló lekérdezések, például a homályos és a helyettesítő keresés korlátozottan támogatják a találatok kiemelését.
A találatok kiemelésének követelményei
- A mezőknek
Edm.String
Collection(Edm.String)
- A mezőket kereshető helyen kell hozzárendelni
Kiemelés megadása a kérelemben
A kiemelt kifejezések visszaadásához adja meg a "highlight" paramétert a lekérdezési kérelemben. A paraméter a mezők vesszővel tagolt listájára van beállítva.
Alapértelmezés szerint a formátumjelölés az<em>
, de felülbírálhatja a címkét a paraméterek és highlightPostTag
a paraméterek használatávalhighlightPreTag
. Az ügyfélkód kezeli a választ (például félkövér betűtípust vagy sárga hátteret alkalmaz).
POST /indexes/good-books/docs/search?api-version=2024-07-01
{
"search": "divine secrets",
"highlight": "title, original_title",
"highlightPreTag": "<b>",
"highlightPostTag": "</b>"
}
Az Azure AI Search alapértelmezés szerint mezőnként legfeljebb öt kiemelést ad vissza. Ezt a számot egy kötőjel és egy egész szám összefűzésével módosíthatja. A "leírás" mezőben például "highlight": "description-10"
legfeljebb 10 kiemelt kifejezést ad vissza a megfelelő tartalomhoz.
Kiemelt eredmények
Amikor a lekérdezéshez hozzáadja a kiemelést, a válasz minden eredményhez tartalmaz egy "@search.highlights" értéket, hogy az alkalmazáskód megcélozhassa ezt a struktúrát. A "kiemelés" mezőben megadott mezők listája szerepel a válaszban.
A kulcsszókeresésben minden kifejezés külön-külön van beolvasva. Az "isteni titkos kódok" lekérdezése egyezést ad vissza minden olyan dokumentumon, amely bármelyik kifejezést tartalmazza.
Kulcsszókeresés kiemelése
A kiemelt mezőkben a program a formázást egész kifejezésekre alkalmazza. Például a "The Divine Secrets of the Ya-Ya Sisterhood" (A Ya-Ya Testvériség isteni titkai) elleni mérkőzésen a formázást minden kifejezésre külön-külön alkalmazza a rendszer, annak ellenére, hogy egymás után vannak.
"@odata.count": 39,
"value": [
{
"@search.score": 19.593246,
"@search.highlights": {
"original_title": [
"<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
],
"title": [
"<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
]
},
"original_title": "Divine Secrets of the Ya-Ya Sisterhood",
"title": "Divine Secrets of the Ya-Ya Sisterhood"
},
{
"@search.score": 12.779835,
"@search.highlights": {
"original_title": [
"<em>Divine</em> Madness"
],
"title": [
"<em>Divine</em> Madness (Cherub, #5)"
]
},
"original_title": "Divine Madness",
"title": "Divine Madness (Cherub, #5)"
},
{
"@search.score": 12.62534,
"@search.highlights": {
"original_title": [
"Grave <em>Secrets</em>"
],
"title": [
"Grave <em>Secrets</em> (Temperance Brennan, #5)"
]
},
"original_title": "Grave Secrets",
"title": "Grave Secrets (Temperance Brennan, #5)"
}
]
Kifejezéskeresés kiemelése
A teljes kifejezésformázás a kifejezéskeresésre is vonatkozik, ahol több kifejezés is kettős idézőjelek közé van zárva. Az alábbi példa ugyanaz a lekérdezés, azzal a kivétellel, hogy az "isteni titkok" idézőjeles kifejezésként lesznek elküldve (egyes REST-ügyfelek megkövetelik, hogy a belső idézőjeleket fordított perjellel \"
hárítsa el):
POST /indexes/good-books/docs/search?api-version=2024-07-01
{
"search": "\"divine secrets\"",
"select": "title,original_title",
"highlight": "title",
"highlightPreTag": "<b>",
"highlightPostTag": "</b>",
"count": true
}
Mivel a feltételeknek most már mindkét kifejezésük van, csak egy egyezés található a keresési indexben. A fenti lekérdezésre adott válasz a következőképpen néz ki:
{
"@odata.count": 1,
"value": [
{
"@search.score": 19.593246,
"@search.highlights": {
"title": [
"<b>Divine</b> <b>Secrets</b> of the Ya-Ya Sisterhood"
]
},
"original_title": "Divine Secrets of the Ya-Ya Sisterhood",
"title": "Divine Secrets of the Ya-Ya Sisterhood"
}
]
}
Kifejezéskiemelés a régebbi szolgáltatásokon
Search szolgáltatás 2020. július 15-e előtt létrehozottak más kiemelési felületet implementálnak a kifejezés-lekérdezésekhez.
Az alábbi példákhoz tegyük fel, hogy egy lekérdezési sztring tartalmazza a "super bowl" idézőjelbe foglalt kifejezést. 2020 júliusa előtt a kifejezés bármely kifejezése ki van emelve:
"@search.highlights": {
"sentence": [
"The <em>super</em> <em>bowl</em> is <em>super</em> awesome with a <em>bowl</em> of chips"
]
A 2020 júliusa után létrehozott keresési szolgáltatások esetében csak a teljes kifejezési lekérdezésnek megfelelő kifejezések lesznek visszaadva a "@search.highlights":
"@search.highlights": {
"sentence": [
"The <em>super</em> <em>bowl</em> is super awesome with a bowl of chips"
]
Következő lépések
Az ügyfél keresési oldalának gyors létrehozásához vegye figyelembe az alábbi lehetőségeket:
Hozzon létre egy bemutatóalkalmazást a portálon, és létrehoz egy HTML-oldalt egy keresősávtal, a részletes navigációval és a képeket tartalmazó találati területtel.
Az ASP.NET Core (MVC) alkalmazáshoz való keresés olyan oktatóanyag és kódminta, amely egy funkcionális ügyfelet hoz létre.
A keresés hozzáadása webalkalmazásokhoz egy oktatóanyag és kódminta, amely a React JavaScript-kódtárakat használja a felhasználói élményhez. Az alkalmazás üzembe helyezése az Azure Static Web Apps használatával történik.