OData-språköversikt $filter för , och i $orderby $select Azure Cognitive Search
Azure Cognitive Search stöder en delmängd av OData-uttryckssyntaxen för $filter, $orderby och $select uttryck. Filteruttryck utvärderas vid frågeparsning, begränsar sökningen till specifika fält eller lägger till matchningsvillkor som används vid indexgenomsökningar. Order-by-uttryck tillämpas som ett efterbearbetningssteg över en resultatuppsättning för att sortera de dokument som returneras. Välj uttryck avgör vilka dokumentfält som ingår i resultatuppsättningen. Syntaxen för dessa uttryck skiljer sig från den enkla eller fullständiga frågesyntax som används i sökparametern, även om det finns viss överlappning i syntaxen för referensfält.
Den här artikeln innehåller en översikt över det OData-uttrycksspråk som används i filter, ordning efter och välj uttryck. Språket visas "nedifrån och upp", från de mest grundläggande elementen och bygger på dem. Syntaxen på den översta nivån för varje parameter beskrivs i en separat artikel:
OData-uttryck sträcker sig från enkla till mycket komplexa, men alla delar gemensamma element. De mest grundläggande delarna i ett OData-uttryck i Azure Cognitive Search är:
- Fältsökvägar, som refererar till specifika fält i ditt index.
- Konstanter, som är literalvärden för en viss datatyp.
Anteckning
Terminologin i Azure Cognitive Search skiljer sig från OData-standarden på några olika sätt. Det vi kallar ett fält i Azure Cognitive Search kallas för en egenskap i OData och på samma sätt för fältsökvägen jämfört med egenskapssökvägen. Ett index som innehåller dokument i Azure Cognitive Search kallas mer allmänt i OData för en entitetsuppsättning som innehåller entiteter . Den Azure Cognitive Search terminologin används i den här referensen.
Fältsökvägar
Följande EBNF (Extended Backus-Naur Form) definierar grammatiken för fältsökvägar.
field_path ::= identifier('/'identifier)*
identifier ::= [a-zA-Z_][a-zA-Z_0-9]*
Ett interaktivt syntaxdiagram är också tillgängligt:
Anteckning
Se Syntaxreferens för OData-uttryck för Azure Cognitive Search en fullständig EBNF.
En fältsökväg består av en eller flera identifierare avgränsade med snedstreck. Varje identifierare är en sekvens med tecken som måste börja med en ASCII-bokstav eller understreck och som endast innehåller ASCII-bokstäver, siffror eller understreck. Bokstäverna kan vara versaler eller gemener.
En identifierare kan referera antingen till namnet på ett fält eller till en intervallvariabel i kontexten för ett samlingsuttryck ( any eller ) i ett all filter. En intervallvariabel är som en loopvariabel som representerar det aktuella elementet i samlingen. För komplexa samlingar representerar variabeln ett objekt, vilket är anledningen till att du kan använda fältsökvägar för att referera till underordnade fält i variabeln. Detta motsvarar punkt notation i många programmeringsspråk.
Exempel på fältsökvägar visas i följande tabell:
| Fältsökväg | Description |
|---|---|
HotelName |
Refererar till ett fält på den översta nivån i indexet |
Address/City |
Refererar till City underfältet för ett komplext fält i indexet. Address Är av typen i det här Edm.ComplexType exemplet |
Rooms/Type |
Refererar till Type underfältet för ett komplext samlingsfält i indexet. Rooms Är av typen i det här Collection(Edm.ComplexType) exemplet |
Stores/Address/Country |
Refererar till underfältet i delfältet för ett komplext samlingsfält i Country Address Stores Collection(Edm.ComplexType) Address Edm.ComplexType indexet. Det är av typen och är av typen i det här exemplet |
room/Type |
Refererar till Type underfältet för room intervallvariabeln, till exempel i filteruttrycket Rooms/any(room: room/Type eq 'deluxe') |
store/Address/Country |
Refererar till Country underfältet i Address underfältet i intervallvariabeln, store till exempel i filteruttrycket Stores/any(store: store/Address/Country eq 'Canada') |
Innebörden av en fältsökväg varierar beroende på kontexten. I filter refererar en fältsökväg till värdet för en enskild instans av ett fält i det aktuella dokumentet. I andra kontexter, till exempel $orderby, $select, eller i fältsök i den fullständiga Lucene-syntaxenrefererar en fältsökväg till själva fältet. Den här skillnaden har vissa konsekvenser för hur du använder fältsökvägar i filter.
Överväg fältsökvägen Address/City . I ett filter refererar detta till en enda stad för det aktuella dokumentet, till exempel "San Francisco". Däremot refererar till delfältet för många rum (t.ex. "standard" för det första Rooms/Type rummet, "room" för det andra rummet Type och så vidare). Eftersom Rooms/Type inte refererar till en enda instans av underfältet kan den inte användas direkt i Type ett filter. Om du istället vill filtrera på rumstyp använder du ett lambda-uttryck med en intervallvariabel, så här:
Rooms/any(room: room/Type eq 'deluxe')
I det här exemplet visas variabeln room intervall i room/Type fältsökvägen. På så sätt room/Type refererar till typen av det aktuella rummet i det aktuella dokumentet. Det här är en enda instans Type av underfältet, så det kan användas direkt i filtret.
Använda fältsökvägar
Fältsökvägar används i många parametrar för de Azure Cognitive Search REST-API:erna. I följande tabell visas alla platser där de kan användas, samt eventuella begränsningar för deras användning:
| API | Parameternamn | Begränsningar |
|---|---|---|
| Skapa eller uppdatera index | suggesters/sourceFields |
Ingen |
| Skapa eller uppdatera index | scoringProfiles/text/weights |
Kan bara referera till sökbara fält |
| Skapa eller uppdatera index | scoringProfiles/functions/fieldName |
Kan bara referera till filtrerbara fält |
| Sök | search när queryType är full |
Kan bara referera till sökbara fält |
| Sök | facet |
Kan bara referera till faserbara fält |
| Sök | highlight |
Kan bara referera till sökbara fält |
| Sök | searchFields |
Kan bara referera till sökbara fält |
| Föreslå och komplettera automatiskt | searchFields |
Kan bara referera till fält som är en del av en förslagsare |
| Sök, Föreslåoch Komplettera automatiskt | $filter |
Kan bara referera till filtrerbara fält |
| Sök och föreslå | $orderby |
Kan bara referera till sorterbara fält |
| Sök, Föreslåoch Sök | $select |
Kan bara referera till hämtningsbara fält |
Konstanter
Konstanter i OData är literalvärden för en viss entitetsdatamodell (EDM). Se Datatyper som stöds för en lista över typer som stöds i Azure Cognitive Search. Konstanter av samlingstyper stöds inte.
I följande tabell visas exempel på konstanter för var och en av de datatyper som stöds av Azure Cognitive Search:
| Datatyp | Exempelkonstanter |
|---|---|
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' |
Undantag för specialtecken i strängkonstanter
Strängkonstanterna i OData avgränsas med enkla citattecken. Om du behöver skapa en fråga med en strängkonstant som kan innehålla enkla citattecken kan du undvika inbäddade citattecken genom att dubbla dem.
Till exempel skulle en fras med en oformaterad apostrofer som "Alice bil" representeras i OData som strängkonstanten 'Alice''s car' .
Viktigt
När du skapar filter programmatiskt är det viktigt att komma ihåg att komma ihåg att escape-strängkonstanterna som kommer från användarindata. Detta är för att minska risken för injectionsattacker,särskilt när du använder filter för att implementera säkerhetstrimning.
Syntax för konstanter
Följande EBNF (Extended Backus-Naur Form) definierar grammatiken för de flesta av konstanterna som visas i tabellen ovan. Grammatik för geo-spatiala typer finns i OData geo-spatiala funktioner i Azure Cognitive 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'
Ett interaktivt syntaxdiagram är också tillgängligt:
Anteckning
Se Syntaxreferens för OData-uttryck för Azure Cognitive Search för fullständig EBNF.
Skapa uttryck från fältsökvägar och konstanter
Fältsökvägar och konstanter är den mest grundläggande delen av ett OData-uttryck, men de är redan fullständiga uttryck själva. I själva verket är $select-parametern i Azure Cognitive Search bara en kommaavgränsad lista med fältsökvägar, och $orderby är inte mycket mer komplicerat än $select. Om du råkar ha ett fält av typen i indexet kan du till och med skriva ett filter som bara är Edm.Boolean sökvägen till det fältet. Konstanterna och true är false också giltiga filter.
I de flesta fall behöver du dock mer komplexa uttryck som refererar till mer än ett fält och en konstant. De här uttrycken är inbyggda på olika sätt beroende på parametern.
Följande EBNF (Extended Backus-Naur Form) definierar grammatiken för parametrarna $filter, $orderby och $select. Dessa bygger på enklare uttryck som refererar till fältsökvägar och konstanter:
filter_expression ::= boolean_expression
order_by_expression ::= order_by_clause(',' order_by_clause)*
select_expression ::= '*' | field_path(',' field_path)*
Ett interaktivt syntaxdiagram är också tillgängligt:
Anteckning
Se Syntaxreferens för OData-uttryck för Azure Cognitive Search för fullständig EBNF.
Parametrarna $orderby och $select är båda kommaavgränsade listor med enklare uttryck. Parametern $filter är ett booleskt uttryck som består av enklare underuttryck. Dessa underuttryck kombineras med hjälp av logiska operatorer som and or not , och , jämförelseoperatorer som eq , , och lt så gt vidare,och samlingsoperatorer som any och all .
Parametrarna $filter , $orderby och $select utforskas i detalj i följande artiklar:
- OData$filter syntax i Azure Cognitive Search
- OData$orderby syntax i Azure Cognitive Search
- OData $select syntax i Azure Cognitive Search