Share via


OData-kifejezés szintaxisának referenciája az Azure AI Searchhöz

Az Azure AI Search az API-ban OData-kifejezéseket használ paraméterekként. A leggyakrabban OData-kifejezéseket használnak a paraméterekhez és $filter a $orderby paraméterekhez. Ezek a kifejezések összetettek lehetnek, amelyek több záradékot, függvényt és operátort tartalmaznak. Az Azure AI Search REST API számos részén azonban még az egyszerű OData-kifejezések, például a tulajdonságútvonalak is használhatók. Az elérésiút-kifejezések például összetett mezők almezőire hivatkoznak az API-ban mindenhol, például ha almezőket sorolnak fel egy javaslattevőben, egy pontozófüggvényben, a $select paraméterben vagy akár a lucene-lekérdezésekben végzett mezős keresésben.

Ez a cikk az OData-kifejezések összes formáját ismerteti formális nyelvtan használatával. Emellett egy interaktív diagram is segíti a nyelvtan vizuális felfedezését.

Formális nyelvhelyesség

Az Azure AI Search által támogatott OData nyelv részhalmazát egy EBNF (Extended Backus-Naur Form) nyelvhelyesség használatával ismertethetjük. A szabályok a "felülről lefelé" vannak felsorolva, kezdve a legösszetettebb kifejezésekkel, és primitívebb kifejezésekre bontják őket. Felül az Azure AI Search REST API adott paramétereinek megfelelő nyelvtani szabályok találhatók:

  • $filter, amelyet a filter_expression szabály határoz meg.
  • $orderby, amelyet a order_by_expression szabály határoz meg.
  • $select, amelyet a select_expression szabály határoz meg.
  • A szabály által definiált field_path mezőútvonalak. A mezők elérési útjai az API-t teljes egészében használják. Hivatkozhatnak egy index legfelső szintű mezőire, vagy egy vagy több összetett mezőelődéssel rendelkező almezőkre.

Miután az EBNF egy böngészhető szintaxis diagram , amely lehetővé teszi, hogy interaktívan vizsgálja meg a nyelvhelyességet és a szabályok közötti kapcsolatokat.

/* Top-level rules */

filter_expression ::= boolean_expression

order_by_expression ::= order_by_clause(',' order_by_clause)*

select_expression ::= '*' | field_path(',' field_path)*

field_path ::= identifier('/'identifier)*


/* Shared base rules */

identifier ::= [a-zA-Z_][a-zA-Z_0-9]*


/* Rules for $orderby */

order_by_clause ::= (field_path | sortable_function) ('asc' | 'desc')?

sortable_function ::= geo_distance_call | 'search.score()'


/* Rules for $filter */

boolean_expression ::=
    collection_filter_expression
    | logical_expression
    | comparison_expression
    | boolean_literal
    | boolean_function_call
    | '(' boolean_expression ')'
    | variable

/* This can be a range variable in the case of a lambda, or a field path. */
variable ::= identifier | field_path

collection_filter_expression ::=
    field_path'/all(' lambda_expression ')'
    | field_path'/any(' lambda_expression ')'
    | field_path'/any()'

lambda_expression ::= identifier ':' boolean_expression

logical_expression ::=
    boolean_expression ('and' | 'or') boolean_expression
    | 'not' boolean_expression

comparison_expression ::= 
    variable_or_function comparison_operator constant | 
    constant comparison_operator variable_or_function

variable_or_function ::= variable | function_call

comparison_operator ::= 'gt' | 'lt' | 'ge' | 'le' | 'eq' | 'ne'


/* Rules for constants and literals */

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 ::= sign? 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'


/* Rules for functions */

function_call ::=
    geo_distance_call |
    boolean_function_call

geo_distance_call ::=
    'geo.distance(' variable ',' geo_point ')'
    | 'geo.distance(' geo_point ',' variable ')'

geo_point ::= "geography'POINT(" lon_lat ")'"

lon_lat ::= float_literal ' ' float_literal

boolean_function_call ::=
    geo_intersects_call |
    search_in_call |
    search_is_match_call

geo_intersects_call ::=
    'geo.intersects(' variable ',' geo_polygon ')'

/* You need at least four points to form a polygon, where the first and
last points are the same. */
geo_polygon ::=
    "geography'POLYGON((" lon_lat ',' lon_lat ',' lon_lat ',' lon_lat_list "))'"

lon_lat_list ::= lon_lat(',' lon_lat)*

search_in_call ::=
    'search.in(' variable ',' string_literal(',' string_literal)? ')'

/* Note that it is illegal to call search.ismatch or search.ismatchscoring
from inside a lambda expression. */
search_is_match_call ::=
    'search.ismatch'('scoring')?'(' search_is_match_parameters ')'

search_is_match_parameters ::=
    string_literal(',' string_literal(',' query_type ',' search_mode)?)?

query_type ::= "'full'" | "'simple'"

search_mode ::= "'any'" | "'all'"

Szintaxisdiagram

Az Azure AI Search által támogatott OData nyelvhelyesség vizuális megismeréséhez próbálja ki az interaktív szintaxisdiagramot:

Kapcsolódó információk