Använd den fullständiga Söksyntaxen för Lucene (avancerade frågor i Azure Kognitiv sökning)

När du konstruerar frågor för Azure Kognitiv sökning kan du ersätta den enkla standard fråge parsern med den mer kraftfulla Lucene-frågedesignern för att formulera specialiserade och avancerade frågeuttryck.

Lucene-parsern stöder komplexa frågeinställningar, till exempel frågor som kallas för fält, fuzzy search, infix och suffix med jokertecken, närhets sökning, term förstärkning och sökning efter reguljära uttryck. Den extra kraften ger ytterligare bearbetnings krav så att du kan förvänta dig en något längre körnings tid. I den här artikeln kan du gå igenom exempel som demonstrerar frågor som baseras på fullständig syntax.

Anteckning

Många av de specialiserade fråge konstruktioner som aktive ras med fullständig Lucene-frågesyntax är inte text-analyserad, vilket kan vara överraskande om du förväntar dig eller lemmatisering. Lexikalisk analys utförs endast på fullständiga villkor (en term fråga eller en fras fråga). Frågetyper med ofullständiga termer (prefixlängd, jokertecken, regex-fråga, fuzzy-fråga) läggs direkt till i frågans träd, vilket kringgår analys steget. Den enda omvandlingen som utförs på ofullständiga sökord är lowercasing.

Exempel index för hotell

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

Exempel frågor har ledas med REST API-och POST-förfrågningar. Du kan klistra in och köra dem i Postman eller i Visual Studio Code med kognitiv sökning-tillägget.

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

Tangent Värde
Content-Type application/json
API-nyckel <your-search-service-api-key>, antingen fråga eller administratörs nyckel

URI-parametrarna måste innehålla din Sök tjänst slut punkt med index namn, dokument samlingar, sökkommando och API-version, som liknar följande exempel:

https://{{service-name}}.search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2020-06-30

Brödtext för begäran ska skapas som giltig JSON:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • "Sök" inställt på * ä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 det visar alla hämtnings bara fält i indexet, med alla värden.

  • med "queryType" inställt på "fullständig" anropas fullständig Lucene-fråga parser och det krävs för den här syntaxen.

  • Välj en kommaavgränsad lista med fält som används för Sök Resultat sammansättning, inklusive bara de fält som är användbara i Sök resultat.

  • "count" returnerar antalet dokument som matchar Sök kriterierna. I en tom Sök sträng är antalet dokument i indexet (50 om det rör sig om Hotels-Sample-index).

Fält Sök omfång, enskilda, inbäddade Sök uttryck till ett visst fält. Det här exemplet söker efter hotell namn med termen "hotell" i dem, men inte "Motel". Du kan ange flera fält med hjälp av och.

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 är i själva Sök uttrycket. Om du inkluderar "searchFields" med fälts ökning har fieldName:searchExpression alltid företräde framför "searchFields".

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

Svar för den här frågan bör se ut ungefär som i följande exempel, filtrerat på "utväg och Spa", som returnerar hotell som inkluderar "hotell" eller "Motel" i namnet.

"@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ök uttrycket kan vara en term eller en fras, eller ett mer komplext uttryck inom parentes, 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 citat tecken 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å olika platser i fältet Adress/StateProvince. Beroende på klienten kan du behöva Escape ( \ ) citat tecken.

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

Suddiga Sök matchningar på liknande villkor, inklusive felstavade ord. Om du vill göra en Fuzzy-sökning lägger du till Tilde- ~ symbolen i slutet av ett enstaka ord med en valfri parameter, ett värde mellan 0 och 2, som anger redigerings avståndet. Till exempel blue~ eller blue~1 skulle returnera blå, blå och limma.

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

Svar för den här frågan matchar "Concierge" i matchande dokument, trimmade för det kortfattat:

"@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 på varje term i en sats med flera delar, till exempel search=Tags:landy~ AND sevic~ . Det här frågeuttrycket hittar 15 matchningar på "tvätt tjänst".

Anteckning

Fuzzy-frågor analyserasinte. Frågetyper med ofullständiga termer (prefixlängd, jokertecken, regex-fråga, fuzzy-fråga) läggs direkt till i frågans träd, vilket kringgår analys steget. Den enda omvandlingen som utförs på partiella sökord är mindre Skift läge.

Närhets sökningen hittar termer som är nära varandra i ett dokument. Infoga en tilde ~-symbol i slutet av en fras följt av antalet ord som skapar närhets kanten.

Den här frågan söker efter termerna "hotell" och "flyg plats" inom 5 ord för varandra i ett dokument. Citat tecknen är undantagna ( \" ) för att bevara frasen:

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

Svar 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: term förstärkning

Term förstärkning syftar på att rangordna ett dokument högre om det innehåller den ökade perioden, i förhållande till dokument som inte innehåller termen. Om du vill förstärka en term använder du cirkumflex, ^ symbol med en förstärknings faktor (ett tal) i slutet av den period som du söker. Standardvärdet för förstärknings faktorn är 1 och det måste vara positivt, men det kan vara mindre än 1 (till exempel 0,2). Term förstärkning skiljer sig från bedömnings profiler i dessa bedömnings profiler ökar vissa fält i stället för specifika villkor.

I den här frågan söker du efter "strand Access" och ser att det finns sju dokument som matchar på en eller båda villkoren.

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

I själva verket finns det bara ett dokument som matchar "Access" och eftersom det är den enda matchningen är dess placering hög (andra placeringen) även om dokumentet saknar termen "strand".

"@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 tiden ökar resultatet med termen "strand" över termen "Access". En mänsklig 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 förbättrat termen "strand" går matchningen på det gamla Carrabelle hotellet nedåt till den sjätte platsen.

Exempel 5: regex

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

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

Svar 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"
        },

Anteckning

Regex-frågor analyserasinte. Den enda omvandlingen som utförs på partiella sökord är mindre Skift läge.

Du kan använda allmänt identifierad syntax för jokertecken för flera ( * ) eller enkla ( ? )-Character-sökningar. Observera att funktionen Lucene Query parser 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 hotell namn som innehåller prefixet "SC". Du kan inte använda en * eller- ? symbol som det första tecknet i en sökning.

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

Svar 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"
        }
    ]

Anteckning

Jokertecken har inte analyserATS. Den enda omvandlingen som utförs på partiella sökord är mindre Skift läge.

Nästa steg

Försök att ange frågor i kod. Följande länkar förklarar hur du ställer in Sök frågor med hjälp av Azure SDK: er.

Ytterligare syntax-referens, fråga arkitektur och exempel finns i följande länkar: