Filtry wyszukiwania słów kluczowych w Wyszukiwanie AI platformy Azure

Note

Wyszukiwanie AI platformy Azure jest dostępna za pośrednictwem portalu Azure, interfejsów API REST i Azure SDKs. Jest także podstawą Foundry IQ — zarządzanej warstwy wiedzy, która przekształca treści przedsiębiorstwa w bazy wiedzy wielokrotnego użytku z uwzględnieniem uprawnień dla agentów w portalu Microsoft Foundry.

Filtr zawiera kryteria oparte na wartości dla dołączania lub wykluczania zawartości przed wykonaniem zapytania dla wyszukiwania słów kluczowych albo przed lub po wykonaniu zapytania dla wyszukiwania wektorowego. Filtry są stosowane do pól niewektorowych, ale mogą być używane w wyszukiwaniu wektorowym, jeśli dokumenty zawierają pola niewektorowe. Na przykład w przypadku indeksów zorganizowanych wokół fragmentowanej zawartości może istnieć pola na poziomie nadrzędnym lub pola metadanych, które można filtrować.

W tym artykule wyjaśniono filtrowanie wyszukiwania słów kluczowych. Aby uzyskać więcej informacji na temat wektorów, zobacz Dodawanie filtru w zapytaniu wektorowym.

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

Kiedy należy użyć filtru

Filtry są kluczowe dla kilku doświadczeń wyszukiwania, w tym wyszukiwanie geoprzestrzenne "znajdź w pobliżu mnie," nawigację fasetową i filtry zabezpieczeń, które pozwalają na wyświetlenie tylko tych dokumentów, do których użytkownik ma dostęp. Jeśli wdrożysz jedno z tych doświadczeń, 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ń obiektu żądającego.

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

  • Zaimplementuj doświadczenie wyszukiwania, które zawiera zależność od 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ń używają identyfikatorów zabezpieczeń jako kryteriów filtru, gdzie dopasowanie w indeksie służy jako pośrednik do określania 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 za pomocą 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. Kiedy używane jest tylko (na przykład gdy ciąg zapytania jest pusty, gdzie search=*), kryteria filtrowania są jedynymi danymi wejściowymi.

Sposób definiowania filtrów

Filtry mają zastosowanie do zawartości tekstowej i liczbowej (niewektorowej) w polach, które są przypisywane jako filterable.

Filtry to wyrażenia OData, wyrażone w składni filtru obsługiwanej przez Wyszukiwanie AI platformy Azure.

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, ryzykujesz przekroczenie 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=2026-04-01
{
    "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 filtrowanej podzestawie. 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 słowem "lub", z własnymi kryteriami filtrowania (na przykład 'beagle' w 'pies' lub 'siamski' w 'kot'). Wyrażenia połączone z or są oceniane indywidualnie, a zbiory dokumentów pasujących do każdego z wyrażeń są łączone i wysyłane z powrotem w odpowiedzi. Ten wzorzec użycia jest osiągany za pośrednictwem search.ismatchscoring funkcji. Można również użyć wersji bez punktacji, 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 z filtrami używając and zamiast or, ale funkcjonalnie jest to równoważne z użyciem parametrów search 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 pól do 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 środowisku Azure SDKs, filtrowalność jest domyślnie wyłączona. Pole można filtrować, ustawiając właściwość IsFilterable odpowiedniego obiektu SearchField na określoną wartość true. W następnym przykładzie atrybut jest przypisywany do Rating właściwości 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 skompilować indeks Wyszukiwanie AI platformy Azure.

Podstawy filtru tekstu

Filtry tekstowe dopasowują pola ciągów znaków w stosunku do dosłownych ciągów znaków, które podajesz 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 pasuje, ale $filter=f eq 'sunny day' będzie.

Ciągi tekstowe są rozróżniane ze względu na wielkość liter, co oznacza, że filtry tekstowe rozróżniają wielkość liter domyślnie. Na przykład $filter=f eq 'Sunny day' nie znajdzie "słoneczny dzień". Można jednak użyć normalizatora, aby filtrowanie nie było czułe na wielkość liter.

Metody filtrowania tekstu

Podejście Opis Kiedy należy używać
search.in Funkcja dopasowująca pole do rozdzielonej listy ciągów znaków. Zalecane do filtrów zabezpieczeń oraz wszelkich filtrów, w których wiele surowych wartości tekstowych musi być dopasowanych do pola typu znakowego. 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 wraz z operacjami filtrowania opartymi wyłącznie na logice Boole'a w tym samym wyrażeniu filtru. Użyj search.ismatch (lub jego wersji z oceną, search.ismatchscoring), jeśli chcesz zastosować wiele kombinacji filtrów wyszukiwania w jednym żądaniu. Możesz także użyć filtru contains do filtrowania na podstawie 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 są uwzględniane w kontekście 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ć Wyszukiwarki Explorer w portalu Azure, aby przesłać zapytania z parametrami $filter. Indeks próbek nieruchomości zapewnia interesujące wyniki dla poniższych zapytań filtrowanych, gdy wkleisz je w 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 zapoznać się z większą liczbą przykładów, zobacz >.

Zobacz też