Exempel på "fullständig" Lucene-söksyntax (avancerade frågor i Azure AI Search)

När du skapar frågor för Azure AI Search kan du ersätta den enkla standardfrågeparsernmed den kraftfullare Lucene-frågeparsern för att formulera specialiserade och avancerade frågeuttryck.

Lucene-parsern stöder komplexa frågeformat, till exempel fältomfattande frågor, fuzzy-sökning, infix- och suffixsökning med jokertecken, närhetssökning, termförstärkning och sökning med reguljära uttryck. Den extra kraften medför fler bearbetningskrav, så du bör förvänta dig en något längre körningstid. I den här artikeln kan du gå igenom exempel som visar frågeåtgärder baserat på fullständig syntax.

Kommentar

Många av de specialiserade frågekonstruktioner som är aktiverade via den fullständiga Lucene-frågesyntaxen är inte textanalyserade, vilket kan vara förvånande om du förväntar dig härdning eller lemmatisering. Lexikal analys utförs endast på fullständiga termer (en termfråga eller frasfråga). Frågetyper med ofullständiga termer (prefixfråga, jokerteckenfråga, regex-fråga, fuzzy-fråga) läggs till direkt i frågeträdet och kringgår analyssteget. Den enda transformering som utförs på partiella frågetermer är lägre.

Hotell exempelindex

Följande frågor baseras på hotels-sample-index, som du kan skapa genom att följa anvisningarna i den här snabbstarten.

Exempelfrågor formuleras med hjälp av REST API- och POST-begäranden. Du kan klistra in och köra dem i en REST-klient. Du kan också använda JSON-vyn för Search Explorer i Azure-portalen. I JSON-vyn kan du klistra in de frågeexempel som visas här i den här artikeln.

Begärandehuvuden måste ha följande värden:

Tangent Värde
Innehållstyp application/json
api-key <your-search-service-api-key>, antingen fråga eller administratörsnyckel

URI-parametrar måste innehålla din slutpunkt för söktjänsten med indexnamnet, dokumentsamlingarna, sökkommandot och API-versionen, ungefär som i följande exempel:

https://{{service-name}}.search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2023-11-01

Begärandetexten ska skapas som giltig JSON:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • "search" som anges till * är en ospecificerad fråga som motsvarar null- eller tom sökning. Det är inte särskilt användbart, men det är den enklaste sökningen du kan göra, och den visar alla hämtningsbara fält i indexet, med alla värden.

  • "queryType" inställd på "full" anropar den fullständiga Lucene-frågeparsern och den krävs för den här syntaxen.

  • "select" inställd på en kommaavgränsad lista med fält används för sökresultatsammansättning, inklusive bara de fält som är användbara i samband med sökresultat.

  • "count" returnerar antalet dokument som matchar sökvillkoren. I en tom söksträng är antalet alla dokument i indexet (50 i hotels-sample-index).

Fältindelade sökomfångsspecifika, inbäddade sökuttryck i ett visst fält. Det här exemplet söker efter hotellnamn med termen "hotell" i dem, men inte "motell". Du kan ange flera fält med hjälp av AND.

När du använder den här frågesyntaxen kan du utelämna parametern searchFields när fälten som du vill fråga finns i själva sökuttrycket. Om du inkluderar searchFields med fältsökning fieldName:searchExpression har alltid företräde framför searchFields.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:(hotel NOT motel) AND Category:'Resort and Spa'",
    "queryType": "full",
    "select": "HotelName, Category",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som i följande exempel, filtrerat på "Resort and Spa", som returnerar hotell som innehåller "hotell" i namnet, samtidigt som resultat som innehåller "motell" i namnet exkluderas.

"@odata.count": 4,
"value": [
    {
        "@search.score": 4.481559,
        "HotelName": "Nova Hotel & Spa",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.4524608,
        "HotelName": "King's Palace Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.3970203,
        "HotelName": "Triple Landscape Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.2953436,
        "HotelName": "Peaceful Market Hotel & Spa",
        "Category": "Resort and Spa"
    }
]

Sökuttrycket kan vara en enda term eller en fras, eller ett mer komplext uttryck inom parenteser, eventuellt med booleska operatorer. Några exempel är följande:

  • HotelName:(hotel NOT motel)
  • Address/StateProvince:("WA" OR "CA")
  • Tags:("free wifi" NOT "free parking") AND "coffee in lobby"

Se till att placera en fras inom citattecken om du vill att båda strängarna ska utvärderas som en enda entitet, som i det här fallet söker efter två distinkta platser i fältet Adress/TillståndProvince. Beroende på klienten kan du behöva undvika (\) citattecknen.

Fältet som anges i fieldName:searchExpression måste vara ett sökbart fält. Mer information om hur fältdefinitioner tillskrivs finns i Skapa index (REST API ).

Fuzzy-sökning matchar på liknande termer, inklusive felstavade ord. Om du vill göra en fuzzy-sökning lägger du till tilde-symbolen ~ i slutet av ett enda ord med en valfri parameter, ett värde mellan 0 och 2, som anger redigeringsavståndet. Till exempel, blue~ eller blue~1 skulle returnera blått, blått och lim.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "Tags:conserge~",
    "queryType": "full",
    "select": "HotelName, Category, Tags",
    "searchFields": "HotelName, Category, Tags",
    "count": true
}

