Verilerde , ve için OData $filter $orderby $select diline genel Azure Bilişsel Arama

Azure Bilişsel Arama, $filter ,$orderby ve $select ifadeleri için OData ifade söz dizimlerinin bir alt kümesini destekler. Filtre ifadeleri sorgu ayrıştırma sırasında değerlendirilir, arama belirli alanlara kısıtlanmış veya dizin taramaları sırasında kullanılan eşleşme ölçütleri eklenmiş olur. Sıralama göre ifadeleri, döndürülen belgeleri sıralamak için bir sonuç kümesi üzerinde işlem sonrası adım olarak uygulanır. Seçim ifadeleri, sonuç kümesine hangi belge alanlarının dahil olduğunu belirler. Bu ifadelerin söz dizimi, arama parametresinde kullanılan basit veya tam sorgu söz dizimlerinden farklıdır, ancak başvuru alanlarına yönelik söz dizimlerinde bazı çakışmalar vardır.

Bu makalede filtrelerde, sıralamada ve seçim ifadelerinde kullanılan OData ifade diline genel bir bakış verilmektedir. Dil, en temel öğelerden başlayarak ve bunları temel alan "alttan" olarak sunulmaktadır. Her parametre için üst düzey söz dizimi ayrı bir makalede açıklanmıştır:

OData ifadeleri basitten son derece karmaşıka kadar geniş bir aralıktadır, ancak hepsi ortak öğeleri paylaşır. OData ifadesinin en temel parçaları Azure Bilişsel Arama:

  • Dizininizin belirli alanlarına başvuran alan yolları.
  • Sabitler: Belirli bir veri türünün değişmez değerleridir.

Not

Azure Bilişsel Arama OData standardını birkaç şekilde farklıdır. Azure Bilişsel Arama'da bir alan olarak Azure Bilişsel Arama OData'daki bir özellik olarak, benzer şekilde alan yolu ve özellik yolu olarak da çağrılır. OData'da Azure Bilişsel Arama içeren bir dizin, varlık içeren bir varlık kümesi olarak daha genel olarak adlandırılır. Bu Azure Bilişsel Arama tüm çalışma terminolojisi kullanılır.

Alan yolları

Aşağıdaki EBNF (Genişletilmiş Backus-Naur Formu),alan yollarının dil bilgisini tanımlar.

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

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

Etkileşimli söz dizimi diyagramı da kullanılabilir:

Not

Tam EBNF için OData Azure Bilişsel Arama söz dizimi başvurusuna bakın.

Alan yolu, eğik çizgiyle ayrılmış bir veya daha fazla tanımlayıcıdan oluşur. Her tanımlayıcı bir ASCII harfi veya alt çizgi ile başlaması gereken ve yalnızca ASCII harf, rakam veya alt çizgi içeren bir karakter dizisidir. Harfler büyük veya küçük harf olabilir.

Tanımlayıcı, bir alanın adına veya bir filtrede koleksiyon ifadesi ( veya ) bağlamındaki bir any aralık all değişkenine başvurur. Aralık değişkeni, koleksiyonun geçerli öğesini temsil eden bir döngü değişkenine benzer. Karmaşık koleksiyonlar için bu değişken bir nesneyi temsil eder. Bu nedenle, değişkenin alt alanlarına başvurmak için alan yollarını kullanabilirsiniz. Bu, birçok programlama dilindeki nokta notasyonuna benzer.

Alan yollarının örnekleri aşağıdaki tabloda gösterilmiştir:

Alan yolu Description
HotelName Dizinin üst düzey alanını ifade eder
Address/City Dizinde City karmaşık bir alanın alt alanına başvurur; Address bu örnekte Edm.ComplexType türündedir
Rooms/Type Dizinde Type karmaşık bir koleksiyon alanı alt alanına başvurur; Rooms bu örnekte Collection(Edm.ComplexType) türündedir
Stores/Address/Country Dizinde karmaşık bir koleksiyon alanı alt alanın alt alanını ifade eder; türündedir ve bu Country Address örnekte Stores Collection(Edm.ComplexType) Address Edm.ComplexType türündedir
room/Type Filtre Type ifadesinde olduğu gibi room aralık değişkeninin alt alanına başvurur Rooms/any(room: room/Type eq 'deluxe')
store/Address/Country Aralık Country değişkeninin alt Address alanı olan filtre store ifadesinde olduğu gibi alt alanını ifade eder Stores/any(store: store/Address/Country eq 'Canada')

Bir alan yolunun anlamı bağlama göre farklılık gösterir. Filtrelerde, bir alan yolu geçerli belgede bir alanın tek bir örneğinin değerine başvurur. tam Lucenesöz dizimsinde $orderby, $select veya alanlı arama gibi diğer bağlamlarda, bir alan yolu alanın kendisine başvurur. Bu farkın, filtrelerde alan yollarını kullanmanın bazı sonuçları vardır.

alan yolunu göz önünde Address/City bulundurarak. Filtrede bu, geçerli belge için "San Francisco" gibi tek bir şehri ifade eder. Buna karşılık, birçok oda için alt alanı ifade eder (birinci oda için "standart", ikinci oda için Rooms/Type Type "lüks" vb.). Rooms/Typealt alanın tek bir örneğine başvurmayarak doğrudan Type filtrede kullanılamaz. Bunun yerine, oda türüne göre filtrelemek için aşağıdaki gibi bir aralık değişkenine sahip bir lambda ifadesi kullanabilirsiniz:

