Exempel på "enkla" sökfrågor i Azure AI Search

I Azure AI Search anropar den enkla frågesyntaxen standardfrågeparsern för fulltextsökning. Parsern är snabb och hanterar vanliga scenarier, inklusive fulltextsökning, filtrerad och fasetterad sökning och prefixsökning. Den här artikeln använder exempel för att illustrera enkel syntaxanvändning i en REST API-begäran (Search Documents).

Kommentar

En alternativ frågesyntax är Full Lucene, som stöder mer komplexa frågestrukturer, till exempel fuzzy- och jokerteckensökning. Mer information och exempel finns i Använda den fullständiga Lucene-syntaxen.

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": "simple",
    "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å "enkel" är standardvärdet och kan utelämnas, men det ingår för att ytterligare förstärka att frågeexemplen i den här artikeln uttrycks i den enkla 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).

Fulltextsökning kan vara valfritt antal fristående termer eller citatteckenslutna fraser, med eller utan booleska operatorer.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "pool spa +airport",
    "searchMode": "any",
    "queryType": "simple",
    "select": "HotelId, HotelName, Category, Description",
    "count": true
}

En nyckelordssökning som består av viktiga termer eller fraser brukar fungera bäst. Strängfält genomgår textanalys under indexering och frågekörning och släpper icke-nödvändiga ord som "the", "and", "it". Om du vill se hur en frågesträng tokeniseras i indexet skickar du strängen i ett Analysera text-anrop till indexet.

Parametern "searchMode" styr precision och återkallande. Om du vill ha mer återkallande använder du standardvärdet "any", som returnerar ett resultat om någon del av frågesträngen matchas. Om du föredrar precision, där alla delar av strängen måste matchas, ändrar du searchMode till "all". Prova ovanstående fråga på båda sätten för att se hur searchMode ändrar resultatet.

Svaret för frågan "pool spa +airport" bör se ut ungefär som i följande exempel, trimmat för korthet.

"@odata.count": 6,
"value": [
    {
        "@search.score": 7.3617697,
        "HotelId": "21",
        "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.",
        "Category": "Resort and Spa",
        "Tags": [
            "pool",
            "continental breakfast",
            "free parking"
        ]
    },
    {
        "@search.score": 2.5560288,
        "HotelId": "25",
        "HotelName": "Scottish Inn",
        "Description": "Newly Redesigned Rooms & airport shuttle.  Minutes from the airport, enjoy lakeside amenities, a resort-style pool & stylish new guestrooms with Internet TVs.",
        "Category": "Luxury",
        "Tags": [
            "24-hour front desk service",
            "continental breakfast",
            "free wifi"
        ]
    },
    {
        "@search.score": 2.2988036,
        "HotelId": "35",
        "HotelName": "Suites At Bellevue Square",
        "Description": "Luxury at the mall.  Located across the street from the Light Rail to downtown.  Free shuttle to the mall and airport.",
        "Category": "Resort and Spa",
        "Tags": [
            "continental breakfast",
            "air conditioning",
            "24-hour front desk service"
        ]
    }
]

Observera sökpoängen i svaret. Det här är matchningens relevanspoäng. Som standard returnerar en söktjänst de 50 bästa matchningarna baserat på den här poängen.

Enhetliga poäng på "1.0" inträffar när det inte finns någon rangordning, antingen för att sökningen inte var fulltextsökning eller för att inga kriterier angavs. I en tom sökning (search=*) kommer rader till exempel tillbaka i godtycklig ordning. När du inkluderar faktiska kriterier ser du att sökpoängen utvecklas till meningsfulla värden.

Exempel 2: Slå upp efter ID

När du returnerar sökresultat i en fråga är ett logiskt nästa steg att ange en informationssida som innehåller fler fält från dokumentet. Det här exemplet visar hur du returnerar ett enskilt dokument med uppslagsdokument genom att skicka in dokument-ID:t.

GET /indexes/hotels-sample-index/docs/41?api-version=2023-11-01

Alla dokument har en unik identifierare. Om du använder portalen väljer du indexet på fliken Index och tittar sedan på fältdefinitionerna för att avgöra vilket fält som är nyckeln. Med REST returnerar Get Index-anropet indexdefinitionen i svarstexten.

