Filter i textfrågor

Ett filter innehåller värdebaserade kriterier för att inkludera eller exkludering av innehåll före frågekörning. Till exempel, inklusive eller exkludering av dokument baserat på datum, platser eller språk. Filter anges i enskilda fält. En fältdefinition måste tillskrivas som "filterbar" om du vill använda den i filteruttryck.

Ett filter anges med hjälp av syntax för OData-filteruttryck. Till skillnad från fulltextsökning lyckas ett filter bara om matchningen är exakt.

När du ska använda ett filter

Filter är grundläggande för flera sökupplevelser, inklusive geospatial sökning med "hitta nära mig", fasetterad navigering och säkerhetsfilter som endast visar de dokument som en användare kan se. Om du implementerar någon av dessa funktioner krävs ett filter. Det är filtret som är kopplat till sökfrågan som tillhandahåller geoplatskoordinaterna, den fasetteringskategori som valts av användaren eller säkerhets-ID:t för beställaren.

Vanliga scenarier är:

  • Segmentera sökresultat baserat på innehåll i indexet. Med tanke på ett schema med hotellplats, kategorier och bekvämligheter kan du skapa ett filter som uttryckligen matchar kriterierna (i Seattle, på vattnet, med en vy).

  • Implementera en sökupplevelse levereras med ett filterberoende:

    • Fasetterad navigering använder ett filter för att skicka tillbaka den fasetteringskategori som användaren har valt.
    • Geospatial sökning använder ett filter för att skicka koordinater för den aktuella platsen i "hitta nära mig"-appar och funktioner som matchar inom ett område eller efter avstånd.
    • Säkerhetsfilter skickar säkerhetsidentifierare som filtervillkor, där en matchning i indexet fungerar som en proxy för åtkomsträttigheter till dokumentet.
  • Gör en "nummersökning". Numeriska fält kan hämtas och kan visas i sökresultat, men de är inte sökbara (omfattas av fulltextsökning) individuellt. Om du behöver urvalskriterier baserat på numeriska data använder du ett filter.

Så här körs filter

Vid frågetillfället accepterar en filterparser villkor som indata, konverterar uttrycket till atomiska booleska uttryck som representeras som ett träd och utvärderar sedan filterträdet över filterbara fält i ett index.

Filtrering sker tillsammans med sökning, vilket kvalificerar vilka dokument som ska ingå i nedströmsbearbetning för dokumenthämtning och relevansbedömning. När filtret parkopplas med en söksträng minskar det effektivt återställningsuppsättningen för den efterföljande sökåtgärden. När det används ensamt (till exempel när frågesträngen är tom där search=*) är filtervillkoren den enda indatan.

Definiera filter

Filter är OData-uttryck, formulerade i filtersyntaxen som stöds av Azure AI Search.

Du kan ange ett filter för varje sökåtgärd , men själva filtret kan innehålla flera fält, flera villkor och om du använder en ismatch funktion, flera fulltextsökningsuttryck. I ett filteruttryck i flera delar kan du ange predikat i valfri ordning (med förbehåll för reglerna för operatorprioritet). Prestandan ökar inte märkbart om du försöker ordna om predikat i en viss sekvens.

En av gränserna för ett filteruttryck är den maximala storleksgränsen för begäran. Hela begäran, inklusive filtret, kan vara högst 16 MB för POST eller 8 KB för GET. Det finns också en gräns för antalet satser i filteruttrycket. En bra tumregel är att om du har hundratals satser riskerar du att överskrida gränsen. Vi rekommenderar att du utformar programmet på ett sådant sätt att det inte genererar filter av obundna storlekar.

Följande exempel representerar prototypiska filterdefinitioner i flera API:er.

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

Filtermönster

