Filtry w zapytaniach tekstowych

Filtr zawiera kryteria oparte na wartości dla dołączania lub wykluczania zawartości przed wykonaniem zapytania. Na przykład dołączanie lub wykluczanie dokumentów na podstawie dat, lokalizacji lub języka. Filtry są określane w poszczególnych polach. Definicja pola musi być przypisywana jako "filtrowalna", jeśli chcesz użyć jej w wyrażeniach filtru.

Filtr jest określany przy użyciu składni wyrażenia filtru OData. W przeciwieństwie do wyszukiwania pełnotekstowego filtr kończy się powodzeniem tylko wtedy, gdy dopasowanie jest dokładne.

Kiedy należy użyć filtru

Filtry są podstawowe dla kilku środowisk wyszukiwania, w tym "znajdź w pobliżu mnie" wyszukiwanie geoprzestrzenne, nawigację aspektową i filtry zabezpieczeń, które pokazują tylko te dokumenty, które użytkownik może zobaczyć. Jeśli wdrożysz jedną z tych środowisk, wymagany jest filtr. Jest to filtr dołączony do zapytania wyszukiwania, który udostępnia współrzędne geolokalizacji, kategorię aspektu wybraną przez użytkownika lub identyfikator zabezpieczeń osoby żądającej.

Typowe scenariusze obejmują:

  • Fragmentowanie wyników wyszukiwania na podstawie zawartości w indeksie. Biorąc pod uwagę schemat z lokalizacją hotelu, kategoriami i udogodnieniami, można utworzyć filtr, który będzie jawnie zgodny z kryteriami (w Seattle, na wodzie, z widokiem).

  • Implementacja środowiska wyszukiwania zawiera zależność filtru:

    • Nawigacja aspektowa używa filtru, aby przekazać kategorię aspektów wybraną przez użytkownika.
    • Wyszukiwanie geoprzestrzenne używa filtru do przekazywania współrzędnych bieżącej lokalizacji w aplikacjach i funkcjach "znajdź blisko mnie", które pasują do obszaru lub odległości.
    • Filtry zabezpieczeń przekazują identyfikatory zabezpieczeń jako kryteria filtru, gdzie dopasowanie w indeksie służy jako serwer proxy praw dostępu do dokumentu.
  • Wykonaj "wyszukiwanie liczb". Pola liczbowe można pobierać i mogą pojawiać się w wynikach wyszukiwania, ale nie są one przeszukiwalne (z zastrzeżeniem wyszukiwania pełnotekstowego). Jeśli potrzebujesz kryteriów wyboru na podstawie danych liczbowych, użyj filtru.

Jak są wykonywane filtry

W czasie zapytania analizator filtrów akceptuje kryteria jako dane wejściowe, konwertuje wyrażenie na niepodzielne wyrażenia logiczne reprezentowane jako drzewo, a następnie ocenia drzewo filtrów nad polami filtrowalnymi w indeksie.

Filtrowanie odbywa się w połączeniu z wyszukiwaniem, kwalifikując dokumenty do uwzględnienia w przetwarzaniu podrzędnym na potrzeby pobierania dokumentów i oceniania istotności. Po połączeniu z ciągiem wyszukiwania filtr skutecznie zmniejsza zestaw odwołań kolejnej operacji wyszukiwania. W przypadku użycia samego (na przykład gdy ciąg zapytania jest pusty, gdzie search=*), kryteria filtrowania są jedynymi danymi wejściowymi.

Definiowanie filtrów

Filtry to wyrażenia OData, wyrażone w składni filtru obsługiwanej przez usługę Azure AI Search.

Można określić jeden filtr dla każdej operacji wyszukiwania , ale sam filtr może zawierać wiele pól, wiele kryteriów, a jeśli używasz ismatch funkcji, wiele wyrażeń wyszukiwania pełnotekstowego. W wyrażeniu filtru wieloczęściowego można określić predykaty w dowolnej kolejności (z zastrzeżeniem reguł pierwszeństwa operatora). Jeśli spróbujesz zmienić kolejność predykatów w określonej sekwencji, nie ma zauważalnego wzrostu wydajności.

