Aracılığıyla paylaş


Azure AI Search'te OData koleksiyon filtrelerinde sorun giderme

Azure AI Search'teki koleksiyon alanlarına filtre uygulamak için ve all işleçlerini lambda ifadeleriyle birlikte kullanabilirsinizany. 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ılabilir olduğu, filtrelemek istediğiniz koleksiyon alanının veri türüne bağlı olarak farklılık gösterir. Bu bağlamda desteklenmeyen bir lambda ifadesinde bir özellik kullanmaya çalışırsanız bu hataya neden olabilir. Koleksiyon alanları üzerinde karmaşık bir filtre yazmaya çalışırken bu tür hatalarla karşılaşıyorsanı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 ifadesini kullanma search.ismatch veya search.ismatchscoring içinde 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.Double)Collection(Edm.Int32)veya türündeki Collection(Edm.DateTimeOffset)alanlara göre filtrelemeCollection(Edm.Int64) 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. veya türündeki Collection(Edm.String) alanlara göre filtreleme Collection(Edm.GeographyPoint) 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 se ifadeleri. 'all' için 'x ne y' veya 'not (x eq y)' formunun ifadelerini kullanın. Türdeki bir alana filtre uygulama Collection(Edm.String) Dize koleksiyonlarını filtreleme kuralları

Geçerli koleksiyon filtreleri yazma

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ı

Dize koleksiyonları için lambda ifadelerinin içinde, kullanılabilecek tek karşılaştırma işleçleri ve ne'tireq.

Not

Azure AI Search, lambda ifadesinin ltgtge/le//içinde veya dışında dize işleçlerini desteklemez.

any Gövdesi yalnızca eşitlik için test edebilirken, gövdesi all yalnızca eşitsizlik için test edebilir.

Birden çok ifadeyi or bir öğesinin gövdesinde ve and aracılığıyla öğesinin anygövdesinde birleştirmek allde mümkündür. search.in işlevi ile oreşitlik denetimlerini birleştirmeye eşdeğer olduğundan, gövdesinde anyde buna izin verilir. Buna karşılık, not search.in bir allgö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 hem ne de eq veya allgövdesinde any 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, ve geo.intersects işlevlerine geo.distance parametre olarak kullanılmalıdır. İşlev, geo.distance , veya gekarşılaştırma işleçlerinden ltlegtbiri kullanılarak bir uzaklık değeriyle karşılaştırılmalıdır. Bu kurallar, Edm.GeographyPoint olmayan 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)).
  • gövdesinde allişlevin geo.intersects olumsuzlanması gerekir. Buna karşılık, gövdesinde anygeo.intersects işlevin olumsuzlanmaması gerekir.
  • gövdesinde any, coğrafi uzamsal ifadeler kullanılarak orbirleştirilebilir. gövdesinde allbu tür ifadeler kullanılarak andbirleş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 bkz . Azure AI Search'te OData koleksiyonu filtrelerini anlama.

İ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)

ve gibi Edm.Int32 Edm.DateTimeOffset türler karşılaştırma işleçlerinin altısını da destekler: eq, ne, lt, le, gtve ge. Bu tür koleksiyonlar üzerindeki Lambda ifadeleri, bu işleçlerden herhangi birini kullanarak basit ifadeler içerebilir. Bu, hem hem allde any 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)
    • , , , leveya içeren basit karşılaştırma ifadeleri ile and/orbirleştirilebilir.eqge gtlt Örneğin:

      • ratings/any(r: r gt 2 and r le 5)
      • ratings/any(r: r le 5 or r gt 7)
    • (bağla birlikte) ile and birleştirilen karşılaştırma ifadeleri kullanılarak ordaha 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)
    • , , , leveya içeren basit karşılaştırma ifadeleri ile and/orbirleştirilebilir.nege gtlt Örneğin:

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

      • ratings/all(r: (r le 2 or 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 AI Search'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 sbağlı olmadığından reddedilirdetails/margin.

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 ücretsizdir. Ö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 başvuru sayfası

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) ve dışındaki search.ismatch her şey search.ismatchscoring Aynısı
Collection(Edm.String) veya ile eq karşılaştırmalar search.in

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

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

geo.intersects

Alt ifadeleri ile birleştirme or
veya ile kullanma geo.distance gtge

not geo.intersects(...)

Alt ifadeleri ile birleştirme and
Collection(Edm.DateTimeOffset), Collection(Edm.Double), Collection(Edm.Int32), Collection(Edm.Int64) , , ne, lt, gt, leveya kullanan eqkarşılaştırmalarge

kullanarak karşılaştırmaları diğer alt ifadelerle birleştirme or

Kullanarak diğer alt ifadeler dışında ne karşılaştırmaları birleştirme and

Disjunctive Normal Form (DNF) içinde ve or birleşimlerini kullanan ifadeler and
, , ne, lt, gt, leveya kullanan eqkarşılaştırmalarge

kullanarak karşılaştırmaları diğer alt ifadelerle birleştirme and

Kullanarak diğer alt ifadeler dışında eq karşılaştırmaları birleştirme or

Konjonktif and Normal Formda (CNF) ve or birleşimlerini kullanan ifadeler

Her durum için geçerli filtreler oluşturma örnekleri için bkz . Geçerli koleksiyon filtreleri yazma.

Filtreleri sık sık yazıyorsanız ve ilk ilkelerden gelen kuralları anlamak, bunları ezberlemekten daha fazlasını anlamanıza yardımcı olabilir. Bkz . Azure AI Search'te OData koleksiyon filtrelerini anlama.

Sonraki adımlar