Azure AI Search'te , $orderby
ve $select
için $filter
OData diline genel bakış
Bu makalede, Azure AI Search'te $filter
sayısal ve $select
dize (seçici olmayan) alanları üzerinden anahtar sözcük araması için , $order-by
ve ifadelerinde kullanılan OData ifade diline genel bir bakış sağlanır.
Dil, en temel öğelerden başlayarak "aşağıdan yukarıya" sunulur. Sorgu isteğinde oluşturabileceğiniz OData ifadeleri basitten yüksek karmaşıklığa kadar değişir, ancak bunların tümü ortak öğeleri paylaşır. Paylaşılan öğeler şunlardır:
- Dizininizin belirli alanlarına başvuran alan yolları.
- Sabitler, belirli bir veri türünün değişmez değerleridir.
Bu yaygın kavramları anladıktan sonra, her ifade için en üst düzey söz dizimiyle devam edebilirsiniz:
- $filter ifadeleri sorgu ayrıştırma, aramayı belirli alanlarla sınırlama veya dizin taramaları sırasında kullanılan eşleşme ölçütleri ekleme sırasında değerlendirilir.
- $orderby ifadeler, döndürülen belgeleri sıralamak için bir sonuç kümesi üzerinde işlem sonrası adım olarak uygulanır.
- $select 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 diziminden farklıdır, ancak başvuru alanları için söz diziminde bazı çakışmalar vardır.
Python veya C# gibi diğer dillerdeki örnekler için azure-search-vector-samples deposundaki örneklere bakın.
Not
Azure AI Search'teki terminoloji, OData standardından birkaç şekilde farklıdır. Azure AI Search'te alan olarak adlandırdığımız alan, OData'da özellik olarak adlandırılır ve benzer şekilde alan yolu ve özellik yolu için kullanılır. Azure AI Search'te belge içeren bir dizin, OData'da varlık içeren bir varlık kümesi olarak daha genel olarak adlandırılır. Bu başvuru boyunca Azure AI Arama 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
EbNF'nin tamamı için bkz . Azure AI Search için OData ifade söz dizimi başvurusu.
Alan yolu, eğik çizgilerle ayrılmış bir veya daha fazla tanımlayıcıdan oluşur. Her tanımlayıcı, ASCII harfi veya alt çizgiyle başlaması gereken ve yalnızca ASCII harfleri, basamakları veya alt çizgilerini içeren bir karakter dizisidir. Harfler büyük veya küçük harf olabilir.
Tanımlayıcı, bir alanın adına veya filtredeki bir koleksiyon ifadesi (any
veya all
) bağlamındaki bir aralık değişkenine başvurabilir. Aralık değişkeni, koleksiyonun geçerli öğesini temsil eden bir döngü değişkeni gibidir. Karmaşık koleksiyonlar için bu değişken bir nesneyi temsil eder ve bu nedenle değişkenin alt alanlarına başvurmak için alan yollarını kullanabilirsiniz. Bu, birçok programlama dilinde nokta gösterimine benzer.
Alan yolu örnekleri aşağıdaki tabloda gösterilmiştir:
Alan yolu | Açıklama |
---|---|
HotelName |
Dizinin en üst düzey alanına başvurur |
Address/City |
Dizindeki City karmaşık bir alanın alt alanını ifade eder; Address bu örnekteki türdür Edm.ComplexType |
Rooms/Type |
Dizindeki Type karmaşık bir koleksiyon alanının alt alanını ifade eder; Rooms bu örnekteki türdür Collection(Edm.ComplexType) |
Stores/Address/Country |
Dizindeki Country karmaşık bir koleksiyon alanının alt alanının alt Address alanını ifade eder; Stores bu örnekte türünde Collection(Edm.ComplexType) ve Address türündedir Edm.ComplexType |
room/Type |
Aralık değişkeninin Type room alt alanına başvurur, örneğin filtre ifadesinde Rooms/any(room: room/Type eq 'deluxe') |
store/Address/Country |
Aralık değişkeninin Country Address alt alanının alt alanını store ifade eder, örneğin filtre ifadesinde Stores/any(store: store/Address/Country eq 'Canada') |
Alan yolunun anlamı bağlama bağlı olarak değişir. Filtrelerde, alan yolu geçerli belgedeki bir alanın tek bir örneğinin değerine başvurur. $orderby, $select gibi diğer bağlamlarda veya tam Lucene söz dizimindeki alanlı aramada, alan yolu alanın kendisine başvurur. Bu farkın, filtrelerde alan yollarını nasıl kullandığınıza ilişkin bazı sonuçları vardır.
alan yolunu Address/City
göz önünde bulundurun. Filtrede bu, geçerli belge için "San Francisco" gibi tek bir şehir anlamına gelir. Buna karşılık, Rooms/Type
birçok odanın alt alanını ifade eder Type
(birinci oda için "standart", ikinci oda için "deluxe" vb.). Rooms/Type
alt alanının Type
tek bir örneğine başvurmadığından, doğrudan bir 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 kullanırsınız:
Rooms/any(room: room/Type eq 'deluxe')
Bu örnekte, aralık değişkeni room
alan yolunda görüntülenir room/Type
. Bu şekilde, room/Type
geçerli belgedeki geçerli odanın türüne başvurur. Bu alt alanı tek bir örneğidir Type
, bu nedenle doğrudan filtrede kullanılabilir.
Alan yollarını kullanma
Alan yolları, Azure AI Search REST API'lerinin birçok parametresinde kullanılır. Aşağıdaki tabloda, kullanabilecekleri tüm yerler ve kullanımlarıyla ilgili kısıtlamalar listelenecektir:
API | Parametre adı | Kısıtlamalar |
---|---|---|
Dizin Oluşturma veya Güncelleştirme | suggesters/sourceFields |
Hiçbiri |
Dizin Oluşturma veya Güncelleştirme | scoringProfiles/text/weights |
Yalnızca aranabilir alanlara başvurabilir |
Dizin Oluşturma veya Güncelleştirme | scoringProfiles/functions/fieldName |
Yalnızca filtrelenebilir alanlara başvurabilir |
Arama yap | search ne zaman queryType full |
Yalnızca aranabilir alanlara başvurabilir |
Arama yap | facet |
Yalnızca modellenebilir alanlara başvurabilir |
Arama yap | highlight |
Yalnızca aranabilir alanlara başvurabilir |
Arama yap | searchFields |
Yalnızca aranabilir alanlara başvurabilir |
Öneri ve Otomatik Tamamlama | searchFields |
Yalnızca bir öneri oluşturucunun parçası olan alanlara başvurabilir |
Arama, Öneri ve Otomatik Tamamlama | $filter |
Yalnızca filtrelenebilir alanlara başvurabilir |
Arama ve Önerme | $orderby |
Yalnızca sıralanabilir alanlara başvurabilir |
Arama, Öneri ve Arama | $select |
Yalnızca alınabilir alanlara başvurabilir |
Sabitler
OData'daki sabitler, belirli bir Varlık Veri Modeli (EDM) türünün değişmez değerleridir. Azure AI Search'te desteklenen türlerin listesi için bkz . Desteklenen veri türleri . Koleksiyon türlerinin sabitleri desteklenmez.
Aşağıdaki tabloda, OData ifadelerini destekleyen her bir seçici olmayan veri türü için sabit örnekleri gösterilmektedir:
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 sabitlerindeki özel karakterlerden kaçış
OData'daki dize sabitleri tek tırnak işaretleri ile sınırlandırılır. Tek tırnak işareti içerebilen bir dize sabiti içeren bir sorgu oluşturmanız gerekiyorsa, katıştırılmış tırnakları ikiye katlayarak kaçabilirsiniz.
Örneğin, "Alice'in arabası" gibi biçimlendirilmemiş kesme işaretine sahip bir tümcecik, OData'da dize sabiti 'Alice''s car'
olarak temsil edilir.
Önemli
Filtreleri program aracılığıyla oluştururken, kullanıcı girişinden gelen dize sabitlerinden kaçışı anımsamak önemlidir. Bu, özellikle güvenlik kırpması uygulamak için filtreleri kullanı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ğu için dil bilgisini tanımlar. Coğrafi uzamsal türler için dil bilgisi, Azure AI Search'teki OData coğrafi uzamsal işlevlerinde bulunabilir.
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 söz dizimi diyagramı da kullanılabilir:
Not
EbNF'nin tamamı için bkz . Azure AI Search için OData ifade söz dizimi başvurusu.
Alan yollarından ve sabitlerden ifade oluşturma
Alan yolları ve sabitleri, OData ifadesinin en temel parçasıdır, ancak bunlar zaten tam ifadelerdir. Aslında Azure AI Search'teki $select parametresi, alan yollarının virgülle ayrılmış bir listesinden başka bir şey değildir ve $orderby $select kadar karmaşık değildir. Dizininizde türünde Edm.Boolean
bir alan varsa, o alanın yolundan başka bir şey olmayan bir filtre bile yazabilirsiniz. sabitleri true
ve false
benzer şekilde geçerli filtrelerdir.
Ancak, birden çok alana ve sabite başvuran karmaşık ifadelerin olması daha yaygındır. Bu ifadeler, parametresine bağlı olarak farklı şekillerde oluşturulur.
Aşağıdaki EBNF (Genişletilmiş Backus-Naur Formu), $filter, $orderby ve $select parametreleri için dil bilgisini tanımlar. Bunlar, alan yollarına ve sabitlerine başvuran daha basit ifadelerden oluşturulur:
filter_expression ::= boolean_expression
order_by_expression ::= order_by_clause(',' order_by_clause)*
select_expression ::= '*' | field_path(',' field_path)*
Etkileşimli söz dizimi diyagramı da kullanılabilir:
Not
EbNF'nin tamamı için bkz . Azure AI Search için OData ifade söz dizimi başvurusu.
Sonraki adımlar
$orderby ve $select parametreleri, daha basit ifadelerin virgülle ayrılmış listeleridir. $filter parametresi, daha basit alt ifadelerden oluşan bir Boole ifadesidir. Bu alt ifadeler, , or
ve not
gibiand
mantıksal işleçler, vb. gibi lt
gt
eq
karşılaştırma işleçleri ve ve gibi any
all
koleksiyon işleçleri kullanılarak birleştirilir.
$filter, $orderby ve $select parametreleri aşağıdaki makalelerde daha ayrıntılı olarak incelenir: