Lucene-frågesyntax i Azure AI Search

När du skapar frågor i Azure AI Search kan du välja den fullständiga Lucene Query Parser-syntaxen för specialiserade frågeformulär: jokertecken, fuzzy-sökning, närhetssökning, reguljära uttryck. En stor del av Lucene Query Parser-syntaxen implementeras intakt i Azure AI Search, förutom *intervallsökningar som konstrueras via $filter uttryck.

Om du vill använda fullständig Lucene-syntax anger du queryType till full och skickar ett frågeuttryck mönstrat för jokertecken, fuzzy-sökning eller något av de andra frågeformulär som stöds av den fullständiga syntaxen. I REST tillhandahålls frågeuttryck i parametern search för en REST API-begäran (Search Documents).

Exempel (fullständig syntax)

Följande exempel är en sökbegäran som skapats med hjälp av den fullständiga syntaxen. I det här exemplet visas sök- och termförstärkning i fält. Den söker efter hotell där kategorifältet innehåller termen budget. Alla dokument som innehåller frasen "recently renovated" rangordnas högre som ett resultat av termen boost-värde (3).

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
  "queryType": "full",
  "search": "category:budget AND \"recently renovated\"^3",
  "searchMode": "all"
}

Även om parametern inte är specifik för någon frågetyp är den searchMode relevant i det här exemplet. När operatorerna är på frågan bör du vanligtvis ange searchMode=all för att säkerställa att alla kriterier matchas.

Fler exempel finns i Exempel på Lucene-frågesyntax. Mer information om frågebegäran och parametrar, inklusive searchMode, finns i Sökdokument (REST API).

Grunderna i syntax

Följande syntaxgrunder gäller för alla frågor som använder Lucene-syntaxen.

Operatörsutvärdering i kontext

Placering avgör om en symbol tolkas som en operator eller bara ett annat tecken i en sträng.

I lucene-fullständig syntax används till exempel tilde (~) för både fuzzy-sökning och närhetssökning. När den placeras efter en citerad fras ~ anropas närhetssökning. När den placeras i slutet av en term ~ anropas fuzzy-sökning.

Inom en term, till exempel business~analyst, utvärderas inte tecknet som en operator. I det här fallet, förutsatt att frågan är en term eller frasfråga, tar fulltextsökning med lexikal analys bort ~ och bryter termen business~analyst i två: business ELLER analyst.

Exemplet ovan är tilde (~), men samma princip gäller för varje operator.

Undfly specialtecken

Om du vill använda någon av sökoperatorerna som en del av söktexten kan du undvika tecknet genom att prefixa det med ett enda omvänt snedstreck (\). För en jokerteckensökning på https://, där :// är en del av frågesträngen, anger search=https\:\/\/*du till exempel . På samma sätt kan ett undantaget telefonnummermönster se ut så här \+1 \(800\) 642\-7676.

Exempel på specialtecken som kräver undantag är följande:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \ /

Kommentar

Även om undantag håller ihop tokens kan lexikal analys under indexeringen ta bort dem. Lucene-standardanalysatorn bryter till exempel ord på bindestreck, blanksteg och andra tecken. Om du behöver specialtecken i frågesträngen kan du behöva en analysator som bevarar dem i indexet. Vissa alternativ inkluderar Microsofts analysverktyg för naturligt språk, som bevarar bindestreckade ord, eller en anpassad analysator för mer komplexa mönster. Mer information finns i Partiella termer, mönster och specialtecken.

Koda osäkra och reserverade tecken i URL:er

Se till att alla osäkra och reserverade tecken kodas i en URL. Är till exempel # ett osäkert tecken eftersom det är en fragment-/fästpunktsidentifierare i en URL. Tecknet måste kodas till %23 om det används i en URL. & och = är exempel på reserverade tecken eftersom de avgränsar parametrar och anger värden i Azure AI Search. Mer information finns i RFC1738: Uniform Resource Locators (URL).

Osäkra tecken är " ` < > # % { } | \ ^ ~ [ ]. Reserverade tecken är ; / ? : @ = + &.

Booleska operatorer

Du kan bädda in booleska operatorer i en frågesträng för att förbättra precisionen för en matchning. Den fullständiga syntaxen stöder textoperatorer utöver teckenoperatorer. Ange alltid text booleska operatorer (AND, OR, NOT) i alla versaler.

