Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Not
Azure Yapay Zeka Arama Azure portalı, REST API'leri ve Azure SDK’ları aracılığıyla kullanılabilir. Ayrıca kuruluş içeriğini Microsoft Foundry portalındaki aracılar için yeniden kullanılabilir, izin kullanan bilgi bankalarına dönüştüren yönetilen bilgi katmanı Foundry IQ'yu temel alır.
Bu makale, karmaşık lambda ifadeleriyle gelişmiş filtreler yazan geliştiriciler için arka plan sağlar. Bu makalede, Azure Yapay Zeka Arama'ün bu filtreleri nasıl yürüttüğüne bakarak koleksiyon filtreleri kurallarının neden mevcut olduğu açıklanmaktadır.
Azure Yapay Zeka Arama'te koleksiyon alanları için bir filtre oluşturduğunuzda, işleçlerinianyall ve lambda ifadeleriyle birlikte kullanabilirsiniz. Lambda ifadeleri, bir aralık değişkenine başvuran Boole ifadeleridir. Lambda ifadesi kullanan filtrelerde, any ve all işleçleri çoğu programlama dilinde bir for döngüsüne benzer; bu bağlamda aralık değişkeni, döngü değişkeninin rolünü üstlenir ve lambda ifadesi döngünün gövdesi olarak işlev görür. Aralık değişkeni, döngünün yinelenmesi sırasında koleksiyonun "geçerli" değerini alır.
En azından kavramsal olarak bu şekilde çalışır. Gerçekte Azure Yapay Zeka Arama, döngülerin çalışma for şekline çok farklı bir şekilde filtre uygular. İdeal olarak, bu fark sizin için görünmez, ancak bazı durumlarda görünmez. Sonuç olarak lambda ifadeleri yazarken izlemeniz gereken kurallar vardır.
Not
Örnekler de dahil olmak üzere koleksiyon filtreleri kurallarının ne olduğu hakkında bilgi için bkz . Azure Yapay Zeka Arama'te OData koleksiyonu filtrelerinde sorun giderme.
Koleksiyon filtreleri neden sınırlıdır?
Filtre özelliklerinin tüm koleksiyon türleri için tam olarak desteklenmemelerinin temel üç nedeni vardır:
- Belirli veri türleri için yalnızca belirli işleçler desteklenir. Örneğin, Boole değerlerini ve gibi
truefalsekarşılaştırma işleçleriniltgtkullanarak karşılaştırmak mantıklı değildir. - Azure Yapay Zeka Arama türündeki
Collection(Edm.ComplexType)alanlarda bağıntılı filtreleri destekler, ancak bu alanlar üzerinde alanlı tam metin araması bağıntısızdır. - Azure Yapay Zeka Arama, koleksiyonlar da dahil olmak üzere tüm veri türleri üzerinde filtre yürütmek için ters dizinler kullanır.
İlk neden, OData dili ve EDM tür sisteminin nasıl tanımlandığının bir sonucudur. Son ikisi bu makalenin geri kalanında daha ayrıntılı olarak açıklanmıştır.
Bağıntılı ve bağıntısız arama
Karmaşık nesnelerden oluşan bir koleksiyona birden çok filtre ölçütü uyguladığınızda, ölçütler koleksiyondaki her nesne için geçerli olduğundan bağıntılı olarak yapılır. Örneğin, aşağıdaki filtrede fiyatı 100'den az olan en az bir deluxe oda olan oteller döndürülüyor:
Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 100)
Filtreleme bağıntısızsa, yukarıdaki filtre bir odanın deluxe olduğu ve farklı bir odanın taban fiyatı 100'den az olan otelleri döndürebilir. Lambda ifadesinin her iki yan tümcesi aynı aralık değişkenine (yani room) uygulandığından bu mantıklı olmaz. Bu nedenle bu tür filtreler bağıntılı.
Ancak, tam metin araması için belirli bir aralık değişkenine başvurmanın hiçbir yolu yoktur. Bunun gibi tam bir Lucene sorgusu vermek için alanlı arama kullanıyorsanız:
Rooms/Type:deluxe AND Rooms/Description:"city view"
Odalardan birinin deluxe, başka bir odanın ise açıklamasında "şehir manzarası" belirtildiği otellerle karşılaşabilirsiniz. Örneğin, aşağıdaki belge ile Id1 sorguyla eşleşir:
{
"value": [
{
"Id": "1",
"Rooms": [
{ "Type": "deluxe", "Description": "Large garden view suite" },
{ "Type": "standard", "Description": "Standard city view room" }
]
},
{
"Id": "2",
"Rooms": [
{ "Type": "deluxe", "Description": "Courtyard motel room" }
]
}
]
}
Sebep, Rooms/Type belgenin tamamında Rooms/Type alanının tüm analiz edilen terimlerine ve benzer şekilde Rooms/Description alanına atıfta bulunur, aşağıdaki tablolarda gösterildiği gibi.
Tam metin araması için nasıl Rooms/Type depolanır:
Terim: Rooms/Type |
Belge Kimlikleri |
|---|---|
| lüks | 1, 2 |
| standart | 1 |
Tam metin araması için nasıl Rooms/Description depolanır:
Terim: Rooms/Description |
Belge Kimlikleri |
|---|---|
| avlu | 2 |
| şehir | 1 |
| bahçe | 1 |
| büyük boyutlu | 1 |
| motel | 2 |
| oda | 1, 2 |
| standart | 1 |
| yazılım paketi | 1 |
| görünüm | 1 |
Bu nedenle, temelde "bir odanın 'Deluxe Oda'ya eşit olduğu ve aynı odanın TypeBaseRate 100'den az olduğu belgeleri eşleştir" yazan yukarıdaki filtreden farklı olarak, arama sorgusu "deluxe" terimine sahip olan ve Rooms/Type "şehir görünümü" ifadesini içeren belgeleri Rooms/Description eşleştir ifadesini içerir. İkinci durumda alanları bağıntılı olabilecek tek tek odalar kavramı yoktur.
Ters dizinler ve koleksiyonlar
Lambda ifadelerinin karmaşık koleksiyonlar üzerinde ve Collection(Edm.Int32)gibi Collection(Edm.GeographyPoint) basit koleksiyonlara kıyasla çok daha az kısıtlamaya sahip olduğunu fark edebilirsiniz. Bu farkın nedeni, Azure Yapay Zeka Arama karmaşık koleksiyonları gerçek alt belge koleksiyonları olarak depolaması, basit koleksiyonların ise hiç koleksiyon olarak depolanmadığıdır.
Örneğin, çevrimiçi bir satıcının dizininde bulunan seasons gibi filtrelenebilir bir dize koleksiyonu alanını göz önünde bulundurun. Bu dizine yüklenen bazı belgeler aşağıdaki gibi görünebilir:
{
"value": [
{
"id": "1",
"name": "Hiking boots",
"seasons": ["spring", "summer", "fall"]
},
{
"id": "2",
"name": "Rain jacket",
"seasons": ["spring", "fall", "winter"]
},
{
"id": "3",
"name": "Parka",
"seasons": ["winter"]
}
]
}
Alanının değerleriseasons, aşağıdakine benzer şekilde ters dizin adı verilen bir yapıda depolanır:
| Süre | Belge Kimlikleri |
|---|---|
| ilkbahar | 1, 2 |
| yaz | 1 |
| sonbahar | 1, 2 |
| kış | 2, 3 |
Bu veri yapısı tek bir soruyu büyük bir hızla yanıtlamak için tasarlanmıştır: Belirli bir terim hangi belgelerde görünür? Bu soruyu yanıtlamak, bir koleksiyon üzerindeki döngüden daha çok düz eşitlik denetimi gibi çalışır. Aslında, bu nedenle, Dize koleksiyonları için, Azure Yapay Zeka Arama yalnızca eq'ı karşılaştırma operatörü olarak any içindeki bir lambda ifadesinde kullanılmasına izin verir.
Ardından, aynı aralık değişkeninde birden çok eşitlik denetimini ile orbirleştirmenin nasıl mümkün olduğunu inceleyeceğiz. Cebir ve niceleyicilerin dağıtıcı özelliği sayesinde çalışır. Bu ifade:
seasons/any(s: s eq 'winter' or s eq 'fall')
eşdeğerdir:
seasons/any(s: s eq 'winter') or seasons/any(s: s eq 'fall')
ve iki any alt ifadenin her biri, ters çevrilmiş dizin kullanılarak verimli bir şekilde yürütülebilir. Ayrıca, niceleyicilerin olumsuzlama yasası sayesinde şu ifade:
seasons/all(s: s ne 'winter' and s ne 'fall')
eşdeğerdir:
not seasons/any(s: s eq 'winter' or s eq 'fall')
bu nedenle all ve ne ile and kullanmak mümkündür.
Not
Ayrıntılar bu belgenin kapsamı dışında olsa da, bu ilkeler coğrafi uzamsal nokta koleksiyonları için mesafe ve kesişim testlerine de uzanır. bu nedenle, içinde any:
-
geo.intersectsiptal edilemiyor -
geo.distanceşu kullanılarak karşılaştırılmalıdır:ltveyale - ifadeler
orile birleştirilmeli,andile değil
Ters kurallar all için geçerlidir.
lt, gt, le, ve ge işleçlerini destekleyen veri türleri koleksiyonları filtrelenirken, örneğin Collection(Edm.Int32), çok çeşitli ifadelere izin verilir. Özellikle, temel karşılaştırma ifadeleri and ve or olarak içinde kullanabilirsiniz any, bu ifadeler aralık karşılaştırmaları ile birleştirildiği sürece ve ardından and kullanılarak or daha da birleştirildiğinde. Boole ifadelerinin bu yapısına Ayrık Normal Form (DNF) adı verilir ve diğer adıyla "AND'lerin OR'leri". Buna karşılık, bu veri türleri için all lambda ifadeleri Konjonktif Normal Formda (CNF) olmalıdır, aksi takdirde "OR'lerin AND'leri" olarak bilinir. Azure Yapay Zeka Arama bu tür aralık karşılaştırmalarına izin verir çünkü dizeler için hızlı terim araması yapabilmesi gibi ters dizinleri kullanarak bunları verimli bir şekilde yürütebilir.
Özetle, lambda ifadesinde izin verilenler için temel kurallar şunlardır:
- içinde
any, pozitif denetimlere, eşitlik, aralık karşılaştırmaları gibi, her zaman izin verilirgeo.intersectsvegeo.distance,ltveyaleile karşılaştırmalar yapılabilir (mesafe denetimi yapılırken "yakınlığı" eşitlik gibi değerlendirin). -
anyiçinde her zamanorizin verilir. Yalnızca aralık denetimlerini ifade abilen veri türleri için ve yalnızca AND'lerin OR'lerini (DNF) kullanıyorsanız kullanabilirsinizand. - içinde
allkurallar tersine çevrilir. Yalnızca negatif denetimlere izin verilir, her zaman kullanabilirsinizandve yalnızca OR'lerin AND'leri (CNF) olarak ifade edilen aralık denetimleri için kullanabilirsinizor.
Pratikte, yine de kullanma olasılığınız en yüksek olan filtre türleri bunlardır. Yine de mümkün olanın sınırlarını anlamak yararlı olabilir.
İzin verilen ve izin verilmeyen filtre türlerine ilişkin belirli örnekler için Geçerli koleksiyon filtreleri yazma bölümüne bakın.