Svaret för ovanstående fråga består av dokumentet vars nyckel är 41. Alla fält som har markerats som "hämtningsbara" i indexdefinitionen kan returneras i sökresultat och återges i din app.

{
    "HotelId": "41",
    "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.",
    "Description_fr": "L'hôtel front de mer surplombant la plage dispose de chambres avec balcon privé et 2 piscines intérieures et extérieures. Divers commerces et animations artistiques sont sur la promenade, à quelques pas.",
    "Category": "Budget",
    "Tags": [
        "pool",
        "air conditioning",
        "bar"
    ],
    "ParkingIncluded": true,
    "LastRenovationDate": "1951-05-10T00:00:00Z",
    "Rating": 3.5,
    "Location": {
        "type": "Point",
        "coordinates": [
            -157.846817,
            21.295841
        ],
        "crs": {
            "type": "name",
            "properties": {
                "name": "EPSG:4326"
            }
        }
    },
    "Address": {
        "StreetAddress": "1450 Ala Moana Blvd 2238 Ala Moana Ctr",
        "City": "Honolulu",
        "StateProvince": "HI",
        "PostalCode": "96814",
        "Country": "USA"
    }
}

Exempel 3: Filtrera på text

Filtersyntax är ett OData-uttryck som du kan använda själv eller med search. Används tillsammans, filter tillämpas först på hela indexet och sedan utförs sökningen på resultatet av filtret. Filter kan därför vara en användbar teknik för att förbättra frågeprestanda eftersom de begränsar uppsättningen dokument som sökfrågan behöver bearbeta.

Filter kan definieras i valfritt fält som markerats som filterable i indexdefinitionen. För hotell-sample-index innehåller filterbara fält fält kategori, taggar, parkeringinkluderad, klassificering och de flesta adressfält.

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "art tours",
    "queryType": "simple",
    "filter": "Category eq 'Resort and Spa'",
    "searchFields": "HotelName,Description,Category",
    "select": "HotelId,HotelName,Description,Category",
    "count": true
}

Svaret för ovanstående fråga gäller endast de hotell som kategoriseras som "Rapport och Spa" och som innehåller termerna "art" eller "tours". I det här fallet finns det bara en matchning.

{
    "@search.score": 2.8576312,
    "HotelId": "31",
    "HotelName": "Santa Fe Stay",
    "Description": "Nestled on six beautifully landscaped acres, located 2 blocks from the Plaza. Unwind at the spa and indulge in art tours on site.",
    "Category": "Resort and Spa"
}

Exempel 4: Filterfunktioner

Filteruttryck kan innehålla funktionerna "search.ismatch" och "search.ismatchscoring", så att du kan skapa en sökfråga i filtret. Det här filteruttrycket använder ett jokertecken gratis för att välja bekvämligheter, inklusive gratis wifi, gratis parkering och så vidare.

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
  {
    "search": "",
    "filter": "search.ismatch('free*', 'Tags', 'full', 'any')",
    "select": "HotelId, HotelName, Category, Description",
    "count": true
  }

Svar på ovanstående frågor matchar på 19 hotell som erbjuder gratis bekvämligheter. Observera att sökpoängen är en enhetlig "1,0" i resultatet. Det beror på att sökuttrycket är null eller tomt, vilket resulterar i ordagranna filtermatchningar, men ingen fulltextsökning. Relevanspoäng returneras endast vid fulltextsökning. Om du använder filter utan searchkontrollerar du att du har tillräckligt med sorterbara fält så att du kan styra sökrankningen.