Textoperator Tecken Exempel Användning
OCH + wifi AND luxury Anger termer som en matchning måste innehålla. I exemplet söker frågemotorn efter dokument som innehåller både wifi och luxury. Plustecknet (+) kan också användas direkt framför en term för att göra det nödvändigt. Stipulerar till exempel +wifi +luxury att båda termerna måste visas någonstans i fältet i ett enda dokument.
ELLER (ingen) 1 wifi OR luxury Hittar en matchning när någon av termerna hittas. I exemplet returnerar frågemotorn matchning på dokument som innehåller antingen wifi eller luxury båda. Eftersom OR är standardkonjunktionsoperatorn kan du också utelämna den, vilket wifi luxury motsvarar wifi OR luxury.
NOT !, - wifi –luxury Returnerar en matchning för dokument som exkluderar termen. Söker till exempel wifi –luxury efter dokument som har wifi termen men inte luxury.

1 Tecknet | stöds inte för OR-åtgärder.

INTE boolesk operator

Viktigt!

OPERATORN NOT (NOT, !, eller -) beter sig annorlunda i fullständig syntax än i enkel syntax.

  • I enkel syntax har frågor med negation alltid ett jokertecken som läggs till automatiskt. Frågan -luxury expanderas till exempel automatiskt till -luxury *.
  • I fullständig syntax kan frågor med negation inte kombineras med ett jokertecken. Till exempel tillåts -luxury * inte frågorna.
  • I fullständig syntax tillåts inte frågor med en enda negation. Frågan -luxury är till exempel inte tillåten.
  • Med fullständig syntax beter sig negationer som om de alltid andeds på frågan oavsett sökläge.
    • Till exempel hämtar den fullständiga syntaxfrågan wifi -luxury i fullständig syntax endast dokument som innehåller termen wifioch tillämpar sedan negationen -luxury på dessa dokument.
  • Om du vill använda negationer för att söka efter alla dokument i indexet rekommenderas enkel syntax med any sökläget.
  • Om du vill använda negationer för att söka över en delmängd dokument i indexet rekommenderas fullständig syntax eller enkel syntax med alla söklägen.
Frågetyp Sökläge Exempelfråga Funktionssätt
Enkel någon wifi -luxury Returnerar alla dokument i indexet. Dokument med termen "wifi" eller dokument som saknar termen "lyx" rangordnas högre än andra dokument. Frågan expanderas till wifi OR -luxury OR *.
Enkel alla wifi -luxury Returnerar endast dokument i indexet som innehåller termen "wifi" och innehåller inte termen "lyx". Frågan expanderas till wifi AND -luxury AND *.
Fullständig någon wifi -luxury Returnerar endast dokument i indexet som innehåller termen "wifi" och sedan tas dokument som innehåller termen "lyx" bort från resultaten.
Fullständig alla wifi -luxury Returnerar endast dokument i indexet som innehåller termen "wifi" och sedan tas dokument som innehåller termen "lyx" bort från resultaten.

Fältsökning

Du kan definiera en fältsökningsåtgärd med syntaxen fieldName:searchExpression , där sökuttrycket kan vara ett enda ord eller en fras, eller ett mer komplext uttryck inom parenteser, eventuellt med booleska operatorer. Några exempel är följande:

  • genre:jazz NOT history

  • artists:("Miles Davis" "John Coltrane")

Se till att placera flera strängar inom citattecken om du vill att båda strängarna ska utvärderas som en enda entitet, i det här fallet söker du efter två distinkta konstnärer i fältet artists .

Fältet som anges i fieldName:searchExpression måste vara ett searchable fält. Mer information om hur indexattribut används i fältdefinitioner finns i Skapa index .

Kommentar

När du använder fältsökuttryck behöver du inte använda parametern searchFields eftersom varje fältsökuttryck uttryckligen har ett fältnamn angivet. Du kan dock fortfarande använda parametern searchFields om du vill köra en fråga där vissa delar är begränsade till ett visst fält och resten kan gälla för flera fält. Frågan search=genre:jazz NOT history&searchFields=description skulle till exempel endast matcha jazz fältet genre , medan det skulle matcha NOT history med fältet description . Fältnamnet som anges i fieldName:searchExpression har alltid företräde framför parametern searchFields , vilket är anledningen till att vi i det här exemplet inte behöver inkludera genre i parametern searchFields .

Fuzzy-sökning

En fuzzy-sökning hittar matchningar i termer som har en liknande konstruktion och expanderar en term upp till högst 50 termer som uppfyller avståndskriterierna för två eller mindre. Mer information finns i Fuzzy-sökning.

Om du vill göra en fuzzy-sökning använder du tilde-symbolen ~ i slutet av ett enda ord med en valfri parameter, ett tal mellan 0 och 2 (standard), som anger redigeringsavståndet. Till exempel, blue~ eller blue~1 skulle returnera blue, bluesoch glue.