Rooms/any(room: room/Type eq 'deluxe')

Bu örnekte, alan yolunda room range değişkeni room/Type görünür. Bu room/Type şekilde, geçerli belgede geçerli oda türünü ifade eder. Bu, alt alanın Type tek bir örneğidir, bu nedenle doğrudan filtrede kullanılabilir.

Alan yollarını kullanma

Alan yolları, rest API'lerinin birçok Azure Bilişsel Arama kullanılır. Aşağıdaki tabloda, kullanılamaları gereken tüm yerlerin yanı sıra kullanımlarıyla ilgili kısıtlamalar liste almaktadır:

API Parametre adı Kısıtlamalar
Dizini Oluşturma veya Güncelleştirme suggesters/sourceFields Hiçbiri
Dizini Oluşturma veya Güncelleştirme scoringProfiles/text/weights Yalnızca aranabilir alanlara başvurulabilir
Dizini Oluşturma veya Güncelleştirme scoringProfiles/functions/fieldName Yalnızca filtrelenebilir alanlara başvurabilir
Ara searcholduğunda queryType``full Yalnızca aranabilir alanlara başvurulabilir
Ara facet Yalnızca facetable alanlarına başvurabilirsiniz
Ara highlight Yalnızca aranabilir alanlara başvurulabilir
Ara searchFields Yalnızca aranabilir alanlara başvurulabilir
Önerin ve Otomatik Tamamlama searchFields Yalnızca bir önerinin parçası olan alanlara başvurabilirsiniz
Arama, Önerive Otomatik Tamamlama $filter Yalnızca filtrelenebilir alanlara başvurabilir
Arama ve Öneri $orderby Yalnızca sıralanabilir alanlara başvurulabilir
Arama, Önerive Arama $select Yalnızca alınabilir alanlara başvurur

Sabitler

OData'daki sabitler, verili bir Varlık Veri Modeli (EDM) türünde sabit değerlerdir. Desteklenen veri türleri listesi için bkz. Desteklenen veri türleri Azure Bilişsel Arama. Koleksiyon türlerinin sabitleri desteklenmiyor.

Aşağıdaki tabloda, veri türleri tarafından desteklenen her bir veri türü için sabitlerin örnekleri Azure Bilişsel Arama:

Veri türü Örnek sabitler
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'

Dize sabitleri içinde özel karakterleri kaçış

OData'daki dize sabitleri tek tırnak içine alınarak ayrılmıştır. Tek tırnak içeren bir dize sabiti içeren bir sorgu oluşturmalı, ekli tırnakları iki katına vararak çıkış olarak kullanabilirsiniz.

Örneğin, "Alice'in otomobili" gibi biçimlendirilmemiş kesme işaretine sahip bir tümcecik, OData'da dize sabiti olarak temsil edilen bir 'Alice''s car' ifadedir.

Önemli

Filtreleri program aracılığıyla oluşturmak için kullanıcı girişlerinden gelen dize sabitlerinden kaçış dizesi sabitlerini unutmamanız önemlidir. Bu, özellikle de güvenlik kırpması uygulamak içinfiltreler kullanılırken ekleme saldırıları olasılığını azaltmaktır.

Sabitler söz dizimi

Aşağıdaki EBNF (Genişletilmiş Backus-Naur Formu),yukarıdaki tabloda gösterilen sabitlerin çoğunun dil bilgisini tanımlar. Coğrafi uzamsal türlerin dil bilgisi, OData coğrafi uzamsal işlevlerinde Azure Bilişsel Arama.

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'

Etkileşimli bir sözdizimi diyagramı da kullanılabilir:

Alan yollarından ve sabitlerden ifadeler oluşturma

Alan yolları ve sabitler, bir OData ifadesinin en temel kısmıdır, ancak bunlar zaten tam ifadelerdir. Aslında, Azure Bilişsel Arama $Select parametresi Nothing, ancak alan yollarının virgülle ayrılmış bir listesidir ve $OrderBy $Select kıyasla daha karmaşık değildir. Dizininizdeki türünde bir alanınız varsa Edm.Boolean , bu alanın yolu ancak hiçbir şey olmayan bir filtre de yazabilirsiniz. Sabitler true ve false aynı şekilde geçerli filtrelerdir.

Ancak, çoğu zaman birden fazla alana ve sabitine başvuran daha karmaşık deyimler gerekecektir. Bu ifadeler parametreye bağlı olarak farklı şekillerde oluşturulmuştur.

Aşağıdaki EBNF (genişletilmiş Backus-Naur formu) $Filter, $OrderBy ve $Select parametrelerine yönelik dilbilgisini tanımlar. Bunlar alan yollarına ve sabitlere başvuran daha basit ifadelerden oluşturulmuştur:

filter_expression ::= boolean_expression

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

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

Etkileşimli bir sözdizimi diyagramı da kullanılabilir:

$OrderBy ve $Select parametreleri, daha basit ifadelerin virgülle ayrılmış listeleridir. $Filter parametresi, daha basit alt ifadelerden oluşan bir Boolean ifadedir. Bu alt ifadeler and ,, or not ve gibi mantıksal işleçler kullanılarak birleştirilir,, ve gibi karşılaştırma işleçleri ve any ve all gibi koleksiyon işleçleri. eq lt gt

$Filter, $OrderBy ve $Select parametreleri aşağıdaki makalelerde daha ayrıntılı bir şekilde araştırılabilir:

Ayrıca bkz.