Přehled jazyka OData pro $filter , $orderby a $select v Azure kognitivní hledání
Azure Kognitivní hledání podporuje podmnožinu Syntaxe výrazů OData pro výrazy $Filter, $OrderBy a $Select . Výrazy filtru jsou vyhodnocovány během analýzy dotazů, omezení vyhledávání na konkrétní pole nebo přidání kritérií shody používaných při prohledávání indexů. Výrazy ORDER by se používají jako krok po zpracování v rámci sady výsledků dotazu pro řazení vrácených dokumentů. Výrazy pro výběr určují, která pole dokumentu jsou zahrnutá v sadě výsledků. Syntaxe těchto výrazů je odlišná od syntaxe jednoduchého nebo úplného dotazu, která se používá v parametru vyhledávání , i když je v syntaxi pro odkazování polí nějaký překryv.
Tento článek poskytuje přehled jazyka OData Expression používaného ve filtrech, výrazech ORDER by a SELECT. Jazyk se zobrazí jako "zdola nahoru", počínaje základními prvky a sestavování na nich. Syntaxe nejvyšší úrovně pro každý parametr je popsána v samostatném článku:
Výrazy OData jsou od jednoduchých až vysoce složité, ale všechny sdílejí společné prvky. Nejzákladnější části výrazu OData v Azure Kognitivní hledání jsou:
- Cesty k poli, které odkazují na konkrétní pole indexu.
- Konstanty, které jsou literálové hodnoty určitého datového typu.
Poznámka
Terminologie v Azure Kognitivní hledání se od standardu OData liší několika způsoby. K volání pole v Azure kognitivní hledání se říká vlastnost v OData a podobně jako cesta k poli a cesta k vlastnosti. Index obsahující dokumenty v Azure kognitivní hledání se v OData označuje obecněji jako sada entit obsahující entity. V rámci tohoto odkazu se používá terminologie Azure Kognitivní hledání.
Cesty k poli
Následující EBNF (rozšířený Backus-Naur formulář) definuje gramatiku cest polí.
field_path ::= identifier('/'identifier)*
identifier ::= [a-zA-Z_][a-zA-Z_0-9]*
K dispozici je také diagram interaktivní syntaxe:
Poznámka
Kompletní EBNF najdete v článku referenční informace k syntaxi výrazu OData pro Azure kognitivní hledání .
Cesta pole 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, 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 komplexních kolekcí Tato proměnná představuje objekt, což je důvod, proč můžete použít cesty polí pro odkazování na dílčí pole proměnné. To je obdobou zápisu teček v mnoha programovacích jazycích.
Příklady cest polí jsou uvedené v následující tabulce:
| Cesta k poli | Description |
|---|---|
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í kolekce pole v indexu; Rooms je typu Collection(Edm.ComplexType) v tomto příkladu. |
Stores/Address/Country |
Odkazuje na Country dílčí pole Address v dílčím poli 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 dílčí pole room proměnné rozsahu, například ve výrazu filtru. Rooms/any(room: room/Type eq 'deluxe') |
store/Address/Country |
Odkazuje na Country dílčí pole Address dílčího pole store proměnné rozsahu, například ve výrazu filtru. Stores/any(store: store/Address/Country eq 'Canada') |
Význam cesty k poli se liší v závislosti na kontextu. Ve filtrech odkazuje cesta pole na hodnotu jedné instance pole v aktuálním dokumentu. V jiných kontextech, jako je například $OrderBy, $Select nebo v poli hledání v úplné syntaxi Lucene, odkazuje cesta pole na pole samotné. Tento rozdíl má některé důsledky pro použití cest polí ve filtrech.
Vezměte v úvahu cestu k poli Address/City . Ve filtru to odkazuje na jedno město pro aktuální dokument, jako je například "San Francisco". Naopak Rooms/Type odkazuje na Type dílčí pole pro mnoho místností (například "Standard" pro první místnost, "Deluxe" pro druhou místnost atd.). Vzhledem Rooms/Type k tomu, že neodkazuje na jednu instanci dílčího pole Type , nelze ji použít přímo ve filtru. Místo toho byste měli použít výraz lambda s proměnnou rozsahu, jako je například:
Rooms/any(room: room/Type eq 'deluxe')
V tomto příkladu se proměnná rozsahu room zobrazuje v cestě k room/Type poli. Tímto způsobem room/Type odkazuje na typ aktuální místnosti v aktuálním dokumentu. Toto je jediná instance Type dílčího pole, takže ji můžete použít přímo ve filtru.
Použití cest polí
Cesty polí se používají v mnoha parametrech rozhraní REST API služby Azure kognitivní hledání. V následující tabulce jsou uvedena všechna místa, kde je lze použít, a veškerá omezení jejich používání:
| rozhraní API | Název parametru | Omezení |
|---|---|---|
| Vytvořit nebo aktualizovat index | suggesters/sourceFields |
Žádné |
| Vytvořit nebo aktualizovat index | scoringProfiles/text/weights |
Lze odkazovat pouze na pole s možností prohledávání . |
| Vytvořit nebo aktualizovat index | scoringProfiles/functions/fieldName |
Lze odkazovat pouze na pole, která lze filtrovat . |
| Hledání | search Kdy queryType je full |
Lze odkazovat pouze na pole s možností prohledávání . |
| Hledání | facet |
Lze odkazovat pouze na pole obličeje . |
| Hledání | highlight |
Lze odkazovat pouze na pole s možností prohledávání . |
| Hledání | searchFields |
Lze odkazovat pouze na pole s možností prohledávání . |
| Navrhnout a automaticky dokončovat | searchFields |
Může odkazovat jenom na pole, která jsou součástí modulu pro návrhy . |
| Hledání, Návrha Automatické dokončování | $filter |
Lze odkazovat pouze na pole, která lze filtrovat . |
| Hledat a navrhnout | $orderby |
Lze odkazovat pouze na pole, která lze Seřadit . |
| Hledání, Návrha vyhledávání | $select |
Může odkazovat jenom na pole, která lze načíst . |
Konstanty
Konstanty v OData jsou literálové hodnoty daného typu model EDM (Entity Data Model) (EDM). Seznam podporovaných typů v Azure Kognitivní hledání najdete v tématu podporované datové typy . Konstanty typů kolekcí nejsou podporovány.
V následující tabulce jsou uvedeny příklady konstant pro každý datový typ podporovaný službou Azure Kognitivní hledání:
| Datový typ | Příklady konstant |
|---|---|
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' |
Uvozovací znaky speciálních znaků v řetězcových konstantách
Řetězcové konstanty v OData jsou oddělené jednoduchými uvozovkami. Pokud potřebujete sestavit dotaz s řetězcovou konstantou, která by mohla obsahovat jednoduché uvozovky, můžete vložit vložené uvozovky pomocí zdvojnásobení.
Například fráze s neformátovaným apostrofem, jako je Alice auto, by byla vyjádřena v OData jako řetězcová konstanta 'Alice''s car' .
Důležité
Při sestavování filtrů programově je důležité pamatovat na řídicí konstanty řetězce, které pocházejí ze vstupu uživatele. Účelem 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í EBNF (rozšířený Backus-Naur formulář) definuje gramatiku pro většinu konstant zobrazených ve výše uvedené tabulce. Gramatika pro geografické typy se dá najít v geograficky funkčních funkcích OData v Azure kognitivní hledání.
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é diagram interaktivní syntaxe:
Poznámka
Kompletní ebnf najdete v referenčních Azure Cognitive Search syntaxe výrazů OData pro Azure Cognitive Search.
Vytváření výrazů z cest polí a konstant
Cesty k polím a konstanty jsou nejzákladnější součástí výrazu OData, ale samy o sobě jsou to úplné výrazy. Parametr $select v Azure Cognitive Search ve skutečnosti není nic jiného než čárkami oddělený seznam cest polí a $orderby není mnohem komplikovanější než $select. Pokud máte v indexu pole typu , můžete dokonce napsat filtr, který není nic jiného než Edm.Boolean cesta k poli. Konstanty a true false jsou také platné filtry.
Ve většině času ale budete potřebovat složitější 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í EBNF (Extended Backus-Naur Form) definuje gramatiku pro parametry $filter, $orderby a $select. Ty jsou sestavené z jednodušších výrazů, které odkazují na cesty k polím 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é diagram interaktivní syntaxe:
Poznámka
Kompletní ebnf najdete v referenčních Azure Cognitive Search syntaxe výrazů OData pro Azure Cognitive Search.
Parametry $orderby i $select jsou čárkami oddělené seznamy jednodušších výrazů. Parametr $filter je logický výraz, který se skládá z jednodušších dílčích výrazů. Tyto dílčí výrazy se kombinují pomocí logických operátorů, jako jsou and or not , a , relační operátory jako eq , lt gt ,atd. a operátory kolekce, jako jsou any a all .
Parametry $filter, $orderby a $select jsou podrobněji popsány v následujících článcích:
- Syntaxe $filter OData v Azure Cognitive Search
- Syntaxe $orderby OData v Azure Cognitive Search
- Syntaxe $select OData v Azure Cognitive Search