Fuzzy-sökning kan endast tillämpas på termer, inte citattecken, men du kan lägga till tilde till varje term individuellt i ett namn eller en fras i flera delar. Skulle till exempel Unviersty~ of~ Wshington~ matcha på University of Washington.

Närhetssökning

Närhetssökningar används för att hitta termer som ligger nära varandra i ett dokument. Infoga en tilde-symbol ~ i slutet av en fras följt av antalet ord som skapar närhetsgränsen. Hittar till exempel "hotel airport"~5 termerna hotel och airport inom fem ord från varandra i ett dokument.

Termförbättring

Termhöjning syftar på att rangordna ett dokument högre om det innehåller den förbättrade termen i förhållande till dokument som inte innehåller termen. Detta skiljer sig från bedömningsprofiler i det att bedömningsprofiler ökar vissa fält snarare än specifika termer.

I följande exempel illustreras skillnaderna. Anta att det finns en poängprofil som ökar matchningarna i ett visst fält, till exempel genren i exemplet musicstoreindex. Termhöjning kan användas för att ytterligare öka vissa söktermer högre än andra. Till exempel rock^2 electronic ökar dokument som innehåller söktermer i genrefältet högre än andra sökbara fält i indexet. Dessutom rangordnas dokument som innehåller söktermstenen högre än den andra söktermen elektroniskt som ett resultat av termen boost-värde (2).

Om du vill öka en term använder du caret, ^, symbolen med en boostfaktor (ett tal) i slutet av den term som du söker efter. Du kan också öka fraser. Ju högre boostfaktor, desto mer relevant är termen i förhållande till andra söktermer. Standardpuffvärdet är 1. Även om boostfaktorn måste vara positiv kan den vara mindre än 1 (till exempel 0,20).

Sökning efter reguljära uttryck

En sökning med reguljära uttryck hittar en matchning baserat på mönster som är giltiga under Apache Lucene, enligt beskrivningen i klassen RegExp. I Azure AI Search omges ett reguljärt uttryck mellan snedstreck /.

Om du till exempel vill hitta dokument som innehåller motel eller hotelanger du /[mh]otel/. Reguljära uttryckssökningar matchas mot enkla ord.

Vissa verktyg och språk ställer extra krav på escape-tecken utöver de escape-regler som införts av Azure AI Search. För JSON är strängar som innehåller ett snedstreck undantagna med ett bakåtsnedstreck: microsoft.com/azure/ blir search=/.*microsoft.com\/azure\/.*/ där search=/.* <string-placeholder>.*/ konfigurerar det reguljära uttrycket och microsoft.com\/azure\/ är strängen med ett undantaget snedstreck.

Två vanliga symboler i regex-frågor är . och *. En . matchar ett tecken och ett * matchar det tidigare tecknet noll eller flera gånger. Till exempel /be./ matchar villkoren bee och bet medan /be*/ skulle matcha be, beeoch beee men inte bet. .* Tillsammans kan du matcha alla teckenserier så /be.*/ att de matchar alla termer som börjar medbe, bettertill exempel .

Om du får syntaxfel i ditt reguljära uttryck granskar du escape-reglerna för specialtecken. Du kan också prova en annan klient för att bekräfta om problemet är verktygsspecifikt.

Jokerteckensökning

Du kan använda allmänt erkänd syntax för flera (*) eller enstaka (?) jokerteckensökningar. Fullständig Lucene-syntax stöder prefix, infix och suffixmatchning.

Observera att Lucene-frågeparsern stöder användningen av dessa symboler med en enda term och inte en fras.

Affixtyp Beskrivning och exempel
Prefix Termfragmentet kommer före * eller ?. Till exempel ett frågeuttryck för search=alpha* returer alphanumeric eller alphabetical. Prefixmatchning stöds i både enkel och fullständig syntax.
Suffix Termfragmentet kommer efter * eller ?, med ett snedstreck för att avgränsa konstruktionen. Returnerar search=/.*numeric/alphanumerictill exempel .
Infix Termfragment omsluter * eller ?. Returnerar non-numerical till exempel search=non*al och nonsensical.

Du kan kombinera operatorer i ett uttryck. Matchar till exempel 980?2*98072-1222 och 98052-1234, där ? matchar på ett enda (obligatoriskt) tecken och * matchar tecken med en godtycklig längd som följer.

