Přehled jazyka OData pro $filter
, $orderby
a $select
ve službě Azure AI Search
Tento článek obsahuje přehled jazyka výrazů OData používaného v $filter
polích a $select
$order-by
výrazy pro vyhledávání klíčových slov ve službě Azure AI Search přes číselná a řetězcová pole (nevector).
Jazyk se prezentuje jako "dole nahoru" počínaje nejzásadnějšími prvky. Výrazy OData, které můžete vytvořit v požadavku dotazu, jsou jednoduché až vysoce složité, ale všechny sdílejí společné prvky. Mezi sdílené prvky patří:
- Cesty k polím, které odkazují na konkrétní pole indexu
- Konstanty, které jsou literálními hodnotami určitého datového typu.
Jakmile pochopíte tyto běžné koncepty, můžete pokračovat v syntaxi nejvyšší úrovně pro každý výraz:
- $filter výrazy se vyhodnocují během analýzy dotazů, omezují vyhledávání na konkrétní pole nebo přidávají kritéria shody použitá při prohledávání indexu.
- $orderby výrazy se použijí jako krok následného zpracování v sadě výsledků pro řazení vrácených dokumentů.
- $select výrazy určují, která pole dokumentu jsou zahrnuta do sady výsledků.
Syntaxetěchtoch výrazů se liší od jednoduché nebo úplné syntaxe dotazu použité v parametru vyhledávání.
Příklady v jiných jazycích, jako je Python nebo C#, najdete v příkladech v úložišti azure-search-vector-samples .
Poznámka:
Terminologie ve službě Azure AI Search se liší od standardu OData několika způsoby. Čemu říkáme pole ve službě Azure AI Search, se v OData nazývá vlastnost a podobně pro cestu k poli a cestu k vlastnosti. Index obsahující dokumenty ve službě Azure AI Search se obecněji odkazuje v OData jako sada entit obsahující entity. Terminologie služby Azure AI Search se používá v rámci tohoto odkazu.
Cesty k polím
Následující ebNF (Extended Backus-Naur Form) definuje gramatiku cest polí.
field_path ::= identifier('/'identifier)*
identifier ::= [a-zA-Z_][a-zA-Z_0-9]*
K dispozici je také interaktivní diagram syntaxe:
Poznámka:
Úplný soubor EBNF najdete v referenčních informacích k syntaxi výrazů OData pro Azure AI Search .
Cesta k poli se skládá z jednoho nebo více identifikátorů oddělených lomítky. Každý identifikátor je posloupnost znaků, která musí začínat písmenem nebo podtržítkem ASCII a obsahovat pouze písmena ASCII, číslice nebo podtržítka. Písmena můžou být velká nebo malá.
Identifikátor může odkazovat buď na název pole, nebo na proměnnou rozsahu v kontextu výrazu kolekce (any
nebo all
) ve filtru. Proměnná rozsahu je jako proměnná smyčky, která představuje aktuální prvek kolekce. U složitých kolekcí tato proměnná představuje objekt, což je důvod, proč můžete použít cesty polí k odkazování na podpole proměnné. To je podobné zápisu v mnoha programovacích jazycích.
Příklady cest polí jsou uvedeny v následující tabulce:
Cesta k poli | Popis |
---|---|
HotelName |
Odkazuje na pole nejvyšší úrovně indexu. |
Address/City |
Odkazuje na City dílčí pole komplexního pole v indexu; Address je typu Edm.ComplexType v tomto příkladu. |
Rooms/Type |
Odkazuje na Type dílčí pole komplexního pole kolekce v indexu; Rooms je typu Collection(Edm.ComplexType) v tomto příkladu. |
Stores/Address/Country |
Odkazuje na Country dílčí pole pod pole Address komplexní kolekce v indexu; Stores je typu Collection(Edm.ComplexType) a Address je typu Edm.ComplexType v tomto příkladu. |
room/Type |
Odkazuje na Type podpole proměnné rozsahu room , například ve výrazu filtru. Rooms/any(room: room/Type eq 'deluxe') |
store/Address/Country |
Odkazuje na Country pod pole pod pole Address store proměnné rozsahu, například ve výrazu filtru. Stores/any(store: store/Address/Country eq 'Canada') |
Význam cesty pole se liší v závislosti na kontextu. V filtrech cesta k poli odkazuje na hodnotu jedné instance pole v aktuálním dokumentu. V jiných kontextech, jako jsou $orderby, $select nebo v poli hledání v úplné syntaxi Lucene, odkazuje cesta pole na samotné pole. Tento rozdíl má určité důsledky pro použití cest polí ve filtrech.
Zvažte cestu Address/City
pole . Ve filtru to odkazuje na jedno město pro aktuální dokument, například "San Francisco". Naproti tomu Rooms/Type
odkazuje na Type
dílčí pole pro mnoho místností (například "standard" pro první místnost, "deluxe" pro druhý pokoj atd.). Vzhledem k tomu Rooms/Type
, že neodkazuje na jednu instanci dílčího pole Type
, nelze ji použít přímo ve filtru. Místo toho byste k filtrování typu místnosti použili výraz lambda s proměnnou rozsahu, například takto:
Rooms/any(room: room/Type eq 'deluxe')
V tomto příkladu se proměnná room
rozsahu zobrazí v cestě room/Type
pole. Tímto způsobem room/Type
odkazuje na typ aktuální místnosti v aktuálním dokumentu. Toto je jedna instance dílčího Type
pole, takže ji lze použít přímo ve filtru.
Použití cest k polím
Cesty k polím se používají v mnoha parametrech rozhraní REST API služby Azure AI Search. Následující tabulka uvádí všechna místa, kde se dají použít, a všechna omezení jejich použití:
rozhraní API | Název parametru | Omezení |
---|---|---|
Vytvoření nebo aktualizace indexu | suggesters/sourceFields |
Nic |
Vytvoření nebo aktualizace indexu | scoringProfiles/text/weights |
Může odkazovat pouze na prohledávatelná pole. |
Vytvoření nebo aktualizace indexu | scoringProfiles/functions/fieldName |
Může odkazovat pouze na filtrovatelná pole. |
Vyhledat | search kdy queryType je full |
Může odkazovat pouze na prohledávatelná pole. |
Vyhledat | facet |
Může odkazovat pouze na fasetová pole. |
Vyhledat | highlight |
Může odkazovat pouze na prohledávatelná pole. |
Vyhledat | searchFields |
Může odkazovat pouze na prohledávatelná pole. |
Navrhnout a automaticky dokončovat | searchFields |
Může odkazovat pouze na pole, která jsou součástí navrhujícího |
Hledání, návrhy a automatické dokončování | $filter |
Může odkazovat pouze na filtrovatelná pole. |
Hledání a návrhy | $orderby |
Může odkazovat pouze na řaditelná pole. |
Hledání, návrhy a vyhledávání | $select |
Může odkazovat pouze na pole s možností načtení. |
Konstanty
Konstanty v OData jsou literální hodnoty daného typu EDM (Entity Data Model). Seznam podporovaných typů ve službě Azure AI Search najdete v tématu Podporované datové typy . Konstanty typů kolekcí se nepodporují.
Následující tabulka uvádí příklady konstant pro každý datový typ bezvectoru, který podporuje výrazy OData:
Datový typ | Ukázkové konstanty |
---|---|
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' |
Zapouzdření speciálních znaků v řetězcových konstantách
Řetězcové konstanty v OData jsou oddělené jednoduchými uvozovkami. Pokud potřebujete vytvořit dotaz s řetězcovou konstantou, která by sama mohla obsahovat jednoduché uvozovky, můžete uvozovky uvozovky uvozovek vytvořit tak, že je zdvojnásobíte.
Například fráze s neformátovaným apostrofem jako "Alice's car" by byla reprezentována v OData jako řetězcová konstanta 'Alice''s car'
.
Důležité
Při programovém vytváření filtrů je důležité pamatovat na řídicí řetězcové konstanty, které pocházejí ze vstupu uživatele. To je zmírnit možnost útoků prostřednictvím injektáže, zejména při použití filtrů k implementaci oříznutí zabezpečení.
Syntaxe konstant
Následující formulář EBNF (Extended Backus-Naur Form) definuje gramatiku většiny konstant zobrazených v předchozí tabulce. Gramatiku pro geoprostorové typy najdete v geoprostorových funkcích OData ve službě Azure AI Search.
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'
K dispozici je také interaktivní diagram syntaxe:
Poznámka:
Úplný soubor EBNF najdete v referenčních informacích k syntaxi výrazů OData pro Azure AI Search .
Vytváření výrazů z cest polí a konstant
Cesty polí a konstanty jsou nejzásadnější součástí výrazu OData, ale už jsou úplnými výrazy. Ve skutečnosti není parametr $select ve službě Azure AI Search nic, ale seznam cest polí oddělený čárkami a $orderby není mnohem složitější než $select. Pokud máte pole typu Edm.Boolean
v indexu, můžete dokonce napsat filtr, který není nic jiného než cesta k tomuto poli. Konstanty true
a false
jsou stejně platné filtry.
Je ale častější mít komplexní výrazy, které odkazují na více než jedno pole a konstantu. Tyto výrazy jsou sestaveny různými způsoby v závislosti na parametru.
Následující formulář EBNF (Extended Backus-Naur Form) definuje gramatiku pro parametry $filter, $orderby a $select . Jsou sestavené z jednodušších výrazů, které odkazují na cesty polí a konstanty:
filter_expression ::= boolean_expression
order_by_expression ::= order_by_clause(',' order_by_clause)*
select_expression ::= '*' | field_path(',' field_path)*
K dispozici je také interaktivní diagram syntaxe:
Poznámka:
Úplný soubor EBNF najdete v referenčních informacích k syntaxi výrazů OData pro Azure AI Search .
Další kroky
Parametry $orderby a $select jsou seznamy jednodušších výrazů oddělené čárkami. Parametr $filter je logický výraz, který se skládá z jednodušších dílčích výrazů. Tyto dílčí výrazy jsou kombinovány pomocí logických operátorů, jako and
jsou , or
anot
, relační operátory jako eq
, gt
lt
, a tak dále, a operátory kolekce, jako any
all
a .
Parametry $filter, $orderby a $select jsou podrobněji prozkoumány v následujících článcích: