مرجع بناء جملة تعبير OData للبحث المعرفي Azure

يستخدم Azure Cognitive Search تعبيرات OData كمعلمات في جميع أنحاء واجهة برمجة التطبيقات. الأكثر شيوعا ، يتم استخدام تعبيرات OData للمعلمات $orderby والمعلمات $filter . يمكن أن تكون هذه التعبيرات معقدة ، وتحتوي على العديد من الجمل والوظائف والمشغلين. ومع ذلك، حتى تعبيرات OData البسيطة مثل مسارات الخصائص تستخدم في أجزاء كثيرة من واجهة برمجة تطبيقات Azure Cognitive Search REST. على سبيل المثال، يتم استخدام تعبيرات المسار للإشارة إلى الحقول الفرعية للحقول المعقدة في كل مكان في واجهة برمجة التطبيقات، مثل عند إدراج الحقول الفرعية في مقترح، أو دالة تسجيل، $select أو معلمة، أو حتى البحث الميداني في استعلامات Lucene.

توضح هذه المقالة كافة هذه الأشكال من تعبيرات OData باستخدام قواعد اللغة الرسمية. هناك أيضا رسم تخطيطي تفاعلي للمساعدة في استكشاف القواعد بصريا.

قواعد اللغة الرسمية

يمكننا وصف المجموعة الفرعية للغة OData التي يدعمها Azure Cognitive Search باستخدام قواعد EBNF (نموذج Backus-Naur الموسعة). يتم سرد القواعد "من أعلى إلى أسفل" ، بدءا من التعبيرات الأكثر تعقيدا ، وتقسيمها إلى تعبيرات أكثر بدائية. في الجزء العلوي توجد القواعد النحوية التي تتوافق مع معلمات محددة من واجهة برمجة تطبيقات Azure Cognitive Search REST:

  • $filter، التي تحددها filter_expression القاعدة.
  • $orderby، التي تحددها order_by_expression القاعدة.
  • $select، التي تحددها select_expression القاعدة.
  • مسارات الحقل، المعرفة بواسطة field_path القاعدة. يتم استخدام مسارات الحقل في جميع أنحاء واجهة برمجة التطبيقات. يمكن أن تشير إما إلى حقول المستوى الأعلى للفهرس ، أو الحقول الفرعية التي لها واحد أو أكثر من أسلاف الحقول المعقدة .

بعد EBNF هو مخطط بناء جملة قابل للتصفح يسمح لك باستكشاف القواعد النحوية والعلاقات بين قواعدها بشكل تفاعلي.

/* 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 ::= 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'"

رسم تخطيطي لبناء الجملة

لاستكشاف قواعد لغة OData التي يدعمها Azure Cognitive Search بشكل مرئي، جرب الرسم التخطيطي التفاعلي لبناء الجملة:

راجع أيضًا