Aracılığıyla paylaş


Azure AI Search'teki OData search.in işlevi

OData filtre ifadelerinde yaygın bir senaryo, her belgedeki tek bir alanın birçok olası değerden birine eşit olup olmadığını denetlemektir. Örneğin, bazı uygulamalar sorguyu veren kullanıcıyı temsil eden asıl kimlikler listesinde bir veya daha fazla asıl kimlik içeren bir alanı denetleyerek güvenlik kırpmasını bu şekilde uygular. Böyle bir sorgu yazmanın bir yolu ve or işleçlerini eq kullanmaktır:

    group_ids/any(g: g eq '123' or g eq '456' or g eq '789')

Ancak, işlevini kullanarak bunu yazmanın search.in daha kısa bir yolu vardır:

    group_ids/any(g: search.in(g, '123, 456, 789'))

Önemli

Kullanımı, daha kısa ve daha kolay okunmasının yanı sıra performans search.in avantajları da sağlar ve filtreye dahil etmek için yüzlerce, hatta binlerce değer olduğunda filtrelerin belirli boyut sınırlamalarını önler. Bu nedenle, eşitlik ifadelerinin daha karmaşık bir ayrıştırılması yerine kullanılmasını search.in kesinlikle öneririz.

Dekont

OData standardının 4.01 sürümü yakın zamanda Azure AI Search'teki işlevle benzer davranışlara search.in sahip olan işleci kullanıma sunulmuşturin. Ancak Azure AI Search bu işleci desteklemez, bu nedenle bunun yerine işlevini kullanmanız search.in gerekir.

Sözdizimi

Aşağıdaki EBNF (Genişletilmiş Backus-Naur Formu) işlevin search.in dil bilgisini tanımlar:

search_in_call ::=
    'search.in(' variable ',' string_literal(',' string_literal)? ')'

Etkileşimli söz dizimi diyagramı da kullanılabilir:

Dekont

EbNF'nin tamamı için bkz . Azure AI Search için OData ifade söz dizimi başvurusu.

İşlev, search.in belirli bir dize alanının veya aralık değişkeninin belirli bir değer listesinden birine eşit olup olmadığını test eder. Değişken ile listedeki her değer arasındaki eşitlik, işleç için eq olduğu gibi büyük/küçük harfe duyarlı bir şekilde belirlenir. Bu nedenle, gibi search.in(myfield, 'a, b, c') bir ifade ile eşdeğerdir myfield eq 'a' or myfield eq 'b' or myfield eq 'c', ancak bu search.in çok daha iyi bir performans verir.

İşlevin search.in iki aşırı yüklemesi vardır:

  • search.in(variable, valueList)
  • search.in(variable, valueList, delimiters)

Parametreler aşağıdaki tabloda tanımlanmıştır:

Parametre adı Türü Tanım
variable Edm.String Bir dize alanı başvurusu (veya bir veya ifadesinin içinde kullanıldığı durumda search.in bir dize koleksiyonu alanı üzerinde bir anyall aralık değişkeni).
valueList Edm.String parametresiyle eşleşmesi variable için sınırlandırılmış bir değer listesi içeren dize. delimiters Parametre belirtilmezse, varsayılan sınırlayıcılar boşluk ve virgüldür.
delimiters Edm.String Parametre ayrıştırılırken valueList her karakterin ayırıcı olarak ele alındığı dize. Bu parametrenin varsayılan değeri, ' ,' aralarında boşluk ve/veya virgül bulunan tüm değerlerin ayrılacağı anlamına gelir. Değerleriniz bu karakterleri içerdiğinden boşluk ve virgül dışında ayırıcılar kullanmanız gerekiyorsa, bu parametrede olduğu gibi '|' alternatif sınırlayıcılar belirtebilirsiniz.

Performansı search.in

kullanıyorsanız search.in, ikinci parametre yüzlerce veya binlerce değerin listesini içerdiğinde saniye alt yanıt süresi bekleyebilirsiniz. geçirebileceğiniz search.inöğe sayısı üzerinde açık bir sınır yoktur, ancak istek boyutu üst sınırıyla sınırlı kalırsınız. Ancak, değer sayısı arttıkça gecikme süresi de artar.

Örnekler

Adı 'Sea View motel' veya 'Budget hotel' olan tüm otelleri bulun. Tümcecikler, varsayılan sınırlayıcı olan boşluklar içerir. Üçüncü dize parametresi olarak tek tırnak içinde alternatif sınırlayıcı belirtebilirsiniz:

    search.in(HotelName, 'Sea View motel,Budget hotel', ',')

Adı 'Sea View motel' veya 'Budget hotel' olan ve '|' ile ayrılmış tüm otelleri bulun:

    search.in(HotelName, 'Sea View motel|Budget hotel', '|')

'wifi' veya 'tub' etiketine sahip odaları olan tüm otelleri bulun:

    Rooms/any(room: room/Tags/any(tag: search.in(tag, 'wifi, tub')))

Etiketlerde 'ısıtmalı havlu rafları' veya 'saç kurutma makinesi dahil' gibi koleksiyon içindeki tümceciklerde eşleşme bulun.

    Rooms/any(room: room/Tags/any(tag: search.in(tag, 'heated towel racks,hairdryer included', ','))

"Motel" veya "cabin" etiketi olmayan tüm otelleri bulun:

    Tags/all(tag: not search.in(tag, 'motel, cabin'))

Sonraki adımlar