Azure Yapay Zeka Arama'te OData koleksiyon filtrelerinde sorun giderme

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.

Azure Yapay Zeka Arama'teki koleksiyon alanlarına filtre uygulamak için ve işleçlerini lambda ifadeleriyle anybirlikte kullanabilirsinizall. Lambda ifadesi, bir koleksiyonun her öğesine uygulanan bir alt filtredir.

Filtre ifadelerinin her özelliği bir lambda ifadesinin içinde kullanılamaz. Hangi özelliklerin kullanılabildiği, filtrelemek istediğiniz koleksiyon alanının veri türüne bağlıdır. Bu sınırlama, bu bağlamda desteklenmeyen bir lambda ifadesinde bir özellik kullanmaya çalışırsanız hataya neden olabilir. Koleksiyon alanları üzerinde karmaşık bir filtre yazmaya çalışırken bu tür hatalarla karşılaşırsanız, bu makale sorunu gidermenize yardımcı olur.

Yaygın koleksiyon filtresi hataları

Aşağıdaki tabloda, bir koleksiyon filtresi yürütmeye çalışırken karşılaşabileceğiniz hatalar listelanmaktadır. Bu hatalar, lambda ifadesinde desteklenmeyen filtre ifadelerinin bir özelliğini kullandığınızda oluşur. Her hata, hatadan kaçınmak için filtrenizi nasıl yeniden yazabileceğiniz konusunda bazı yönergeler sağlar. Tabloda, bu hatanın nasıl önlendiğini gösteren bu makalenin ilgili bölümünün bağlantısı da yer alır.

Hata İletisi Durum Ayrıntılar
İşlevin ismatch 's' aralık değişkenine bağlı parametresi yok. Lambda ifadelerinde yalnızca ilişkili alan başvuruları desteklenir ('any' veya 'all'). Ancak, işlevin lambda ifadesinin ismatch dışında olması için filtrenizi değiştirebilir ve yeniden deneyebilirsiniz. Lambda ifadesi içerisinde search.ismatch veya search.ismatchscoring kullanma Karmaşık koleksiyonları filtreleme kuralları
Geçersiz lambda ifadesi. Collection(Edm.String) türünde bir alan üzerinde yinelenen bir lambda ifadesinde tam tersinin beklendiği eşitlik veya eşitsizlik testi bulundu. 'any' için 'x eq y' veya 'search.in(...)' formunun ifadelerini kullanın. 'tümü' için 'x ne y', 'not (x eq y)' veya 'not search.in(...)' biçiminde ifadeler kullanın. Türdeki bir alana filtre uygulama Collection(Edm.String) Dize koleksiyonlarını filtreleme kuralları
Geçersiz lambda ifadesi. Karmaşık Boole ifadesinin desteklenmeyen bir biçimi bulundu. 'any' için, Ayrık Normal Form olarak da bilinen 'AND'lerin OR'leri' olan ifadeleri kullanın. Örneğin: (a and b) or (c and d) burada a, b, c ve d karşılaştırma veya eşitlik alt ifadeleridir. 'tümü' için, Konjonktif Normal Form olarak da bilinen 'OR'lerin AND'leri olan ifadeleri kullanın. Örneğin: (a or b) and (c or d) burada a, b, c ve d karşılaştırma veya eşitsizlik alt ifadeleridir. Karşılaştırma ifadelerine örnekler: 'x gt 5', 'x le 2'. Eşitlik ifadesi örneği: 'x eq 5'. Eşitsizlik ifadesi örneği: 'x ne 5'. Collection(Edm.DateTimeOffset), Collection(Edm.Double), Collection(Edm.Int32) veya Collection(Edm.Int64) türündeki alanlarına göre filtreleme Karşılaştırılabilir koleksiyonları filtreleme kuralları
Geçersiz lambda ifadesi. Collection(Edm.GeographyPoint) türünde bir alan üzerinde yinelenen bir lambda ifadesinde desteklenmeyen geo.distance() veya geo.intersects() kullanımı bulundu. 'any' için geo.distance() öğesini 'lt' veya 'le' işleçlerini kullanarak karşılaştırdığınızdan ve geo.intersects() kullanımının olumsuz olmadığından emin olun. 'all' için geo.distance() değerini 'gt' veya 'ge' işleçlerini kullanarak karşılaştırdığınızdan ve geo.intersects() kullanımının olumsuz olduğundan emin olun. Türdeki bir alana filtre uygulama Collection(Edm.GeographyPoint) GeographyPoint koleksiyonlarını filtreleme kuralları
Geçersiz lambda ifadesi. Collection(Edm.GeographyPoint) türündeki alanlar üzerinde yinelenen lambda ifadelerinde karmaşık Boole ifadeleri desteklenmez. 'any' için alt ifadeleri 'veya' ile birleştirin; 've' desteklenmez. 'all' için alt ifadeleri 've' ile birleştirin; 'veya' desteklenmez. Türü Collection(Edm.String) veya Collection(Edm.GeographyPoint) olan alanlarda filtreleme Dize koleksiyonlarını filtreleme kuralları

GeographyPoint koleksiyonlarını filtreleme kuralları
Geçersiz lambda ifadesi. Karşılaştırma işleci bulundu ('lt', 'le', 'gt' veya 'ge'). Collection(Edm.String) türündeki alanlar üzerinde yinelenen lambda ifadelerinde yalnızca eşitlik işleçlerine izin verilir. 'any' için 'x eq y' formunun ifadelerini kullanın. 'tüm' için 'x ≠ y' ya da 'not (x = y)' formundaki ifadelerini kullanın. Türdeki bir alana filtre uygulama Collection(Edm.String) Dize koleksiyonlarını filtreleme kuralları

Geçerli koleksiyon filtreleri nasıl yazılır

Geçerli koleksiyon filtreleri yazma kuralları her veri türü için farklıdır. Aşağıdaki bölümlerde, hangi filtre özelliklerinin desteklendiği ve hangilerinin desteklenmediği örnekleri gösterilerek kurallar açıklanmaktadır:

Dize koleksiyonlarını filtreleme kuralları

tr-TR: Dize koleksiyonları için lambda ifadelerinin içinde, kullanılabilecek yalnızca karşılaştırma işleçleri eq ve ne'dir.

Not

Azure Yapay Zeka Arama, lambda ifadesinin lt/le/gt/geiçinde veya dışında dize işleçlerini desteklemez.

any gövdesi yalnızca eşitlik için test yapabilirken, all gövdesi yalnızca eşitsizlik için test yapabilir.

Birden çok ifadeyi or bir öğesinin gövdesinde ve any aracılığıyla öğesinin andgövdesinde birleştirmek allde mümkündür. search.in işlevi or ile eşitlik denetimlerini birleştirmeye eşdeğer olduğundan, aynı zamanda bir any gövdesinde kullanılması da mümkündür. Aksine, not search.in bir all gövdesinde izin verilir.

Örneğin, bu ifadelere izin verilir:

  • tags/any(t: t eq 'books')
  • tags/any(t: search.in(t, 'books, games, toys'))
  • tags/all(t: t ne 'books')
  • tags/all(t: not (t eq 'books'))
  • tags/all(t: not search.in(t, 'books, games, toys'))
  • tags/any(t: t eq 'books' or t eq 'games')
  • tags/all(t: t ne 'books' and not (t eq 'games'))

Bu ifadelere izin verilmiyor:

  • tags/any(t: t ne 'books')
  • tags/any(t: not search.in(t, 'books, games, toys'))
  • tags/all(t: t eq 'books')
  • tags/all(t: search.in(t, 'books, games, toys'))
  • tags/any(t: t eq 'books' and t ne 'games')
  • tags/all(t: t ne 'books' or not (t eq 'games'))

Boole koleksiyonlarını filtreleme kuralları