"@odata.count": 19,
"value": [
    {
        "@search.score": 1.0,
        "HotelId": "31",
        "HotelName": "Santa Fe Stay",
        "Tags": [
            "view",
            "restaurant",
            "free parking"
        ]
    },
    {
        "@search.score": 1.0,
        "HotelId": "27",
        "HotelName": "Super Deluxe Inn & Suites",
        "Tags": [
            "bar",
            "free wifi"
        ]
    },
    {
        "@search.score": 1.0,
        "HotelId": "39",
        "HotelName": "Whitefish Lodge & Suites",
        "Tags": [
            "continental breakfast",
            "free parking",
            "free wifi"
        ]
    },
    {
        "@search.score": 1.0,
        "HotelId": "11",
        "HotelName": "Regal Orb Resort & Spa",
        "Tags": [
            "free wifi",
            "restaurant",
            "24-hour front desk service"
        ]
    },

Exempel 5: Intervallfilter

Intervallfiltrering stöds via filteruttryck för alla datatyper. Följande exempel illustrerar numeriska intervall och strängintervall. Datatyper är viktiga i intervallfilter och fungerar bäst när numeriska data finns i numeriska fält och strängdata i strängfält. Numeriska data i strängfält är inte lämpliga för intervall eftersom numeriska strängar inte är jämförbara.

Följande fråga är ett numeriskt intervall. I hotels-sample-index är det enda filterbara numeriska fältet Omdöme.

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "*",
    "filter": "Rating ge 2 and Rating lt 4",
    "select": "HotelId, HotelName, Rating",
    "orderby": "Rating desc",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som i följande exempel, trimmat för korthet.

"@odata.count": 27,
"value": [
    {
        "@search.score": 1.0,
        "HotelId": "22",
        "HotelName": "Stone Lion Inn",
        "Rating": 3.9
    },
    {
        "@search.score": 1.0,
        "HotelId": "25",
        "HotelName": "Scottish Inn",
        "Rating": 3.8
    },
    {
        "@search.score": 1.0,
        "HotelId": "2",
        "HotelName": "Twin Dome Motel",
        "Rating": 3.6
    }
...

Nästa fråga är ett intervallfilter över ett strängfält (Adress/TillståndProvince):

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "*",
    "filter": "Address/StateProvince ge 'A*' and Address/StateProvince lt 'D*'",
    "select": "HotelId, HotelName, Address/StateProvince",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som exemplet nedan, trimmat för korthet. I det här exemplet går det inte att sortera efter StateProvince eftersom fältet inte är "sorterbart" i indexdefinitionen.

"@odata.count": 9,
"value": [
    {
        "@search.score": 1.0,
        "HotelId": "9",
        "HotelName": "Smile Hotel",
        "Address": {
            "StateProvince": "CA "
        }
    },
    {
        "@search.score": 1.0,
        "HotelId": "39",
        "HotelName": "Whitefish Lodge & Suites",
        "Address": {
            "StateProvince": "CO"
        }
    },
    {
        "@search.score": 1.0,
        "HotelId": "7",
        "HotelName": "Countryside Resort",
        "Address": {
            "StateProvince": "CA "
        }
    },
...

Indexet hotels-sample innehåller ett platsfält med latitud- och longitudkoordinater. I det här exemplet används funktionen geo.distance som filtrerar dokument inom omkretsen av en startpunkt, ut till ett godtyckligt avstånd (i kilometer) som du anger. Du kan justera det sista värdet i frågan (10) för att minska eller förstora frågans yta.

POST /indexes/v/docs/search?api-version=2023-11-01
{
    "search": "*",
    "filter": "geo.distance(Location, geography'POINT(-122.335114 47.612839)') le 10",
    "select": "HotelId, HotelName, Address/City, Address/StateProvince",
    "count": true
}

Svaret för den här frågan returnerar alla hotell inom 10 kilometer från koordinaterna som tillhandahålls:

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 1.0,
            "HotelId": "45",
            "HotelName": "Arcadia Resort & Restaurant",
            "Address": {
                "City": "Seattle",
                "StateProvince": "WA"
            }
        },
        {
            "@search.score": 1.0,
            "HotelId": "24",
            "HotelName": "Gacc Capital",
            "Address": {
                "City": "Seattle",
                "StateProvince": "WA"
            }
        },
        {
            "@search.score": 1.0,
            "HotelId": "16",
            "HotelName": "Double Sanctuary Resort",
            "Address": {
                "City": "Seattle",
                "StateProvince": "WA"
            }
        }
    ]
}

Exempel 7: Booleska värden med searchMode

Enkel syntax stöder booleska operatorer i form av tecken (+, -, |) för att stödja AND-, OR- och NOT-frågelogik. Boolesk sökning fungerar som förväntat, med några anmärkningsvärda undantag.

I tidigare exempel introducerades parametern searchMode som en mekanism för att påverka precision och återkallande, med "searchMode": "any" gynnande träffsäkerhet (ett dokument som uppfyller något av kriterierna anses vara en matchning) och "searchMode=all" som gynnar precision (alla kriterier måste matchas i ett dokument).

