Az OData nyelvének áttekintése az $orderby
Azure AI Searchben és $select
az $filter
Azure AI Searchben
Ez a cikk áttekintést nyújt az Azure AI Searchben használt OData-kifejezésnyelvről, valamint az Azure AI Searchben a numerikus és $select
sztringes (nem aktor) mezőkben használt $filter
$order-by
kulcsszókeresési kifejezésekről.
A nyelv "alulról felfelé" jelenik meg, kezdve a legalapvetőbb elemekkel. A lekérdezéskérelemben létrehozható OData-kifejezések az egyszerűtől a rendkívül összetettig terjednek, de mindegyik közös elemeket használ. A megosztott elemek a következők:
- Mezőútvonalak, amelyek az index adott mezőire vonatkoznak.
- Konstansok, amelyek egy adott adattípus konstans értékei.
Miután megismerte ezeket a gyakori fogalmakat, folytathatja az egyes kifejezések legfelső szintű szintaxisát:
- $filter kifejezések kiértékelése a lekérdezéselemzés során, a keresés adott mezőkre való korlátozása vagy az indexvizsgálatok során használt egyezési feltételek hozzáadása.
- $orderby kifejezések utófeldolgozási lépésként kerülnek alkalmazásra egy eredménykészleten a visszaadott dokumentumok rendezéséhez.
- $select kifejezések határozzák meg, hogy mely dokumentummezők szerepelnek az eredményhalmazban.
Ezeknek a kifejezéseknek a szintaxisa eltér a keresési paraméterben használt egyszerű vagy teljes lekérdezési szintaxistól, bár a hivatkozási mezők szintaxisa átfedésben van.
Más nyelveken, például a Pythonban vagy a C#-ban is találhat példákat az azure-search-vector-samples adattárban.
Feljegyzés
Az Azure AI Search terminológiája néhány szempontból eltér az OData szabványtól . Az Azure AI Search egy mezőjét OData-tulajdonságnak nevezzük, és hasonlóképpen a mező elérési útját és a tulajdonság elérési útját is. Az Azure AI Searchben dokumentumokat tartalmazó indexet az OData általában entitásokat tartalmazó entitáskészletként hivatkozik. Ebben a hivatkozásban az Azure AI Search terminológiája használatos.
Mezőútvonalak
A mezőútvonalak nyelvtanát az alábbi EBNF (Extended Backus-Naur form) határozza meg.
field_path ::= identifier('/'identifier)*
identifier ::= [a-zA-Z_][a-zA-Z_0-9]*
Interaktív szintaxisdiagram is elérhető:
Feljegyzés
A teljes EBNF-hez tekintse meg az Azure AI Search OData-kifejezésszintaxis-hivatkozását.
A mezőútvonalak egy vagy több , perjelekkel elválasztott azonosítóból állnak. Minden azonosító olyan karaktersorozat, amelynek ASCII betűvel vagy aláhúzásjellel kell kezdődnie, és csak ASCII-betűket, számjegyeket vagy aláhúzásjeleket tartalmaz. A betűk lehetnek nagybetűsek vagy kisbetűk.
Az azonosítók hivatkozhatnak egy mező nevére, vagy egy tartományváltozóra a szűrőben lévő gyűjteménykifejezés (any
vagy all
) kontextusában. A tartományváltozó olyan, mint egy hurokváltozó, amely a gyűjtemény aktuális elemét jelöli. Összetett gyűjtemények esetén ez a változó egy objektumot jelöl, ezért mezőútvonalak használatával hivatkozhat a változó almezőire. Ez sok programozási nyelv pontjegyzetéhez hasonló.
Példák a mezőútvonalakra az alábbi táblázatban:
Mező elérési útja | Leírás |
---|---|
HotelName |
Az index legfelső szintű mezőjére hivatkozik |
Address/City |
City Egy összetett mező almezőjére hivatkozik az indexben; Address a példa típusa Edm.ComplexType |
Rooms/Type |
Type Egy összetett gyűjteménymező almezőjére hivatkozik az indexben; Rooms ebben a példában a típus a következőCollection(Edm.ComplexType) : |
Stores/Address/Country |
Country Egy összetett gyűjteménymező almezőjének Address almezőjére hivatkozik az indexben; Stores típusa Collection(Edm.ComplexType) és Address típusa Edm.ComplexType ebben a példában |
room/Type |
Type A tartományváltozó almezőjeroom , például a szűrőkifejezésbenRooms/any(room: room/Type eq 'deluxe') |
store/Address/Country |
Country A tartományváltozó almezőjének Address almezőjestore , például a szűrőkifejezésbenStores/any(store: store/Address/Country eq 'Canada') |
A mezőútvonal jelentése a környezettől függően eltérő. A szűrőkben a mező elérési útja az aktuális dokumentumban lévő mező egyetlen példányának értékét jelenti. Más környezetekben, például $orderby, $select vagy a teljes Lucene szintaxisban lévő mezős keresésben a mező elérési útja maga a mező. Ez a különbség bizonyos következményekkel jár arra nézve, hogy miként használja a mezőútvonalakat a szűrőkben.
Vegye figyelembe a mező elérési útját Address/City
. A szűrőben ez az aktuális dokumentum egyetlen városára vonatkozik, például a "San Francisco"-ra. Ezzel szemben Rooms/Type
, hivatkozik az Type
almező számos szoba (mint a "standard" az első szoba, "deluxe" a második szoba, és így tovább). Mivel Rooms/Type
nem hivatkozik az almező Type
egyetlen példányára, nem használható közvetlenül egy szűrőben. Ehelyett a helyiségtípusra való szűréshez egy lambda kifejezést használna egy tartományváltozóval, például a következővel:
Rooms/any(room: room/Type eq 'deluxe')
Ebben a példában a tartományváltozó room
megjelenik a room/Type
mező elérési útján. Így room/Type
az aktuális dokumentum aktuális helyiségének típusára utal. Ez az Type
almező egyetlen példánya, így közvetlenül a szűrőben is használható.
Mezőútvonalak használata
A mezőútvonalak az Azure AI Search REST API-k számos paraméterében használhatók. Az alábbi táblázat felsorolja az összes helyet, ahol használhatók, valamint a használatukra vonatkozó korlátozásokat:
API | Paraméter neve | Korlátozások |
---|---|---|
Index létrehozása vagy frissítése | suggesters/sourceFields |
Egyik sem |
Index létrehozása vagy frissítése | scoringProfiles/text/weights |
Csak kereshető mezőkre hivatkozhat |
Index létrehozása vagy frissítése | scoringProfiles/functions/fieldName |
Csak szűrhető mezőkre hivatkozhat |
Keresés | search mikor queryType van full |
Csak kereshető mezőkre hivatkozhat |
Keresés | facet |
Csak a facetable mezőkre hivatkozhat |
Keresés | highlight |
Csak kereshető mezőkre hivatkozhat |
Keresés | searchFields |
Csak kereshető mezőkre hivatkozhat |
Javaslat és automatikus kiegészítés | searchFields |
Csak olyan mezőkre hivatkozhat, amelyek egy javaslattevőhöz tartoznak |
Keresés, javaslat és automatikus kiegészítés | $filter |
Csak szűrhető mezőkre hivatkozhat |
Keresés és javaslat | $orderby |
Csak rendezhető mezőkre hivatkozhat |
Keresés, javaslat és keresés | $select |
Csak lekért mezőkre hivatkozhat |
Állandók
Az OData-konstansok egy adott entity data model (EDM) típusú konstansértékek. Az Azure AI Searchben támogatott típusok listáját a Támogatott adattípusok című témakörben találja. A gyűjteménytípusok állandói nem támogatottak.
Az alábbi táblázat az OData-kifejezéseket támogató nem adattípusok konstansainak példáit mutatja be:
Adattípus | Példaállandók |
---|---|
Edm.Boolean |
true , false |
Edm.DateTimeOffset |
2019-05-06T12:30:05.451Z |
Edm.Double |
3.14159 , -1.2e7 , NaN , INF -INF |
Edm.GeographyPoint |
geography'POINT(-122.131577 47.678581)' |
Edm.GeographyPolygon |
geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))' |
Edm.Int32 |
123 , -456 |
Edm.Int64 |
283032927235 |
Edm.String |
'hello' |
Speciális karakterek menekülése sztringállandókban
Az OData sztringállandóit egyetlen idézőjelek határolják el. Ha olyan sztringállandóval rendelkező lekérdezést kell létrehoznia, amely maga is tartalmazhat egyetlen idézőjelet, a beágyazott idézőjelek megkétszerezésével elkerülheti őket.
Például egy olyan formázatlan aposztrófot tartalmazó kifejezés, mint "Alice autója" az OData-ban sztringállandóként 'Alice''s car'
jelenik meg.
Fontos
A szűrők programozott létrehozásakor fontos megjegyezni, hogy a felhasználói bemenetből származó sztringállandók kivédésére van szükség. Ez az injektálási támadások lehetőségének mérséklése, különösen akkor, ha szűrőket használ a biztonsági vágás implementálásához.
Konstansok szintaxisa
Az alábbi EBNF (Extended Backus-Naur Form) a fenti táblázatban látható állandók többségének nyelvtanát határozza meg. A földrajzi térbeli típusok nyelvtana az Azure AI Search OData geo-térbeli függvényeiben található.
constant ::=
string_literal
| date_time_offset_literal
| integer_literal
| float_literal
| boolean_literal
| 'null'
string_literal ::= "'"([^'] | "''")*"'"
date_time_offset_literal ::= date_part'T'time_part time_zone
date_part ::= year'-'month'-'day
time_part ::= hour':'minute(':'second('.'fractional_seconds)?)?
zero_to_fifty_nine ::= [0-5]digit
digit ::= [0-9]
year ::= digit digit digit digit
month ::= '0'[1-9] | '1'[0-2]
day ::= '0'[1-9] | [1-2]digit | '3'[0-1]
hour ::= [0-1]digit | '2'[0-3]
minute ::= zero_to_fifty_nine
second ::= zero_to_fifty_nine
fractional_seconds ::= integer_literal
time_zone ::= 'Z' | sign hour':'minute
sign ::= '+' | '-'
/* In practice integer literals are limited in length to the precision of
the corresponding EDM data type. */
integer_literal ::= digit+
float_literal ::=
sign? whole_part fractional_part? exponent?
| 'NaN'
| '-INF'
| 'INF'
whole_part ::= integer_literal
fractional_part ::= '.'integer_literal
exponent ::= 'e' sign? integer_literal
boolean_literal ::= 'true' | 'false'
Interaktív szintaxisdiagram is elérhető:
Feljegyzés
A teljes EBNF-hez tekintse meg az Azure AI Search OData-kifejezésszintaxis-hivatkozását.
Kifejezések létrehozása mezőútvonalakból és állandókból
A mezőútvonalak és -állandók az OData-kifejezések legalapvetőbb részei, de már maguk a teljes kifejezések. Az Azure AI Search $select paramétere valójában nem más, mint a mezőútvonalak vesszővel tagolt listája, és $orderby nem sokkal bonyolultabb, mint $select. Ha történetesen egy típusmező Edm.Boolean
van az indexben, akár olyan szűrőt is írhat, amely nem más, mint a mező elérési útja. Az állandók true
és false
ugyanígy érvényes szűrők.
Gyakoribb azonban, hogy összetett kifejezések egynél több mezőre és állandóra hivatkoznak. Ezek a kifejezések a paramétertől függően különböző módokon épülnek fel.
A következő EBNF (Extended Backus-Naur form) határozza meg a $filter, $orderby és $select paraméterek nyelvtanát. Ezek a mezőútvonalakra és állandókra hivatkozó egyszerűbb kifejezésekből épülnek fel:
filter_expression ::= boolean_expression
order_by_expression ::= order_by_clause(',' order_by_clause)*
select_expression ::= '*' | field_path(',' field_path)*
Interaktív szintaxisdiagram is elérhető:
Feljegyzés
A teljes EBNF-hez tekintse meg az Azure AI Search OData-kifejezésszintaxis-hivatkozását.
Következő lépések
A $orderby és $select paraméterek az egyszerűbb kifejezések vesszővel tagolt listái. A $filter paraméter egy logikai kifejezés, amely egyszerűbb részexpressziókból áll. Ezek az alkifejezések olyan logikai operátorok használatával vannak kombinálva, mint a , or
, és not
az összehasonlító operátorok, példáuleq
, lt
, gt
stb.all
any
and
A $filter, $orderby és $select paramétereket az alábbi cikkek részletesebben ismertetik: