Filter i nyckelordssökning
Ett filter innehåller värdebaserade kriterier för att inkludera eller exkludering av innehåll före frågekörning för nyckelordssökning, eller före eller efter frågekörning för vektorsökning. Filter tillämpas på icke-bevektorfält, men kan användas i vektorsökning om dokument innehåller icke-bevektorfält. För index som är ordnade kring segmenterat innehåll kan du till exempel ha fält på överordnad nivå eller metadatafält som kan filtreras.
I den här artikeln beskrivs filtrering för nyckelordssökning. Mer information om vektorer finns i Lägga till ett filter i en vektorfråga.
Ett filter anges med hjälp av syntax för OData-filteruttryck. Till skillnad från nyckelords- och vektorsökning lyckas ett filter endast om matchningen är exakt.
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.
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.
Filter gäller för alfanumeriskt innehåll på fält som tillskrivs som filterable
.
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=2024-07-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" }
};
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 viasearch.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änderand
i stället föror
, men detta är funktionellt likvärdigt med att använda parametrarnasearch
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
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 Azure SDK:er är filtreringsbar inaktiverad 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; }
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.
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.
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. |
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.
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>.