Türü Edm.Boolean yalnızca eq ve ne işleçlerini destekler. Bu nedenle, her zaman tautolojilere veya çelişkilere yol açacağı için aynı aralık değişkenini denetleyen bu tür yan tümcelerin birleştirilmesine and/or izin vermek çok anlamlı değildir.

Boole koleksiyonlarında izin verilen bazı filtre örnekleri aşağıda verilmiştir:

  • flags/any(f: f)
  • flags/all(f: f)
  • flags/any(f: f eq true)
  • flags/any(f: f ne true)
  • flags/all(f: not f)
  • flags/all(f: not (f eq true))

Dize koleksiyonlarından farklı olarak, Boole koleksiyonlarının hangi işlecin hangi lambda ifade türünde kullanılabileceğinin sınırları yoktur. Hem eq hem de ne, any veya all gövdesinde kullanılabilir.

Boole koleksiyonları için aşağıdaki gibi ifadelere izin verilmez:

  • flags/any(f: f or not f)
  • flags/any(f: f or f)
  • flags/all(f: f and not f)
  • flags/all(f: f and f eq true)

GeographyPoint koleksiyonlarını filtreleme kuralları

Koleksiyondaki tür Edm.GeographyPoint değerleri doğrudan birbiriyle karşılaştırılamaz. Bunun yerine, geo.distance ve geo.intersects işlevlerine parametre olarak kullanılmalıdır. İşlev, geo.distance , veya ltkarşılaştırma işleçlerinden legtgebiri kullanılarak bir uzaklık değeriyle karşılaştırılmalıdır. Bu kurallar, koleksiyon olmayan Edm.GeographyPoint alanları için de geçerlidir.

Dize koleksiyonları gibi koleksiyonlar da Edm.GeographyPoint coğrafi uzamsal işlevlerin farklı lambda ifade türlerinde nasıl kullanılıp birleştirilebileceğine ilişkin bazı kurallara sahiptir:

  • İşlevle geo.distance kullanabileceğiniz karşılaştırma işleçleri lambda ifadesinin türüne bağlıdır. için anyyalnızca lt veya lekullanabilirsiniz. için allyalnızca gt veya gekullanabilirsiniz. içeren geo.distanceifadeleri olumsuzlayabilirsiniz, ancak karşılaştırma işlecini değiştirmeniz gerekir (geo.distance(...) lt x olur not (geo.distance(...) ge x) ve geo.distance(...) le x olur not (geo.distance(...) gt x)).
  • all gövdesinde, geo.intersects işlevinin olumsuzlanması gerekir. Buna karşılık, bir any'nin gövdesinde, geo.intersects işlevinin olumsuzlanmaması gerekir.
  • Bir any'nin gövdesinde, coğrafi-uzamsal ifadeler or kullanılarak birleştirilebilir. Bir all gövdesinde, bu tür ifadeler and kullanılarak birleştirilebilir.

Yukarıdaki sınırlamalar, dize koleksiyonlarındaki eşitlik/eşitsizlik sınırlaması gibi benzer nedenlerle mevcuttur. Bu nedenlere daha ayrıntılı bir bakış için Azure Yapay Zeka Arama'te OData koleksiyonu filtrelerini anlama bölümüne bakın.

İzin verilen koleksiyonlardaki Edm.GeographyPoint filtrelere bazı örnekler aşağıda verilmiştir:

  • locations/any(l: geo.distance(l, geography'POINT(-122 49)') lt 10)
  • locations/any(l: not (geo.distance(l, geography'POINT(-122 49)') ge 10) or geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
  • locations/all(l: geo.distance(l, geography'POINT(-122 49)') ge 10 and not geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))

