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ı
- Boole koleksiyonlarını filtreleme kuralları
- GeographyPoint koleksiyonlarını filtreleme kuralları
- Karşılaştırılabilir koleksiyonları filtreleme kuralları
- Karmaşık koleksiyonları filtreleme kuralları
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 lt
gt
ge
/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 any
gövdesinde birleştirmek all
de mümkündür. search.in
işlevi ile or
eşitlik denetimlerini birleştirmeye eşdeğer olduğundan, gövdesinde any
de buna izin verilir. Buna karşılık, 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 hem ne
de eq
veya all
gö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 ge
karşılaştırma işleçlerinden lt
le
gt
biri 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çinany
yalnızcalt
veyale
kullanabilirsiniz. içinall
yalnızcagt
veyage
kullanabilirsiniz. içerengeo.distance
ifadeleri olumsuzlayabilirsiniz, ancak karşılaştırma işlecini değiştirmeniz gerekir (geo.distance(...) lt x
olurnot (geo.distance(...) ge x)
vegeo.distance(...) le x
olurnot (geo.distance(...) gt x)
). - gövdesinde
all
işlevingeo.intersects
olumsuzlanması gerekir. Buna karşılık, gövdesindeany
geo.intersects
işlevin olumsuzlanmaması gerekir. - gövdesinde
any
, coğrafi uzamsal ifadeler kullanılarakor
birleştirilebilir. gövdesindeall
bu tür ifadeler kullanılarakand
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 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
, gt
ve ge
. Bu tür koleksiyonlar üzerindeki Lambda ifadeleri, bu işleçlerden herhangi birini kullanarak basit ifadeler içerebilir. Bu, hem hem all
de 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
any
kurallar: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)
, , ,
le
veya içeren basit karşılaştırma ifadeleri ileand
/or
birleştirilebilir.eq
ge
gt
lt
Ö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ılarakor
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
all
kurallar: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)
, , ,
le
veya içeren basit karşılaştırma ifadeleri ileand
/or
birleştirilebilir.ne
ge
gt
lt
Ö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ılarakand
daha 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:
stores/any(s: s/amenities/any(a: a eq 'parking')) and details/margin gt 0.5
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 s
bağ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 a
kapsamına göre serbesttir:
stores/any(s: s/amenities/any(a: a eq 'parking') and s/name ne 'Flagship')
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 lt le geo.intersects Alt ifadeleri ile birleştirme or |
veya ile kullanma geo.distance gt ge not geo.intersects(...) Alt ifadeleri ile birleştirme and |
Collection(Edm.DateTimeOffset) , Collection(Edm.Double) , Collection(Edm.Int32) , Collection(Edm.Int64) |
, , ne , lt , gt , le veya kullanan eq karşı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 , le veya kullanan eq karşı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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin