OData koleksiyon filtrelerinin Azure Yapay Zeka Arama'te nasıl çalıştığını anlama

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:

  1. 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çlerini ltgt kullanarak karşılaştırmak mantıklı değildir.
  2. 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.
  3. 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.

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.intersects iptal edilemiyor
  • geo.distance şu kullanılarak karşılaştırılmalıdır: lt veya le
  • ifadeler or ile birleştirilmeli, and ile 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.intersects ve geo.distance, lt veya le ile karşılaştırmalar yapılabilir (mesafe denetimi yapılırken "yakınlığı" eşitlik gibi değerlendirin).
  • any içinde her zaman or izin verilir. Yalnızca aralık denetimlerini ifade abilen veri türleri için ve yalnızca AND'lerin OR'lerini (DNF) kullanıyorsanız kullanabilirsiniz and .
  • içinde allkurallar tersine çevrilir. Yalnızca negatif denetimlere izin verilir, her zaman kullanabilirsiniz and ve yalnızca OR'lerin AND'leri (CNF) olarak ifade edilen aralık denetimleri için kullanabilirsiniz or .

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.

Sonraki adımlar