Suffixmatchning kräver snedstrecksavgränsare / för reguljära uttryck. I allmänhet kan du inte använda en * eller ? en symbol som det första tecknet i en term, utan /. Det är också viktigt att observera att * beter sig annorlunda när det används utanför regex-frågor. Utanför regex-snedstreckslimiten /* är det ett jokertecken och matchar alla serier av tecken ungefär som .* i regex. Till exempel search=/non.*al/ genererar samma resultatuppsättning som search=non*al.

Kommentar

Som regel är mönstermatchning långsam, så du kanske vill utforska alternativa metoder, till exempel tokenisering med gränsen n-gram som skapar token för sekvenser av tecken i en term. Med n-gram-tokenisering blir indexet större, men frågor kan köras snabbare, beroende på mönsterkonstruktionen och längden på strängar som du indexerar. Mer information finns i Partiell termsökning och mönster med specialtecken.

Effekten av en analysator på jokerteckenfrågor

Under frågeparsning skickas frågor som är formulerade som prefix, suffix, jokertecken eller reguljära uttryck till frågeträdet och kringgår lexikal analys. Matchningar hittas bara om indexet innehåller strängarna i det format som din fråga anger. I de flesta fall behöver du en analysator under indexeringen som bevarar strängintegriteten så att partiell term- och mönstermatchning lyckas. Mer information finns i Partiell termsökning i Azure AI Search-frågor.

Överväg en situation där du kanske vill att sökfrågan terminal* ska returnera resultat som innehåller termer som terminate, terminationoch terminates.

Om du skulle använda analysatorn en.lucene (engelska Lucene) skulle den tillämpa aggressiv härstamning av varje term. Till exempel terminatetermination, , terminates kommer alla att tokeniseras ned till token termi i ditt index. Å andra sidan analyseras inte termer i frågor med jokertecken eller fuzzy-sökning alls, så det skulle inte finnas några resultat som skulle matcha terminat* frågan.

På andra sidan är Microsoft-analysverktygen (i det här fallet en.microsoft analyzer) lite mer avancerade och använder lemmatisering i stället för att härstamma. Det innebär att alla genererade token ska vara giltiga engelska ord. Till exempel terminate, terminates, och termination förblir mestadels hel i indexet, och skulle vara ett bättre val för scenarier som är mycket beroende av jokertecken och fuzzy-sökning.

Bedömning av jokertecken- och regex-frågor

Azure AI Search använder frekvensbaserad bedömning (BM25) för textfrågor. För jokertecken- och regex-frågor där termernas omfattning potentiellt kan vara bred ignoreras dock frekvensfaktorn för att förhindra att rangordningen förekommer mot matchningar från mer sällsynta termer. Alla matchningar behandlas lika för jokertecken- och regex-sökningar.

Specialtecken

I vissa fall kanske du vill söka efter ett specialtecken, till exempel en emoji ❤ eller tecknet €. I sådana fall ska du se till att analysatorn du använder inte filtrerar bort dessa tecken. Standardanalysatorn kringgår många specialtecken, exklusive dem från ditt index.

Analysverktyg som tokeniserar specialtecken inkluderar whitespace-analysatorn, som tar hänsyn till alla teckensekvenser avgränsade med blanksteg som token (så strängen skulle betraktas som en token). Dessutom skulle en språkanalysator som Microsoft English Analyzer ("en.microsoft"), ta strängen "€" som en token. Du kan testa en analysator för att se vilka token den genererar för en viss fråga.

När du använder Unicode-tecken kontrollerar du att symbolerna är korrekt undantagna i fråge-URL:en (till exempel använder escape-sekvensen %E2%9D%A4+). Vissa REST-klienter utför den här översättningen automatiskt.

Prioritet (gruppering)

Du kan använda parenteser för att skapa underfrågor, inklusive operatorer i den parentesiska instruktionen. Söker till exempel motel+(wifi|luxury) efter dokument som innehåller motel termen och antingen wifi eller luxury (eller båda).

Fältgruppering liknar men omfångsbegränsar gruppering till ett enda fält. Till exempel hotelAmenities:(gym+(wifi|pool)) söker fältet hotelAmenities efter gym och wifi, eller gym och pool.

Begränsningar för frågestorlek

Azure AI Search begränsar frågestorleken och kompositionen eftersom obundna frågor kan destabilisera söktjänsten. Det finns gränser för frågestorlek och sammansättning (antalet satser). Det finns också gränser för längden på prefixsökningen och för komplexiteten i regex-sökning och jokerteckensökning. Om ditt program genererar sökfrågor programmatiskt rekommenderar vi att du utformar det på ett sådant sätt att det inte genererar frågor av obundna storlekar.

Mer information om frågegränser finns i API-begärandebegränsningar.

Se även