Filter in der kognitiven Azure-Suche

Ein Filter liefert wertbasierte Kriterien für die Auswahl von Dokumenten, die in den Suchergebnissen enthalten sein sollen. Bei einem Filter kann es sich um einen einzelnen Wert oder einen OData-Filterausdruck handeln. Im Gegensatz zur Volltextsuche ist ein Filter nur erfolgreich, wenn eine genaue Übereinstimmung vorliegt.

Filter werden für einzelne Felder angegeben. Eine Felddefinition muss als „filterbar“ gekennzeichnet sein, wenn Sie sie in Filterausdrücken verwenden möchten.

Einsatzmöglichkeiten von Filtern

Filter sind die Grundlage mehrerer Suchoberflächen, darunter „In meiner Nähe finden“, Geosuche, Facettennavigation und Sicherheitsfilter, die nur die Dokumente anzeigen, die ein Benutzer sehen darf. Wenn Sie eine dieser Oberflächen implementieren, ist ein Filter erforderlich. Es ist der an die Suchabfrage angefügte Filter, der die Geolocationkoordinaten, die vom Benutzer ausgewählte Facettenkategorie oder die Sicherheits-ID des Anforderers angibt.

Zu den typischen Szenarien zählen:

  • Sie teilen die Suchergebnisse basierend auf dem Inhalt im Index in Slices auf. Bei einem Schema mit dem Standort, den Kategorien und der Ausstattung des Hotels können Sie einen Filter erstellen, der explizit den Kriterien entspricht (in Seattle, auf dem Wasser, mit Ausblick).

  • Implementieren Sie eine Suchoberfläche mit einer Filterabhängigkeit:

    • Facettennavigation verwendet einen Filter, um die vom Benutzer gewählte Facettenkategorie zurückzugeben.
    • Bei der räumlichen Suche wird ein Filter verwendet, um Koordinaten des aktuellen Standorts in „In meiner Nähe suchen“-Apps und -Funktionen zu übergeben, die innerhalb eines Bereichs oder nach Entfernung übereinstimmen.
    • Sicherheitsfilter übergeben Sicherheits-IDs als Filterkriterien, wobei eine Übereinstimmung im Index als Proxy für Zugriffsrechte für das Dokument dient.
  • Führen Sie eine „Zahlensuche“ aus. Numerische Felder sind abrufbar und können in Suchergebnissen angezeigt werden, sie sind aber (bei einer Volltextsuche) nicht einzeln durchsuchbar. Wenn Sie Auswahlkriterien basierend auf numerischen Daten benötigen, verwenden Sie einen Filter.

Ausführen von Filtern

Zur Abfragezeit akzeptiert ein Filterparser Kriterien als Eingabe, wandelt den Ausdruck in unteilbare boolesche Ausdrücke um, die als Struktur dargestellt werden, und wertet dann die Filterstruktur über filterbare Felder in einem Index aus.

Die Filterung erfolgt zusammen mit Suche und bestimmt, welche Dokumente für den Dokumentabruf und die Relevanzbewertung in die nachgelagerte Verarbeitung einbezogen werden sollen. In Kombination mit einem Suchbegriff reduziert der Filter wirkungsvoll die Abrufmenge des nachfolgenden Suchvorgangs. Bei alleiniger Verwendung (z. B. wenn die Abfragezeichenfolge bei search=* leer ist) ist das Filterkriterium die einzige Eingabe.

Definieren von Filtern

Filter sind OData-Ausdrücke, die in der von Cognitive Search unterstützten Filtersyntax formuliert sind.

Sie können für jeden Suchvorgang einen Filter angeben. Doch der Filter selbst kann mehrere Felder, mehrere Kriterien und, wenn Sie eine ismatch-Funktion verwenden, mehrere Volltextsuchausdrücke enthalten. Bei einem mehrteiligen Filterausdruck können Sie Prädikate in beliebiger Reihenfolge angeben (gemäß den Regeln der Rangfolge von Operatoren). Es ergibt sich kein nennenswerter Leistungszuwachs, wenn Sie versuchen, Prädikate in einer bestimmten Reihenfolge neu anzuordnen.

