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:

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:

Viz také