Koleksiyonlar için Edm.GeographyPoint aşağıdaki gibi ifadelere izin verilmez:

  • locations/any(l: l eq geography'POINT(-122 49)')
  • locations/any(l: not geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
  • locations/all(l: geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
  • locations/any(l: geo.distance(l, geography'POINT(-122 49)') gt 10)
  • locations/all(l: geo.distance(l, geography'POINT(-122 49)') lt 10)
  • locations/any(l: geo.distance(l, geography'POINT(-122 49)') lt 10 and geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
  • locations/all(l: geo.distance(l, geography'POINT(-122 49)') le 10 or not geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))

Karşılaştırılabilir koleksiyonları filtreleme kuralları

Bu bölüm aşağıdaki tüm veri türleri için geçerlidir:

  • Collection(Edm.DateTimeOffset)
  • Collection(Edm.Double)
  • Collection(Edm.Int32)
  • Collection(Edm.Int64)

Edm.Int32 ve Edm.DateTimeOffset türleri, karşılaştırma işleçlerinin altısını da destekler: eq, ne, lt, le, gt, ve ge. Bu tür koleksiyonlar üzerindeki Lambda ifadeleri, bu işleçlerden herhangi birini kullanarak basit ifadeler içerebilir. Bu, hem hem anyde all için geçerlidir. Örneğin, bu filtrelere izin verilir:

  • ratings/any(r: r ne 5)
  • dates/any(d: d gt 2017-08-24T00:00:00Z)
  • not margins/all(m: m eq 3.5)

Ancak, bu tür karşılaştırma ifadelerinin bir lambda ifadesi içinde daha karmaşık ifadeler halinde nasıl birleştirilebileceğiyle ilgili sınırlamalar vardır:

  • için anykurallar:
    • Basit eşitsizlik ifadeleri diğer ifadelerle kullanışlı bir şekilde birleştirilemiyor. Örneğin, bu ifadeye izin verilir:

      • ratings/any(r: r ne 5)

      ancak bu ifade şu değildir:

      • ratings/any(r: r ne 5 and r gt 2)

      ve bu ifadeye izin verilse de koşullar çakıştığı için kullanışlı değildir:

      • ratings/any(r: r ne 5 or r gt 7)
    • eq, lt, le, gt veya ge içeren basit karşılaştırma ifadeleri, and/or ile birleştirilebilir. Örneğin:

      • ratings/any(r: r gt 2 and r le 5)
      • ratings/any(r: r le 5 or r gt 7)
    • bağlaçlarla and ile birleştirilen karşılaştırma ifadeleri, or kullanılarak daha fazla birleştirilebilir. Bu form Boole mantığında "Ayrık Normal Form" (DNF) olarak bilinir. Örneğin:

      • ratings/any(r: (r gt 2 and r le 5) or (r gt 7 and r lt 10))
  • için allkurallar:
    • Basit eşitlik ifadeleri diğer ifadelerle kullanışlı bir şekilde birleştirilemiyor. Örneğin, bu ifadeye izin verilir:

      • ratings/all(r: r eq 5)

      ancak bu ifade şu değildir:

      • ratings/all(r: r eq 5 or r le 2)

      ve bu ifadeye izin verilse de koşullar çakıştığı için kullanışlı değildir:

      • ratings/all(r: r eq 5 and r le 7)
    • ne, lt, le, gt veya ge içeren basit karşılaştırma ifadeleri, and/or ile birleştirilebilir. Örneğin:

      • ratings/all(r: r gt 2 and r le 5)
      • ratings/all(r: r le 5 or r gt 7)
    • Karşılaştırma ifadeleri, or (disjunctions) kullanılarak birleştirildiğinde, and ile daha fazla birleştirilebilir. Bu form Boole mantığında "Konjonktif Normal Form" (CNF) olarak bilinir. Örneğin:

      • ratings/all(r: (r le 2 or r gt 5) and (r lt 7 or r ge 10))

Karmaşık koleksiyonları filtreleme kuralları

Karmaşık koleksiyonlar üzerindeki Lambda ifadeleri, ilkel tür koleksiyonlarına kıyasla lambda ifadelerinden çok daha esnek bir söz dizimini destekler. Böyle bir lambda ifadesinin içinde herhangi bir filtre yapısını kullanabilirsiniz ve yalnızca iki özel durum dışında kullanabilirsiniz.

İlk olarak, işlevleri search.ismatch ve search.ismatchscoring lambda ifadeleri içinde desteklenmez. Daha fazla bilgi için bkz Azure Yapay Zeka Arama'te OData koleksiyon filtrelerini anlama.

İkincisi, aralık değişkenine (serbest değişkenler olarak adlandırılır) bağlı olmayan alanlara başvuruda bulunmak yasaktır. Örneğin, aşağıdaki iki eşdeğer OData filtre ifadesini göz önünde bulundurun:

  1. stores/any(s: s/amenities/any(a: a eq 'parking')) and details/margin gt 0.5
  2. stores/any(s: s/amenities/any(a: a eq 'parking' and details/margin gt 0.5))

İlk ifadeye izin verilirken, ikinci form aralık değişkenine details/marginbağlı olmadığından reddedilirs.

Bu kural, dış kapsamda bağlı değişkenleri olan ifadelere de genişletir. Bu tür değişkenler, göründükleri kapsam bakımından serbesttir. Örneğin, ilk ifadeye izin verilirken ikinci eşdeğer ifadeye izin verilmez çünkü s/name aralık değişkeninin akapsamına göre serbesttir:

  1. stores/any(s: s/amenities/any(a: a eq 'parking') and s/name ne 'Flagship')
  2. stores/any(s: s/amenities/any(a: a eq 'parking' and s/name ne 'Flagship'))

Lambda ifadelerinin yalnızca ilişkili değişkenler içermesi için filtreler oluşturmak her zaman mümkün olduğundan bu sınırlama uygulamada sorun oluşturmamalıdır.

Koleksiyon filtresi kuralları için ipuçları kartı

Aşağıdaki tabloda, her koleksiyon veri türü için geçerli filtreler oluşturma kuralları özetlenir.

Veri türü ile lambda ifadelerinde izin verilen özellikler any ile lambda ifadelerinde izin verilen özellikler all
Collection(Edm.ComplexType) search.ismatch ve search.ismatchscoring dışındaki her şey Aynısı
Collection(Edm.String) Karşılaştırmalar eq veya search.in ile

Alt ifadeleri or ile birleştirme
Karşılaştırmalar ne veya not search.in() ile

Alt ifadeleri and ile birleştirme
Collection(Edm.Boolean) Karşılaştırmalar eq veya ne ile Aynısı
Collection(Edm.GeographyPoint) geo.distance ve lt veya le kullanma

geo.intersects

Alt ifadeleri or ile birleştirme
geo.distance ve gt veya ge kullanma

not geo.intersects(...)

Alt ifadeleri and ile birleştirme
Collection(Edm.DateTimeOffset), Collection(Edm.Double), Collection(Edm.Int32), Collection(Edm.Int64) Karşılaştırmalareq, ne, lt, gt, le veya ge kullanan

Karşılaştırmaları or kullanarak diğer alt ifadelerle birleştirmek

ne'yi hariç tutarak and kullanarak diğer alt ifadelerle karşılaştırmaları birleştirme

Disjunctive Normal Form (DNF) içinde ve and birleşimlerini kullanan ifadeler or
Karşılaştırmalareq, ne, lt, gt, le veya ge kullanan

Karşılaştırmaları and kullanarak diğer alt ifadelerle birleştirmek

eq'yi hariç tutarak or kullanarak diğer alt ifadelerle karşılaştırmaları birleştirme

Bağlayıcı Normal Form (CNF) içinde and ve or kombinasyonlarını kullanan ifadeler

Her durum için geçerli filtreler oluşturma örnekleri görmek için Geçerli koleksiyon filtreleri nasıl yazılır konusuna bakın.

Filtreleri sık sık yazıyorsanız ve temel ilkelerden gelen kuralları anlamak, onları ezberlemekten daha faydalı olacaksa, Azure Yapay Zeka Arama'teki OData koleksiyon filtrelerini anlama konusuna bakın.

Sonraki adımlar