Share via


Filters in tekstquery's

Een filter biedt criteria op basis van waarden voor het opnemen of uitsluiten van inhoud voordat query's worden uitgevoerd. Bijvoorbeeld: documenten opnemen of uitsluiten op basis van datums, locaties of taal. Filters worden opgegeven voor afzonderlijke velden. Een velddefinitie moet worden toegeschreven aan 'filterbaar' als u deze wilt gebruiken in filterexpressies.

Er wordt een filter opgegeven met de syntaxis van de OData-filterexpressie. In tegenstelling tot zoeken in volledige tekst slaagt een filter alleen als de overeenkomst exact is.

Wanneer gebruikt u een filter?

Filters zijn fundamenteel voor verschillende zoekervaringen, waaronder georuimtelijk zoeken in de buurt van mij, facetnavigatie en beveiligingsfilters die alleen die documenten weergeven die een gebruiker mag zien. Als u een van deze ervaringen implementeert, is een filter vereist. Het is het filter dat is gekoppeld aan de zoekquery die de geolocatiecoördinaten, de facetcategorie bevat die door de gebruiker is geselecteerd of de beveiligings-id van de aanvrager.

Veelvoorkomende scenario's:

  • Segmenteer zoekresultaten op basis van inhoud in de index. Gezien een schema met hotellocatie, categorieën en voorzieningen kunt u een filter maken dat expliciet overeenkomt met criteria (in Seattle, op het water, met uitzicht).

  • Implementeer een zoekervaring met een filterafhankelijkheid:

    • Facetnavigatie maakt gebruik van een filter om de facetcategorie door te geven die door de gebruiker is geselecteerd.
    • Georuimtelijke zoekopdracht maakt gebruik van een filter om coördinaten van de huidige locatie door te geven in apps en functies in de buurt van een gebied of op afstand.
    • Beveiligingsfilters geven beveiligings-id's door als filtercriteria, waarbij een overeenkomst in de index fungeert als proxy voor toegangsrechten voor het document.
  • Een "getallen zoeken". Numerieke velden kunnen worden opgehaald en kunnen in zoekresultaten worden weergegeven, maar ze kunnen niet afzonderlijk worden doorzocht (onderhevig aan zoekopdrachten in volledige tekst). Als u selectiecriteria nodig hebt op basis van numerieke gegevens, gebruikt u een filter.

Hoe filters worden uitgevoerd

Tijdens query's accepteert een filterparser criteria als invoer, converteert de expressie naar atomische Boole-expressies die worden weergegeven als een boomstructuur en evalueert vervolgens de filterstructuur op filterbare velden in een index.

Filteren vindt plaats in combinatie met zoeken, waarbij wordt gekwalificeerd welke documenten moeten worden opgenomen in downstreamverwerking voor het ophalen van documenten en het scoren van relevantie. Wanneer het filter is gekoppeld aan een zoekreeks, vermindert het filter de terugroepset van de volgende zoekbewerking. Wanneer u alleen wordt gebruikt (bijvoorbeeld wanneer de querytekenreeks leeg is waar search=*), is de filtercriteria de enige invoer.

Filters definiëren

Filters zijn OData-expressies, die worden geformuleerd in de filtersyntaxis die wordt ondersteund door Azure AI Search.

U kunt één filter opgeven voor elke zoekbewerking , maar het filter zelf kan meerdere velden, meerdere criteria bevatten en als u een ismatch functie gebruikt, meerdere zoekexpressies in volledige tekst. In een filterexpressie met meerdere onderdelen kunt u predicaten opgeven in elke volgorde (afhankelijk van de regels van de operatorprioriteit). Er is geen merkbare winst in prestaties als u probeert predicaten in een bepaalde volgorde opnieuw te rangschikken.

Een van de limieten voor een filterexpressie is de maximale groottelimiet van de aanvraag. De volledige aanvraag, inclusief het filter, kan maximaal 16 MB voor POST of 8 kB voor GET zijn. Er is ook een limiet voor het aantal componenten in uw filterexpressie. Een goede vuistregel is dat als u honderden componenten hebt, u het risico loopt om de limiet te overschrijden. Het is raadzaam om uw toepassing zodanig te ontwerpen dat er geen filters van niet-gebonden grootte worden gegenereerd.

De volgende voorbeelden vertegenwoordigen prototypische filterdefinities in verschillende API's.

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

Filterpatronen

In de volgende voorbeelden ziet u verschillende gebruikspatronen voor filterscenario's. Zie Voorbeelden van OData-expressies > voor meer ideeën.

  • Zelfstandige $filter, zonder een querytekenreeks, handig wanneer de filterexpressie in staat is om volledig in aanmerking te komen voor documenten die van belang zijn. Zonder een querytekenreeks is er geen lexicale of taalkundige analyse, geen score en geen classificatie. U ziet dat de zoektekenreeks slechts een sterretje is, wat betekent dat alle documenten overeenkomen.

    {
      "search": "*",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Honolulu"
    }
    
  • Combinatie van queryreeks en $filter, waarbij het filter de subset maakt en de queryreeks de terminvoer levert voor zoeken in volledige tekst via de gefilterde subset. De toevoeging van termen (loopafstand theaters) introduceert zoekscores in de resultaten, waarbij documenten die het beste overeenkomen met de termen hoger worden gerangschikt. Het gebruik van een filter met een querytekenreeks is het meest voorkomende gebruikspatroon.

    {
      "search": "walking distance theaters",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Seattle'"
    }
    
    
  • Samengestelde query's, gescheiden door 'or', elk met eigen filtercriteria (bijvoorbeeld 'beagles' in 'hond' of 'siamese' in 'kat'). Expressies gecombineerd met or worden afzonderlijk geëvalueerd, waarbij de samenvoeging van documenten die overeenkomen met elke expressie die in het antwoord wordt teruggestuurd. Dit gebruikspatroon wordt bereikt via de search.ismatchscoring functie. U kunt ook de niet-scoringsversie gebruiken, 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
    

    Het is ook mogelijk om zoeken in volledige tekst te search.ismatchscoring combineren met filters and in plaats van or, maar dit is functioneel gelijk aan het gebruik van de search en $filter parameters in een zoekaanvraag. De volgende twee query's produceren bijvoorbeeld hetzelfde resultaat:

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

Veldvereisten voor filteren

In de REST API is filterbaar standaard ingeschakeld voor eenvoudige velden. Filterbare velden vergroten de indexgrootte; Zorg ervoor dat "filterable": false u instelt voor velden die u niet daadwerkelijk wilt gebruiken in een filter. Zie Index maken voor meer informatie over instellingen voor velddefinities.

In de .NET SDK is het filterbaar standaard uitgeschakeld . U kunt een veld filteren door de eigenschap IsFilterable van het bijbehorende SearchField-object in te stellen op true. In het volgende voorbeeld wordt het kenmerk ingesteld op de Rating eigenschap van een modelklasse die is toegewezen aan de indexdefinitie.

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

Een bestaand veld filterbaar maken

U kunt bestaande velden niet wijzigen zodat ze kunnen worden gefilterd. In plaats daarvan moet u een nieuw veld toevoegen of de index opnieuw opbouwen. Zie Een Azure AI Search-index herbouwen voor meer informatie over het opnieuw samenstellen van een index of het opnieuw vullen van velden.

Grondbeginselen van tekstfilters

Tekstfilters komen overeen met tekenreeksvelden voor letterlijke tekenreeksen die u in het filter opgeeft: $filter=Category eq 'Resort and Spa'

In tegenstelling tot zoeken in volledige tekst is er geen lexicale analyse of woordbreking voor tekstfilters, dus vergelijkingen zijn alleen voor exacte overeenkomsten. Stel dat een veld f 'zonnige dag' bevat, komt niet overeen, $filter=f eq 'sunny' maar $filter=f eq 'sunny day' wel.

Tekenreeksen zijn hoofdlettergevoelig, wat betekent dat tekstfilters standaard hoofdlettergevoelig zijn. $filter=f eq 'Sunny day' Zo vindt u bijvoorbeeld geen 'zonnige dag'. U kunt echter een normalizer gebruiken om dit te maken, zodat filteren niet hoofdlettergevoelig is.

Methoden voor filteren op tekst

Methode Beschrijving Gebruik
search.in Een functie die overeenkomt met een veld met een gescheiden lijst met tekenreeksen. Aanbevolen voor beveiligingsfilters en voor filters waarbij veel onbewerkte tekstwaarden moeten worden vergeleken met een tekenreeksveld. De search.in functie is ontworpen voor snelheid en is veel sneller dan het expliciet vergelijken van het veld met elke tekenreeks met behulp van eq en or.
search.ismatch Een functie waarmee u zoekbewerkingen in volledige tekst kunt combineren met strikt Booleaanse filterbewerkingen in dezelfde filterexpressie. Gebruik search.ismatch (of het score-equivalent, search.ismatchscoring) als u meerdere combinaties van zoekfilters in één aanvraag wilt. U kunt het ook gebruiken voor een contains-filter om te filteren op een gedeeltelijke tekenreeks binnen een grotere tekenreeks.
$filter=field operator string Een door de gebruiker gedefinieerde expressie die bestaat uit velden, operators en waarden. Gebruik deze optie als u exacte overeenkomsten wilt zoeken tussen een tekenreeksveld en een tekenreekswaarde.

Grondbeginselen van numeriek filter

Numerieke velden bevinden zich niet searchable in de context van zoeken in volledige tekst. Alleen tekenreeksen zijn onderworpen aan zoekopdrachten in volledige tekst. Als u bijvoorbeeld 99,99 als zoekterm invoert, krijgt u geen items terug die zijn geprijsd op $ 99,99. In plaats daarvan ziet u items met het getal 99 in tekenreeksvelden van het document. Als u dus numerieke gegevens hebt, wordt ervan uitgegaan dat u deze gebruikt voor filters, waaronder bereiken, facetten, groepen enzovoort.

Documenten die numerieke velden (prijs, grootte, SKU, id) bevatten, geven deze waarden op in zoekresultaten als het veld is gemarkeerd retrievable. Het punt hier is dat zoeken in volledige tekst zelf niet van toepassing is op numerieke veldtypen.

Volgende stappen

Probeer eerst Search Explorer in de portal om query's te verzenden met $filter parameters. De vastgoedvoorbeeldindex biedt interessante resultaten voor de volgende gefilterde query's wanneer u ze in de zoekbalk plakt:

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

Zie Voorbeelden van OData-filterexpressies voor syntaxis > voor meer voorbeelden.

Zie ook