Einer der Grenzwerte für einen Filterausdruck ist die maximale Größe der Anforderung. Die gesamte Anforderung kann einschließlich Filter eine maximale Größe von 16 MB für POST- bzw. 8 KB für GET-Vorgänge haben. Die Anzahl der Klauseln in Ihrem Filterausdruck ist ebenfalls begrenzt. Gut merken lässt sich, dass Sie bei Hunderten von Klauseln Gefahr laufen, an den Grenzwert zu erreichen. Wir empfehlen Ihnen, Ihre Anwendung so zu entwerfen, dass sie keine Filter unbegrenzter Größe erzeugt.

Die folgenden Beispiele veranschaulichen prototypische Filterdefinitionen in mehrere APIs.

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"
}
    parameters =
        new SearchParameters()
        {
            Filter = "Rooms/any(room: room/BaseRate lt 150.0)",
            Select = new[] { "HotelId", "HotelName", "Rooms/Description" ,"Rooms/BaseRate"}
        };

    var results = searchIndexClient.Documents.Search("*", parameters);

Filtermuster

Die folgenden Beispiele veranschaulichen einige Verwendungsmuster für Filterszenarios. Weitere Vorschläge finden Sie unter OData-Ausdruckssyntax > Beispiele.

  • Eigenständige $filter-Filter ohne Abfragezeichenfolge; nützlich, wenn der Filterausdruck Dokumente von Interesse vollständig qualifizieren kann. Ohne Abfragezeichenfolge gibt es keine lexikalische oder linguistische Analyse, Bewertung und Rangfolge. Beachten Sie, dass die Suchzeichenfolge nur ein Sternchen ist, und alle Dokumente abgeglichen werden.

    {
      "search": "*",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Honolulu"
    }
    
  • Kombination aus Abfragezeichenfolge und $filter, wobei der Filter die Teilmenge erstellt und die Abfragezeichenfolge die Begriffseingaben für die Volltextsuche über die gefilterte Teilmenge liefert. Das Hinzufügen von Begriffen („Theater in Gehweite“) führt zu Suchbewertungen in den Ergebnissen, bei denen Dokumente, die am besten zu den Begriffen passen, höher eingestuft werden. Das Verwenden eines Filters mit einer Abfragezeichenfolge ist das verbreitetste Verwendungsmuster.

    {
      "search": "walking distance theaters",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Seattle'"
    }
    
    
  • Zusammengesetzte Abfragen, getrennt durch "or", jede mit eigenen Filterkriterien (z.B. 'beagles' in' dog' oder' siamese' in' cat'). Ausdrücke in Kombination mit or werden einzeln ausgewertet. Dabei stimmt die Vereinigung der Dokumente mit jedem Ausdruck überein, der in der Antwort zurückgesendet wird. Dieses Nutzungsmuster erfolgt über die search.ismatchscoring-Funktion. Sie können auch die nicht bewertende Version (search.ismatch) verwenden.

    # 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
    

    Es ist auch möglich, die Volltextsuche über search.ismatchscoring mit den Filtern and anstelle von or zu kombinieren. Diese Funktion entspricht der Suche mit den Parametern search und $filter in einer Suchanforderung. Die folgenden beiden Abfragen erzielen beispielsweise das gleiche Ergebnis:

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

Feldanforderungen für das Filtern

In der REST-API ist „filterable“ (filterbar) für einfache Felder standardmäßig aktiviert. Filterbare Felder erhöhen die Indexgröße. Stellen Sie sicher, dass Sie "filterable": false für Felder festlegen, die Sie nicht in einem Filter verwenden möchten. Weitere Informationen zu Einstellungen für Felddefinitionen finden Sie unter Erstellen eines Indexes.

Im .NET SDK ist die Eigenschaft „filterable“ standardmäßig deaktiviert. Sie können Felder filterbar machen, indem Sie die IsFilterable-Eigenschaft des entsprechenden SearchField-Objekts auf true festlegen. Im folgenden Beispiel ist das Attribut auf die BaseRate-Eigenschaft einer Modellklasse festgelegt, die der Indexdefinition zugeordnet wird.