I samband med en boolesk sökning kan standardvärdet "searchMode": "any" vara förvirrande om du staplar en fråga med flera operatorer och blir bredare i stället för smalare resultat. Detta gäller särskilt med NOT, där resultaten innehåller alla dokument som "inte innehåller" en viss term eller fras.

I följande exempel visas en bild. När du kör följande fråga med searchMode (alla) returneras 42 dokument: de som innehåller termen "restaurang", plus alla dokument som inte har frasen "luftkonditionering".

Observera att det inte finns något utrymme mellan den booleska operatorn (-) och frasen "luftkonditionering".

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "restaurant -\"air conditioning\"",
    "searchMode": "any",
    "searchFields": "Tags",
    "select": "HotelId, HotelName, Tags",
    "count": true
}

Om du ändrar till "searchMode": "all" framtvingar du en kumulativ effekt på kriterier och returnerar en mindre resultatuppsättning (7 matchningar) som består av dokument som innehåller termen "restaurang", minus de som innehåller frasen "luftkonditionering".

Svaret för den här frågan skulle nu se ut ungefär som i följande exempel, trimmat för korthet.

"@odata.count": 7,
"value": [
    {
        "@search.score": 2.5460577,
        "HotelId": "11",
        "HotelName": "Regal Orb Resort & Spa",
        "Tags": [
            "free wifi",
            "restaurant",
            "24-hour front desk service"
        ]
    },
    {
        "@search.score": 2.166792,
        "HotelId": "10",
        "HotelName": "Countryside Hotel",
        "Tags": [
            "24-hour front desk service",
            "coffee in lobby",
            "restaurant"
        ]
    },
...

Exempel 8: Växlingsresultat

I tidigare exempel har du lärt dig om parametrar som påverkar sökresultatets sammansättning, inklusive select som avgör vilka fält som finns i ett resultat, sorteringsordningar och hur du inkluderar antalet matchningar. Det här exemplet är en fortsättning på sökresultatets sammansättning i form av växlingsparametrar som gör att du kan batcha antalet resultat som visas på en viss sida.

Som standard returnerar en söktjänst de 50 bästa matchningarna. Om du vill kontrollera antalet matchningar på varje sida använder du top för att definiera batchens storlek och använder skip sedan för att hämta efterföljande batchar.

I följande exempel används ett filter och en sorteringsordning i fältet Klassificering (Klassificering är både filterbar och sorterbar) eftersom det är lättare att se effekterna av växling på sorterade resultat. I en vanlig fullständig sökfråga rangordnas och bläddras de översta matchningarna efter @search.score.

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "*",
    "filter": "Rating gt 4",
    "select": "HotelName, Rating",
    "orderby": "Rating desc",
    "top": "5",
    "count": true
}

Frågan hittar 21 matchande dokument, men eftersom du angav topreturnerar svaret bara de fem bästa matchningarna, med betyg som börjar på 4,9 och slutar på 4,7 med "Lady of the Lake B & B".

Om du vill hämta nästa 5 hoppar du över den första batchen:

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "*",
    "filter": "Rating gt 4",
    "select": "HotelName, Rating",
    "orderby": "Rating desc",
    "top": "5",
    "skip": "5",
    "count": true
}

Svaret för den andra batchen hoppar över de första fem matchningarna och returnerar nästa fem, med början "Pull'r Inn Motel". Om du vill fortsätta med fler batchar behåller top du 5 och ökar sedan med skip 5 för varje ny begäran (skip=5, skip=10, skip=15 och så vidare).

"value": [
    {
        "@search.score": 1.0,
        "HotelName": "Pull'r Inn Motel",
        "Rating": 4.7
    },
    {
        "@search.score": 1.0,
        "HotelName": "Sublime Cliff Hotel",
        "Rating": 4.6
    },
    {
        "@search.score": 1.0,
        "HotelName": "Antiquity Hotel",
        "Rating": 4.5
    },
    {
        "@search.score": 1.0,
        "HotelName": "Nordick's Motel",
        "Rating": 4.5
    },
    {
        "@search.score": 1.0,
        "HotelName": "Winter Panorama Resort",
        "Rating": 4.5
    }
]

Nästa steg

Nu när du har lite övning med den grundläggande frågesyntaxen kan du 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: