Metin sorgularındaki filtreler

Filtre, sorgu yürütmeden önce içeriği dahil etme veya dışlama için değer tabanlı ölçütler sağlar. Örneğin, tarihlere, konumlara veya dile göre belgeleri dahil etme veya dışlama. Filtreler tek tek alanlarda belirtilir. Bir alan tanımı, filtre ifadelerinde kullanmak istiyorsanız "filtrelenebilir" olarak ilişkilendirilmelidir.

OData filtre ifadesi söz dizimi kullanılarak bir filtre belirtilir. Tam metin aramasının aksine, bir filtre yalnızca eşleşme tam ise başarılı olur.

Filtre ne zaman kullanılır?

Filtreler, "yakınımda bul" jeo-uzamsal arama, çok yönlü gezinti ve yalnızca bir kullanıcının görmesine izin verilen belgeleri gösteren güvenlik filtreleri gibi çeşitli arama deneyimlerinin temelini oluşturur. Bu deneyimlerden birini uygularsanız bir filtre gerekir. Coğrafi konum koordinatlarını, kullanıcı tarafından seçilen model kategorisini veya istek sahibinin güvenlik kimliğini sağlayan arama sorgusuna eklenmiş filtredir.

Yaygın senaryolar şunlardır:

  • Arama sonuçlarını dizindeki içeriğe göre dilimleyin. Otel konumu, kategorileri ve olanakları içeren bir şema göz önünde bulundurulduğunda, ölçütlere (Seattle'da, suda, bir görünüme sahip) açıkça eşleşmesi için bir filtre oluşturabilirsiniz.

  • Arama deneyimi uygulama, filtre bağımlılığıyla birlikte gelir:

    • Modelli gezinti , kullanıcı tarafından seçilen model kategorisini geri geçirmek için bir filtre kullanır.
    • Jeo-uzamsal arama , bir alan içinde veya uzaktan eşleşen "yakınımda bul" uygulamalarında ve işlevlerinde geçerli konumun koordinatlarını geçirmek için bir filtre kullanır.
    • Güvenlik filtreleri , güvenlik tanımlayıcılarını filtre ölçütü olarak geçirir; burada dizindeki bir eşleşme, belgeye erişim hakları için ara sunucu görevi görür.
  • "Sayı araması" yapın. Sayısal alanlar alınabilir ve arama sonuçlarında görünebilir, ancak ayrı ayrı aranabilir (tam metin aramasına tabi değildir). Sayısal verilere göre seçim ölçütlerine ihtiyacınız varsa filtre kullanın.

Filtreler nasıl yürütülür?

Sorgu zamanında, filtre ayrıştırıcısı ölçütleri giriş olarak kabul eder, ifadeyi ağaç olarak temsil edilen atomik Boole ifadelerine dönüştürür ve sonra filtre ağacını bir dizindeki filtrelenebilir alanlar üzerinde değerlendirir.

Filtreleme, arama ile birlikte gerçekleşir ve belge alma ve ilgi puanlaması için hangi belgelerin aşağı akış işlemeye dahil edilir? Bir arama dizesiyle eşleştirildiğinde, filtre sonraki arama işleminin geri çağırma kümesini etkili bir şekilde azaltır. Tek başına kullanıldığında (örneğin, sorgu dizesi boş search=*olduğunda), filtre ölçütü tek giriştir.

Filtreleri tanımlama

Filtreler, Azure AI Search tarafından desteklenen filtre söz diziminde ifade edilen OData ifadeleridir.

Her arama işlemi için bir filtre belirtebilirsiniz, ancak filtrenin kendisi birden çok alan, birden çok ölçüt ve bir ismatch işlev kullanıyorsanız birden çok tam metin arama ifadesi içerebilir. Çok parçalı filtre ifadesinde, koşulları herhangi bir sırada belirtebilirsiniz (işleç önceliği kurallarına tabidir). Belirli bir dizideki önkoşulları yeniden düzenlemeye çalışırsanız performansta takdire değer bir kazanç yoktur.

Filtre ifadesinde sınırlardan biri, isteğin boyut üst sınırıdır. Filtre dahil olmak üzere isteğin tamamı POST için en fazla 16 MB veya GET için 8 KB olabilir. Ayrıca, filtre ifadenizdeki yan tümcelerin sayısıyla ilgili bir sınır da vardır. İyi bir kural, yüzlerce yan tümceniz varsa sınıra girme riskiniz olmasıdır. Uygulamanızı, ilişkisiz boyutta filtreler oluşturmeyecek şekilde tasarlamanızı öneririz.

Aşağıdaki örnekler, çeşitli API'lerdeki prototip filtre tanımlarını temsil eder.

POST https://[service name].search.windows.net/indexes/hotels/docs/search?api-version=2020-06-30
{
    "search": "*",
    "filter": "Rooms/any(room: room/BaseRate lt 150.0)",
    "select": "HotelId, HotelName, Rooms/Description, Rooms/BaseRate"
}
options = new SearchOptions()
{
    Filter = "Rating gt 4",
    OrderBy = { "Rating desc" }
};

Filtre desenleri

Aşağıdaki örneklerde filtre senaryoları için çeşitli kullanım desenleri gösterilmektedir. Daha fazla fikir için bkz . OData ifadesi söz dizimi > Örnekleri.

  • Tek başına $filter, sorgu dizesi olmadan, filtre ifadesi ilgilendiğim belgeleri tam olarak niteleyebiliyorsa kullanışlıdır. Sorgu dizesi olmadan sözcük temelli veya dilsel analiz, puanlama ve sıralama yoktur. Arama dizesinin yalnızca bir yıldız işareti olduğuna dikkat edin; bu da "tüm belgeleri eşleştir" anlamına gelir.

    {
      "search": "*",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Honolulu"
    }
    
  • Filtrenin alt kümeyi oluşturduğu ve sorgu dizesinin filtrelenmiş alt küme üzerinde tam metin araması için terim girişleri sağladığı sorgu dizesi ve $filter birleşimi. Terimlerin (yürüme mesafesindeki tiyatrolar) eklenmesi, sonuçlarda arama puanlarını tanıtır ve burada terimlerle en iyi eşleşen belgeler daha yüksek derecelenir. Sorgu dizesiyle filtre kullanmak en yaygın kullanım düzenidir.

    {
      "search": "walking distance theaters",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Seattle'"
    }
    
    
  • Her biri kendi filtre ölçütlerine sahip "veya" ile ayrılmış bileşik sorgular (örneğin, 'köpek' içinde 'beagles' veya 'cat' içinde 'siyam'). ile or birleştirilen ifadeler, yanıtta geri gönderilen her ifadeyle eşleşen belgelerin birleşimiyle ayrı ayrı değerlendirilir. Bu kullanım düzeni işlevi aracılığıyla search.ismatchscoring elde edilir. Ayrıca, puanlanmayan sürümünü search.ismatchde kullanabilirsiniz.

    # Match on hostels rated higher than 4 OR 5-star motels.
    $filter=search.ismatchscoring('hostel') and Rating ge 4 or search.ismatchscoring('motel') and Rating eq 5
    
    # Match on 'luxury' or 'high-end' in the description field OR on category exactly equal to 'Luxury'.
    $filter=search.ismatchscoring('luxury | high-end', 'Description') or Category eq 'Luxury'&$count=true
    

    aracılığıyla tam metin aramasını search.ismatchscoringoryerine kullanan and filtrelerle birleştirmek de mümkündür, ancak bu işlev olarak ve parametrelerinin bir arama isteğinde kullanılmasıyla search$filter eşdeğerdir. Örneğin, aşağıdaki iki sorgu aynı sonucu üretir:

    $filter=search.ismatchscoring('pool') and Rating ge 4
    
    search=pool&$filter=Rating ge 4
    

Filtreleme için alan gereksinimleri

REST API'de, basit alanlar için filtrelenebilir varsayılan olarak açıktır . Filtrelenebilir alanlar dizin boyutunu artırır; Filtrede kullanmayı planlamadığınız alanlar için ayarlamayı "filterable": false unutmayın. Alan tanımları ayarları hakkında daha fazla bilgi için bkz . Dizin Oluşturma.

.NET SDK'sında filtrelenebilir varsayılan olarak kapalıdır. İlgili SearchField nesnesinin trueIsFilterable özelliğini olarak ayarlayarak bir alanı filtrelenebilir hale getirebilirsiniz. Sonraki örnekte özniteliği, dizin tanımıyla Rating eşleyen bir model sınıfının özelliğinde ayarlanır.

[SearchField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public double? Rating { get; set; }

Var olan bir alanı filtrelenebilir hale getirme

Varolan alanları filtrelenebilir hale getirmek için değiştiremezsiniz. Bunun yerine yeni bir alan eklemeniz veya dizini yeniden oluşturmanız gerekir. Dizini yeniden oluşturma veya alanları yeniden doldurma hakkında daha fazla bilgi için bkz . Azure AI Search dizinini yeniden oluşturma.

Metin filtresi temelleri

Metin filtreleri, dize alanlarını filtrede sağladığınız değişmez değer dizeleriyle eşleştirdi: $filter=Category eq 'Resort and Spa'

Tam metin aramanın aksine, metin filtreleri için sözcük temelli analiz veya sözcük kesme yoktur, bu nedenle karşılaştırmalar yalnızca tam eşleşmeler içindir. Örneğin, f alanının "güneşli gün" içerdiğini, $filter=f eq 'sunny' eşleşmediği, ancak $filter=f eq 'sunny day' eşleşeceğini varsayalım.

Metin dizeleri büyük/küçük harfe duyarlıdır, yani metin filtreleri varsayılan olarak büyük/küçük harfe duyarlıdır. Örneğin, $filter=f eq 'Sunny day' "güneşli gün" bulunamaz. Ancak, filtrelemenin büyük/küçük harfe duyarlı olmasını sağlamak için normalleştirici kullanabilirsiniz.

Metin üzerinde filtreleme yaklaşımları

Yaklaşım Açıklama ne zaman kullanılmalı
search.in Bir alanı sınırlandırılmış dize listesiyle eşleştiren bir işlev. Güvenlik filtreleri ve birçok ham metin değerinin bir dize alanıyla eşleşmesi gereken filtreler için önerilir. search.in işlevi hız için tasarlanmıştır ve ve orkullanarak eq alanı her dizeyle açıkça karşılaştırmaktan çok daha hızlıdır.
search.ismatch Aynı filtre ifadesinde tam metin arama işlemlerini kesinlikle Boole filtre işlemleriyle karıştırmanıza olanak tanıyan bir işlev. Tek bir istekte birden çok arama filtresi bileşimi istediğinizde search.ismatch (veya puanlama eşdeğeri search.ismatchscoring) kullanın. Daha büyük bir dize içindeki kısmi bir dizeye filtre uygulamak üzere bir içerir filtresi için de kullanabilirsiniz.
$filter=field operator string Alanlar, işleçler ve değerlerden oluşan kullanıcı tanımlı ifade. Bir dize alanı ile dize değeri arasındaki tam eşleşmeleri bulmak istediğinizde bunu kullanın.

Sayısal filtre temelleri

Sayısal alanlar tam metin araması bağlamında değildir searchable . Yalnızca dizeler tam metin aramasına tabidir. Örneğin, arama terimi olarak 99,99 girerseniz, 99,99 ABD doları fiyatlanan öğeleri geri alamazsınız. Bunun yerine, belgenin dize alanlarında 99 numaralı öğeleri görürsünüz. Bu nedenle, sayısal verileriniz varsa, bunları aralıklar, modeller, gruplar vb. gibi filtreler için kullanacağınız varsayımı vardır.

Sayısal alanlar (fiyat, boyut, SKU, Kimlik) içeren belgeler, alan olarak işaretlenirse retrievablearama sonuçlarında bu değerleri sağlar. Burada, tam metin aramasının sayısal alan türleri için geçerli olmadığı belirtildi.

Sonraki adımlar

İlk olarak, $filter parametreleriyle sorgu göndermek için portalda Arama gezgini'ni deneyin. Real-estate-sample dizini, arama çubuğuna yapıştırdığınızda aşağıdaki filtrelenmiş sorgular için ilginç sonuçlar sağlar:

# Geo-filter returning documents within 5 kilometers of Redmond, Washington state
# Use $count=true to get a number of hits returned by the query
# Use $select to trim results, showing values for named fields only
# Use search=* for an empty query string. The filter is the sole input

search=*&$count=true&$select=description,city,postCode&$filter=geo.distance(location,geography'POINT(-122.121513 47.673988)') le 5

# Numeric filters use comparison like greater than (gt), less than (lt), not equal (ne)
# Include "and" to filter on multiple fields (baths and bed)
# Full text search is on John Leclerc, matching on John or Leclerc

search=John Leclerc&$count=true&$select=source,city,postCode,baths,beds&$filter=baths gt 3 and beds gt 4

# Text filters can also use comparison operators
# Wrap text in single or double quotes and use the correct case
# Full text search is on John Leclerc, matching on John or Leclerc

search=John Leclerc&$count=true&$select=source,city,postCode,baths,beds&$filter=city gt 'Seattle'

Daha fazla örnekle çalışmak için bkz . OData Filtre İfadesi Söz Dizimi > Örnekleri.

Ayrıca bkz.