[IsFilterable, IsSortable, IsFacetable]
public double? BaseRate { get; set; }

Aktivieren der Filterbarkeit für vorhandene Felder

Sie können vorhandene Felder nicht so ändern, dass sie filterbar sind. Sie müssen stattdessen ein neues Feld hinzufügen oder den Index neu erstellen. Weitere Informationen zur Neuerstellung eines Index oder der Wiederauffüllung von Feldern finden Sie unter Neuerstellen eines Index für die kognitive Azure-Suche.

Grundlegendes zu Textfiltern

Textfilter entsprechen Zeichenfolgenfeldern mit Literalzeichenfolgen, die Sie im Filter angeben: $filter=Category eq 'Resort and Spa'

Im Gegensatz zur Volltextsuche erfolgt bei Textfiltern keine lexikalische Analyse oder Worttrennung, sodass Vergleiche nur auf exakte Übereinstimmungen abzielen. Nehmen wir beispielsweise an, dass das Feld f „sunny day“ enthält. Dann stimmt zwar $filter=f eq 'Sunny' nicht überein, $filter=f eq 'sunny day' allerdings schon.

Bei Textzeichenfolgen wird Groß-/Kleinschreibung berücksichtigt. Es gibt keine Kleinschreibung großgeschriebener Wörter. $filter=f eq 'Sunny day' findet deshalb „sunny day“ nicht.

Ansätze zum Filtern von Text

Vorgehensweise BESCHREIBUNG Verwendung
search.in Eine Funktion, bei der ein Feld mit einer durch Trennzeichen getrennte Liste von Zeichenfolgen entspricht. Dies wird für Sicherheitsfilter und alle anderen Filter empfohlen, in denen viele unformatierte Textwerte mit einem Zeichenfolgenfeld verglichen werden. Die Funktion search.in ist auf Geschwindigkeit ausgelegt und viel schneller als das explizite Vergleichen des Felds mit jeder Zeichenfolge mithilfe von eq und or.
search.ismatch Eine Funktion, die es erlaubt, Volltextsuchvorgänge mit strikt booleschen Filteroperationen im selben Filterausdruck zu kombinieren. Verwenden Sie search.ismatch (oder das Äquivalent search.ismatchscoring), wenn Sie in einer Anforderung mehrere Suchfilterkombinationen möchten. Sie können sie auch für den Filter enthält verwenden, um auf eine Teilzeichenfolge innerhalb einer größeren Zeichenfolge zu filtern.
$filter=field operator string Ein benutzerdefinierter Ausdruck bestehend aus Feldern, Operatoren und Werten. Verwenden Sie diesen Ausdruck, wenn Sie genaue Übereinstimmungen zwischen Zeichenfolgefeldern und einem Zeichenfolgenwert finden möchten.

Grundlegendes zu numerischen Filtern

Numerische Felder sind im Kontext der Volltextsuche nicht searchable. Nur Zeichenfolgen werden einer Volltextsuche unterzogen. Wenn Sie z.B. 99,99 als Suchbegriff eingeben, werden keine Artikel mit dem Preis 99,99 USD zurückgegeben. Stattdessen sehen Sie Elemente, die den Wert 99 in Zeichenfolgenfeldern des Dokuments enthalten. Wenn Sie also numerische Daten haben, gilt die Annahme, dass Sie sie für Filter verwenden, einschließlich Bereiche, Facetten, Gruppen usw.

Dokumente, die numerische Felder enthalten (Preis, Größe, SKU, ID), geben diese Werte in Suchergebnissen zurück, wenn das Feld mit retrievable markiert ist. Der Punkt hier ist, dass die Volltextsuche selbst nicht auf numerische Feldtypen anwendbar ist.

Nächste Schritte

Probieren Sie als Erstes den Suchexplorer im Portal aus, um Abfragen mit $filter-Parametern zu übermitteln. Der Index von „real-estate-sample“ liefert interessante Ergebnisse für die folgenden gefilterten Abfragen, wenn Sie diese in die Suchleiste einfügen:

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

Weitere Beispiele finden Sie unter OData-Filterausdruckssyntax > Beispiele.

Weitere Informationen