Följande exempel illustrerar flera användningsmönster för filterscenarier. Fler idéer finns i Exempel på OData-uttryckssyntax>.

  • Fristående $filter, utan en frågesträng, användbart när filteruttrycket kan kvalificera dokument av intresse fullt ut. Utan en frågesträng finns det ingen lexikal eller språklig analys, ingen bedömning och ingen rangordning. Observera att söksträngen bara är en asterisk, vilket betyder "matcha alla dokument".

    {
      "search": "*",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Honolulu"
    }
    
  • Kombination av frågesträng och $filter, där filtret skapar delmängden, och frågesträngen innehåller termen indata för fulltextsökning över den filtrerade delmängden. Tillägget av termer (vandringsteater) introducerar sökpoäng i resultaten, där dokument som bäst matchar villkoren rangordnas högre. Att använda ett filter med en frågesträng är det vanligaste användningsmönstret.

    {
      "search": "walking distance theaters",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Seattle'"
    }
    
    
  • Sammansatta frågor, avgränsade med "eller", var och en med sina egna filterkriterier (till exempel "beagles" i "dog" eller "siamese" i "cat"). Uttryck som kombineras med or utvärderas individuellt, med en union av dokument som matchar varje uttryck som skickas tillbaka i svaret. Det här användningsmönstret uppnås via search.ismatchscoring funktionen. Du kan också använda den icke-återkommande versionen, 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
    

    Det går också att kombinera fulltextsökning via search.ismatchscoring med filter som använder and i stället för or, men detta är funktionellt likvärdigt med att använda parametrarna search och $filter i en sökbegäran. Följande två frågor ger till exempel samma resultat:

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

Fältkrav för filtrering

I REST-API:et är filtreringsbar aktiverat som standard för enkla fält. Filterbara fält ökar indexstorleken. Se till att ange "filterable": false för fält som du inte planerar att använda i ett filter. Mer information om inställningar för fältdefinitioner finns i Skapa index.

I .NET SDK är det filterbara inaktiverat som standard. Du kan göra ett fält filterbart genom att ange egenskapen IsFilterable för motsvarande SearchField-objekt till true. I nästa exempel anges attributet på egenskapen för Rating en modellklass som mappar till indexdefinitionen.

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

Göra ett befintligt fält filterbart

Du kan inte ändra befintliga fält så att de kan filtreras. I stället måste du lägga till ett nytt fält eller återskapa indexet. Mer information om hur du återskapar ett index eller lagringsfält finns i Återskapa ett Azure AI Search-index.

Grunderna för textfilter

Textfilter matchar strängfält mot strängliteraler som du anger i filtret: $filter=Category eq 'Resort and Spa'

Till skillnad från fulltextsökning finns det ingen lexikal analys eller ordbrytning för textfilter, så jämförelser är endast för exakta matchningar. Anta till exempel att ett fält f innehåller "solig dag", $filter=f eq 'sunny' inte matchar, men $filter=f eq 'sunny day' kommer att göra det.

Textsträngar är skiftlägeskänsliga, vilket innebär att textfilter är skiftlägeskänsliga som standard. Till exempel $filter=f eq 'Sunny day' hittar inte "solig dag". Du kan dock använda en normaliserare för att göra det så att filtrering inte är skiftlägeskänsligt.

Metoder för filtrering av text

Metod beskrivning Används när
search.in En funktion som matchar ett fält mot en avgränsad lista med strängar. Rekommenderas för säkerhetsfilter och för alla filter där många råtextvärden måste matchas med ett strängfält. Funktionen search.in är utformad för hastighet och är mycket snabbare än att uttryckligen jämföra fältet med varje sträng med hjälp av eq och or.
search.ismatch En funktion som gör att du kan blanda fulltextsökningsåtgärder med strikt booleska filteråtgärder i samma filteruttryck. Använd search.ismatch (eller dess bedömningsmotsvarighet, search.ismatchscoring) när du vill ha flera kombinationer av sökfilter i en begäran. Du kan också använda det för ett contains-filter för att filtrera på en partiell sträng i en större sträng.
$filter=field operator string Ett användardefinierat uttryck som består av fält, operatorer och värden. Använd detta när du vill hitta exakta matchningar mellan ett strängfält och ett strängvärde.

Grunderna för numeriskt filter

Numeriska fält finns inte searchable i kontexten för fulltextsökning. Endast strängar är föremål för fulltextsökning. Om du till exempel anger 99,99 som sökterm får du inte tillbaka objekt som är prissatta till 99,99 USD. I stället skulle du se objekt som har numret 99 i strängfälten i dokumentet. Om du har numeriska data är antagandet att du använder dem för filter, inklusive intervall, fasetter, grupper och så vidare.

Dokument som innehåller numeriska fält (pris, storlek, SKU, ID) anger dessa värden i sökresultaten om fältet är markerat retrievable. Poängen här är att fulltextsökning i sig inte gäller för numeriska fälttyper.

Nästa steg

Prova först Sökutforskaren i portalen för att skicka frågor med $filter parametrar. Indexet för fastighetsexempel ger intressanta resultat för följande filtrerade frågor när du klistrar in dem i sökfältet:

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

Mer information om hur du arbetar med fler exempel finns i Syntaxexempel för OData-filteruttryck>.

Se även