Jednym z limitów wyrażenia filtru jest maksymalny limit rozmiaru żądania. Całe żądanie, włącznie z filtrem, może wynosić maksymalnie 16 MB dla żądania POST lub 8 KB dla żądania GET. Istnieje również limit liczby klauzul w wyrażeniu filtru. Dobrą zasadą jest to, że jeśli masz setki klauzul, istnieje ryzyko wystąpienia limitu. Zalecamy zaprojektowanie aplikacji w taki sposób, aby nie generowała filtrów niezwiązanego rozmiaru.

W poniższych przykładach przedstawiono prototypowe definicje filtrów w kilku interfejsach API.

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" }
};

Wzorce filtrów

W poniższych przykładach przedstawiono kilka wzorców użycia dla scenariuszy filtrowania. Aby uzyskać więcej pomysłów, zobacz Przykłady składni > wyrażeń OData.

  • Autonomiczne $filter, bez ciągu zapytania, przydatne, gdy wyrażenie filtru może w pełni kwalifikować interesujące dokumenty. Bez ciągu zapytania nie ma żadnych analiz leksykalnych ani językowych, bez oceniania i bez klasyfikacji. Zwróć uwagę, że ciąg wyszukiwania jest tylko gwiazdką, co oznacza "dopasowanie wszystkich dokumentów".

    {
      "search": "*",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Honolulu"
    }
    
  • Kombinacja ciągu zapytania i $filter, gdzie filtr tworzy podzbiór, a ciąg zapytania zawiera terminy wejściowe dla wyszukiwania pełnotekstowego w filtrowanych podzestawach. Dodanie terminów (teatry w odległości spaceru) wprowadza wyniki wyszukiwania w wynikach, gdzie dokumenty, które najlepiej pasują do terminów, są oceniane wyżej. Używanie filtru z ciągiem zapytania jest najbardziej typowym wzorcem użycia.

    {
      "search": "walking distance theaters",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Seattle'"
    }
    
    
  • Zapytania złożone oddzielone znakami "lub" z własnymi kryteriami filtrowania (na przykład "beagles" w "dog" lub "sjamese" w "cat"). Wyrażenia połączone z wyrażeniem or są oceniane indywidualnie, a połączenie dokumentów pasujących do każdego wyrażenia wysyłanego z powrotem w odpowiedzi. Ten wzorzec użycia jest osiągany za pośrednictwem search.ismatchscoring funkcji. Można również użyć wersji niekorzysty, search.ismatch.

    # 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
    

    Istnieje również możliwość połączenia wyszukiwania pełnotekstowego za pomocą search.ismatchscoring filtrów and zamiast or, ale jest to funkcjonalnie równoważne użyciu search parametrów i $filter w żądaniu wyszukiwania. Na przykład następujące dwa zapytania generują ten sam wynik:

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

Wymagania dotyczące pól dotyczące filtrowania

W interfejsie API REST filtrowanie jest domyślnie włączone dla prostych pól. Pola z możliwością filtrowania zwiększają rozmiar indeksu; Pamiętaj, aby ustawić "filterable": false pola, których nie planujesz faktycznie używać w filtrze. Aby uzyskać więcej informacji na temat ustawień definicji pól, zobacz Create Index (Tworzenie indeksu).

W zestawie .NET SDK filtrowanie jest domyślnie wyłączone . Pole można filtrować, ustawiając właściwość IsFilterable odpowiedniego obiektu SearchField na truewartość . W następnym przykładzie atrybut jest ustawiany na Rating właściwość klasy modelu, która mapuje na definicję indeksu.

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

Tworzenie istniejącego pola do filtrowania

Nie można modyfikować istniejących pól, aby były filtrowalne. Zamiast tego należy dodać nowe pole lub ponownie skompilować indeks. Aby uzyskać więcej informacji na temat odbudowywania indeksu lub ponownego wypełniania pól, zobacz Jak ponownie skompilować indeks usługi Azure AI Search.

Podstawy filtru tekstu

Filtry tekstowe pasują do pól ciągu względem ciągów literałów, które są podane w filtrze: $filter=Category eq 'Resort and Spa'

W przeciwieństwie do wyszukiwania pełnotekstowego nie ma analizy leksykalnej ani podziału wyrazów dla filtrów tekstu, dlatego porównania są przeznaczone tylko dla dokładnych dopasowań. Załóżmy na przykład, że pole f zawiera "słoneczny dzień", $filter=f eq 'sunny' nie jest zgodne, ale $filter=f eq 'sunny day' będzie.

W ciągach tekstowych jest rozróżniana wielkość liter, co oznacza, że filtry tekstowe są domyślnie uwzględniane wielkości liter. Na przykład $filter=f eq 'Sunny day' nie znajdzie "słoneczny dzień". Można jednak użyć normalizatora, aby uczynić go tak, aby filtrowanie nie było uwzględniane wielkości liter.

Metody filtrowania tekstu

Metoda opis Kiedy używać
search.in Funkcja zgodna z polem z rozdzielaną listą ciągów. Zalecane w przypadku filtrów zabezpieczeń i filtrów , w których wiele nieprzetworzonych wartości tekstowych musi być dopasowanych do pola ciągu. Funkcja search.in została zaprojektowana pod kątem szybkości i jest znacznie szybsza niż jawne porównywanie pola z każdym ciągiem przy użyciu metod eq i or.
search.ismatch Funkcja, która umożliwia mieszanie operacji wyszukiwania pełnotekstowego za pomocą ściśle logicznych operacji filtrowania w tym samym wyrażeniu filtru. Użyj ciągu search.ismatch (lub jego odpowiednika oceniania search.ismatchscoring), jeśli chcesz, aby wiele kombinacji filtru wyszukiwania w jednym żądaniu. Można go również użyć dla filtru contains , aby filtrować według częściowego ciągu w większym ciągu.
$filter=field operator string Wyrażenie zdefiniowane przez użytkownika składające się z pól, operatorów i wartości. Użyj tej funkcji, gdy chcesz znaleźć dokładne dopasowania między polem ciągu a wartością ciągu.

Podstawy filtru liczbowego

Pola liczbowe nie searchable są kontekstem wyszukiwania pełnotekstowego. Tylko ciągi podlegają wyszukiwaniu pełnotekstowemu. Jeśli na przykład wprowadzisz wartość 99,99 jako termin wyszukiwania, nie otrzymasz z powrotem przedmiotów wycenionych na 99,99 USD. Zamiast tego zobaczysz elementy, które mają liczbę 99 w polach ciągu dokumentu. W związku z tym, jeśli masz dane liczbowe, założeniem jest, że użyjesz ich do filtrów, w tym zakresów, aspektów, grup itd.

Dokumenty zawierające pola liczbowe (cena, rozmiar, jednostka SKU, identyfikator) udostępniają te wartości w wynikach wyszukiwania, jeśli pole jest oznaczone .retrievable Chodzi o to, że samo wyszukiwanie pełnotekstowe nie ma zastosowania do typów pól liczbowych.

Następne kroki

Najpierw spróbuj użyć Eksploratora wyszukiwania w portalu, aby przesłać zapytania z parametrami $filter . Indeks przykładu nieruchomości zawiera interesujące wyniki dla następujących filtrowanych zapytań podczas wklejania ich na pasku wyszukiwania:

# 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'

Aby pracować z więcej przykładów, zobacz Przykłady składni wyrażeń > filtru OData.

Zobacz też