Svaret för den här frågan matchar "concierge" i matchande dokument, trimmade för korthet:

"@odata.count": 12,
"value": [
    {
        "@search.score": 1.1832147,
        "HotelName": "Secret Point Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "air conditioning",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1819803,
        "HotelName": "Twin Dome Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "free wifi",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1773309,
        "HotelName": "Smile Hotel",
        "Category": "Suite",
        "Tags": [
            "view",
            "concierge",
            "laundry service"
        ]
    },

Fraser stöds inte direkt, men du kan ange en fuzzy-matchning för varje term i en fras i flera delar, till exempel search=Tags:landy~ AND sevic~. Det här frågeuttrycket hittar 15 matchningar på "tvätttjänst".

Kommentar

Fuzzy-frågor analyseras inte. Frågetyper med ofullständiga termer (prefixfråga, jokerteckenfråga, regex-fråga, fuzzy-fråga) läggs till direkt i frågeträdet och kringgår analyssteget. Den enda transformering som utförs på partiella frågetermer är lägre hölje.

Närhetssökning hittar 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.

Den här frågan söker efter termerna "hotel" och "airport" inom 5 ord från varandra i ett dokument. Citattecknen är undantagna (\") för att bevara frasen:

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "Description: \"hotel airport\"~5",
    "queryType": "full",
    "select": "HotelName, Description",
    "searchFields": "HotelName, Description",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som i följande exempel:

"@odata.count": 2,
"value": [
    {
        "@search.score": 0.6331726,
        "HotelName": "Trails End Motel",
        "Description": "Only 8 miles from Downtown.  On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, All non-smoking hotel. Only 15 miles from airport."
    },
    {
        "@search.score": 0.43032226,
        "HotelName": "Catfish Creek Fishing Cabins",
        "Description": "Brand new mattresses and pillows.  Free airport shuttle. Great hotel for your business needs. Comp WIFI, atrium lounge & restaurant, 1 mile from light rail."
    }
]

Exempel 4: Termstärning

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. 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. Standardvärdet för boostfaktorn är 1, och även om det måste vara positivt kan det vara mindre än 1 (till exempel 0,2). Termhöjning skiljer sig från bedömningsprofiler i och med att bedömningsprofiler ökar vissa fält snarare än specifika termer.

I den här "före"-frågan söker du efter "strandåtkomst" och märker att det finns sju dokument som matchar på en eller båda termerna.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "beach access",
    "queryType": "full",
    "select": "HotelName, Description, Tags",
    "searchFields": "HotelName, Description, Tags",
    "count": true
}

Faktum är att det bara finns ett dokument som matchar "åtkomst", och eftersom det är den enda matchningen är placeringen hög (andra positionen) även om dokumentet saknar termen "beach".

"@odata.count": 7,
"value": [
    {
        "@search.score": 2.2723424,
        "HotelName": "Nova Hotel & Spa",
        "Description": "1 Mile from the airport.  Free WiFi, Outdoor Pool, Complimentary Airport Shuttle, 6 miles from the beach & 10 miles from downtown."
    },
    {
        "@search.score": 1.5507699,
        "HotelName": "Old Carrabelle Hotel",
        "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center."
    },
    {
        "@search.score": 1.5358944,
        "HotelName": "Whitefish Lodge & Suites",
        "Description": "Located on in the heart of the forest. Enjoy Warm Weather, Beach Club Services, Natural Hot Springs, Airport Shuttle."
    },
    {
        "@search.score": 1.3433652,
        "HotelName": "Ocean Air Motel",
        "Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Various shops and art entertainment are on the boardwalk, just steps away."
    },

I frågan "efter" upprepar du sökningen, den här gången ökar resultatet med termen "strand" över termen "åtkomst". En läsbar version av frågan är search=Description:beach^2 access. Beroende på din klient kan du behöva uttrycka ^2 som %5E2.

Efter att ha ökat termen "beach" flyttas matchen på Old Carrabelle Hotel ner till sjätte plats.

Exempel 5: Regex

En sökning med reguljära uttryck hittar en matchning baserat på innehållet mellan snedstrecken "/", enligt beskrivningen i klassen RegExp.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:/(Mo|Ho)tel/",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som i följande exempel:

    "@odata.count": 22,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Days Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Triple Landscape Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Smile Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Pelham Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Sublime Cliff Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Twin Dome Motel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Nova Hotel & Spa"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },

Kommentar

Regex-frågor analyseras inte. Den enda transformering som utförs på partiella frågetermer är lägre hölje.

Du kan använda allmänt erkänd syntax för flera (*) eller enstaka (?) jokerteckensökningar. Observera att Lucene-frågeparsern stöder användningen av dessa symboler med en enda term och inte en fras.

I den här frågan söker du efter hotellnamn som innehåller prefixet "sc". Du kan inte använda en * eller ? en symbol som det första tecknet i en sökning.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:sc*",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som i följande exempel:

    "@odata.count": 2,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scottish Inn"
        }
    ]

Kommentar

Jokerteckenfrågor analyseras inte. Den enda transformering som utförs på partiella frågetermer är lägre hölje.

Nästa steg

Prova att ange frågor i kod. Följande länk beskriver hur du konfigurerar sökfrågor med hjälp av Azure SDK:er.

Mer syntaxreferens, frågearkitektur och exempel finns i följande länkar: